乐趣区

关于selenium:selenium-定位方式4xpath

Selenium 提供的另一种,可能惟一定位的形式:

  • find_element_by_xpath

XPath 基础知识

XPath (XML Path Language) 是由国际标准化组织 W3C 指定的,用来在 XML 和 HTML 文档中抉择节点的语言。

XPath 学习链接

目前支流浏览器 (Chrome,Firefox,Edge,Safari) 都反对 XPath 语法。

XPath 绝对于 css 选择器的劣势:

  • 有些场景应用 css 定位元素很麻烦,而 XPath 却比拟不便
  • XPath 还有其余畛域会应用到,比方爬虫框架 Scrapy,手机 APP 框架 Appium

    XPath 语法中,整个 HTML 代码的根节点,应用 / 示意,这第一点跟 Linux 有相似之处。

定位根节点下的 html 节点:/html

定位根节点下 body 节点下的 form 节点:/html/body/form

通过下面两个简略的例子可发现,XPath 中的 /css 选择器中的 > 性能类似,都示意间接子节点关系

依据绝对路径定位元素

示意从 XPath 根节点 / 开始,始终通过查找子元素的形式,定位到指定的元素,就是绝对路径。

理论利用

在上图中,定位百度首页的搜寻输入框,通过 /html/body/div/div/div/div/div/form/span/input 最终定位到 2 个元素,因而最初须要应用下标的形式,达到惟一定位的作用。

留神:XPath 中,下标值也是从 1 开始

除最终的 input 标签,后面门路中能够不增加下标值

# find_element_by_xpath 的利用:依据 xpath 绝对路径 定位元素
from selenium import webdriver  # 导入 webdriver 模块
from time import sleep  # 导入 sleep 模块,能够使程序强制休眠

driver = webdriver.Chrome()  # 调用 Chrome 浏览器
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com/')  # 关上 百度
sleep(2)  # 强制休眠 2 秒
element = driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input[1]")  # 依据 绝对路径 定位元素
element.send_keys("自动化测试")  # 输出内容
sleep(2)  # 强制休眠 2 秒
element1 = driver.find_element_by_xpath("/html/body/div/div/div/a")  # 依据 绝对路径 定位元素
element1.click()  # 点击
sleep(3)  # 强制休眠 3 秒
driver.quit()  # 敞开浏览器 

依据相对路径定位元素

应用绝对路径,会使得 XPath 语句非常简短,为了简化 XPath 语句,能够应用 //,示意从以后节点往下寻找所有的后辈元素, 不论它在什么地位。

理论利用

# find_element_by_xpath 的利用:依据 xpath 相对路径 定位元素
from selenium import webdriver  # 导入 webdriver 模块
from time import sleep  # 导入 sleep 模块,能够使程序强制休眠

driver = webdriver.Chrome()  # 调用 Chrome 浏览器
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com/')  # 关上 百度
sleep(2)  # 强制休眠 2 秒
element = driver.find_element_by_xpath("//div/form/span/input[1]")  # 依据 相对路径 定位元素
element.send_keys("自动化测试")  # 输出内容
sleep(2)  # 强制休眠 2 秒
element1 = driver.find_element_by_xpath("//div/div/a")  # 依据 相对路径 定位元素
element1.click()  # 点击
sleep(3)  # 强制休眠 3 秒
driver.quit()  # 敞开浏览器 

通配符

应用表达式 //div/*,能够抉择页面上所有的 div 节点的所有间接子节点。

依据属性定位元素

css 选择器一样,XPath 也能够依据属性来定位元素,语法格局:

[@属性名 =’ 属性值 ’]

  • 属性名留神后面有 @ 符号
  • 属性值肯定要用引号,能够是单引号,也能够是双引号

依据 id 属性定位

依据 class 属性定位

依据其余属性

理论利用

# find_element_by_xpath 的利用:依据 xpath 属性 定位元素
from selenium import webdriver  # 导入 webdriver 模块
from time import sleep  # 导入 sleep 模块,能够使程序强制休眠

driver = webdriver.Chrome()  # 调用 Chrome 浏览器
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com/')  # 关上 百度
sleep(2)  # 强制休眠 2 秒
element = driver.find_element_by_xpath("//div/form/span/input[id='kw']")  # 依据 id 属性 定位元素
# element = driver.find_element_by_xpath("//div/form/span/input[class='s_ipt']")  # 依据 id 属性 定位元素
# element = driver.find_element_by_xpath("//div/form/span/input[name='wd']")  # 依据 id 属性 定位元素
element.send_keys("自动化测试")  # 输出内容
sleep(3)  # 强制休眠 3 秒
driver.quit()  # 敞开浏览器 

组合属性定位

XPath 反对依据多个属性同时定位元素,语法格局:

//input[@type='text' and @ id='kw']:定位 type 属性值为 ‘text’ 并且 id 属性值为 ‘kw’ 的 input 元素

依据属性局部匹配

  1. 蕴含属性值://*[contains(@属性名,'局部属性值')],比方,//input[contains(@class,'_ip')]
  2. 匹配属性值结尾://*[starts-with(@属性名,'属性值结尾')],比方,//input[starts-with(@class,'s_ip')]
  3. 不反对匹配属性值结尾

依据秩序定位

XPath 反对依据秩序定位元素,而且语法比 css 选择器更简洁,语法格局:

// 标签名 [下标值]

某类型 第几个 子元素

//div[2]:定位到 作为第 2 个子元素的 div 元素;等价于 css 选择器中的 div:nth-of-type(2)

第几个子元素

//div/*[2]:定位到 父元素为 div 的第二个子元素,不辨别类型;等价于 css 选择器中的 div:nth-child(2)

某类型 倒数第几个 子元素

//div[last()]:定位到 div 类型的最初 1 个元素;等价于 css 选择器中的 div:nth-last-child(1)

//div[last()-1]:定位到 div 类型的倒数第 2 个元素;等价于 css 选择器中的 div:nth-last-child(2)

//div[last()-n]:定位到 div 类型的倒数第 2 个元素;等价于 css 选择器中的 div:nth-last-child(n+1)

范畴抉择

这种定位形式是 css 选择器所不具备的。

//ul/li[position()<=2]:定位 ul 类型下的第 1~2 个 li 元素

//ul/li[position()>=last()-1]:定位 ul 类型下的最初 2 个 li 元素

组抉择

XPath 组抉择是应用 | 隔开的,语法格局:

//input | //h3:抉择所有的 input 元素与 h3 元素,等价于 css 选择器中的:input, h3

定位父节点

XPath 抉择父节点相似于 Linux 的返回下级目录,应用 /..,这是 css 选择器不具备的性能,语法格局:

//*[@id='kw']/..:定位到 id 为 ‘kw’ 的元素的父节点

而且还能够持续往下层找父节点://*[@id='kw']/../..

定位兄弟节点

XPath 定位兄弟节点,应用 following-sibling::preceding-sibling::,语法格局:

//*[@id='kw']/following-sibling::*:定位到 id 为 ‘kw’ 的元素的所有后续兄弟节点,等价于 css 选择器中的:#kw~ *

//*[@name='rsv_t']/preceding-sibling::*:定位到 name 为 ‘rsv_t’ 的元素的所有后面的节点

总结

退出移动版