Selenium3自动化测试【18】XPath定位元素(1)

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。通俗一点讲就是通过元素的路径来查找到这个元素的,相当于通过定位一个对象的坐标,来找到这个对象。

Selenium WebDriver支持使用XPath表达式来定位元素。当发现通过ID、name或class属性值无法定位元素时,可以尝试使用XPath的方式。通过XPath可以灵活的应用绝对或相对路径来定位元素。
1. 通过绝对路径定位
XPath表达式表示从html代码的最外层逐层查找,最后定位到按钮节点。如果这样不好理解,可以举个生活中的例子,比如你的户口所在地是XX省XX市XX区XX号。这相对于不熟悉你的人来说,通过这个地方就可以查找到你。
仍以bing首页为例。借助FireFox浏览器的前端工具Developer Tools工具。从最顶层->->… …->标签,拼接对应元素的绝对路径,如图示。

find_element_by_xpath方法使用XPath来定位元素。XPath主要用标签名的层级来定位元素的绝对路径,其中最外层html,然后在body内一级一级往下查找想找的元素。如果某个层级由多个相同的标签,就按前后顺序确定是第几个,例如input[1]表示当前层级的第1个input标签。
借助FireFox浏览器的前端工具Developer Tools工具,可以拼接出输入框与搜索按钮两个元素的绝对路径。
搜索框:/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/input[1]
搜索按钮:/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/div[1]/input
要操作Bing搜索页。
 通过XPath找到搜索框与搜索按钮元素;
 通过键盘输入检索的关键字;
 用鼠标单击搜索按钮;
 提交搜索请求。
Selenium的完整代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")

driver.find_element_by_xpath("/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/input[1]").send_keys("bella")   #搜素框
driver.find_element_by_xpath("/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/div[1]/input").click()          #搜索按钮

sleep(3)
driver.quit()

借助Chrome浏览器的开发者工具能够快速的获得对应元素Xpath的绝对路径。
在Chrome浏览器中打开bing。在Chrome菜单中选择 【更多工具】 >【 开发者工具】(通过F12可以调用)。
通过选择器,选中某元素(如搜索框元素),右键单击选择copy,然后单击copy full XPath。就将该元素Xpath(搜索框元素)的绝对路径复制下来,然后直接粘贴到代码中使用即可,(/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/input[1])如图所示。

注:
通过XPath定位元素过程中,不要一味迷信使用FireFox的开发者工具,记得Seleium也是支持Chrome浏览器的。要很好的借助FireFox浏览器与Chrome浏览器两者的开发者工具,综合应用两款浏览器的前端开发者工具,来获得某元素的XPath。
为了避免人工造成的错误,尽量不要自己拼写绝对路径,避免拼写路径错误的发生。

2. 通过元素属性定位
XPath定位元素除了使用绝对路径外,也可以使用元素的某个属性值来定位。同样以bing首页为例。
XPath通过元素的某个属性值来定位元素,就无需手动拼写了,可以借助FireFox浏览器与Chrome浏览器两者的开发者工具完成。
借助FireFox浏览器开发者工具获得搜索框元素XPath的值。如图所示,FireFox Developer Tools中选中搜素框元素,然后右键单击该元素的代码区域,【复制】->【XPath】,就得到该元素的某个属性值的Xpath值(//*[@id="sb_form_q"]),如图所示。

同理,获得搜索按钮元素某个属性值的Xpath(//[@id="sb_form_go"])。这里//表示当前页面某个目录下,表示匹配所有标签,[@id="sb_form_go"]与[@id="sb_form_q"]表示对应元素(搜索框元素与搜索按钮元素)的id属性值是"sb_form_go"与"sb_form_q"。
XPath通过元素的某个属性定位元素的完整代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")

#简化的xpath路径
driver.find_element_by_xpath("//*[@id='sb_form_q']").send_keys("bella") 
driver.find_element_by_xpath("//*[@id='sb_form_go']").click()

sleep(3)
driver.quit()

通过Chrome浏览的开发者工具,获得元素XPath的某个属性如图所示。

XPath通过元素的某个属性定位不仅仅局限于ID,可以通过人知道属性值实现,如name、class等。
搜素框元素的html代码。

搜索按钮元素的html代码。

此时就需要手动书写通过两个元素的name、class属性实现XPath定位。下面分别通过name与class属性值来定位。
通过元素的name属性定位元素的完整代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")

# 利用元素属性定位--name
driver.find_element_by_xpath("//input[@name='q']").send_keys("bella")
driver.find_element_by_xpath("//input[@name='go']").click()

sleep(3)
driver.quit()

这里//表示当前页面某个目录下,input表示匹配input标签的元素,[@name='q']与[@name='go']表示对应元素(搜索框元素与搜索按钮元素)的name属性值是"q"与"go"。
通过元素的class属性定位元素的完整代码如下:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")

# 利用元素属性定位--class
driver.find_element_by_xpath("//input[@class='b_searchbox']").send_keys("bella")
driver.find_element_by_xpath("//input[@class='b_searchboxSubmit']").click()

sleep(3)
driver.quit()



如果你觉的文章读的不过瘾,可以查看详细的视频教程。
【2021】UI自动化测试:Selenium3自动化测试
https://ke.qq.com/course/3172187?tuin=9c43f38e

【测试全系列视频课程】请点击我哦.....

《全栈测试系列视频》课程

地址:https://ke.qq.com/course/2525707?tuin=9c43f38e

图书京东、当当有售

京东:https://item.jd.com/12784287.html
当当:http://product.dangdang.com/29177828.html)!

posted @ 2021-05-05 17:42  BlaLeo  阅读(360)  评论(0编辑  收藏  举报