XPATH是什么
XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档。Selenium WebDriver支持使用XPATH表达式来定位元素。
Xpath常用如下6种定位元素的方法:
1、通过绝对路径定位
绝对路径的开头是一个斜线(/),从网页的根节点html开始,逐层去查找需要定位的元素。
此方法缺点显而易见,当页面元素位置发生改变时,都需要修改,因此,并不推荐使用。
代码如下:
以百度首页的搜索框为例
import os from selenium import webdriver from selenium.webdriver.common.by import By current_path = os.path.dirname(os.path.abspath(__file__)) # 当前路径 driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe') # driver路径 driver = webdriver.Chrome(executable_path=driver_path) # Firefox,Ie等 driver.get('https://www.baidu.com/') # 打开网站 # 绝对路径定位:/ 开头 # 从网页正文的html节点,一直找到元素所在的位置的一种定位方法(从上往下,同层级下标表示) # 一般不用,难维护,谷歌浏览器自带了复制 绝对路径xpath的功能 driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input').send_keys('python')
备注:当同一层次有多个相同的元素时,使用下标区分,下标从1开始;并且注意网页登录状态和非登录状态的html的绝对路径是不一样的
2、通过相对路径定位
相对路径的开头是两个斜线(//),表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。
代码如下:
以百度首页的搜索框为例
import os from selenium import webdriver from selenium.webdriver.common.by import By current_path = os.path.dirname(os.path.abspath(__file__)) # 当前路径 driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe') # driver路径 driver = webdriver.Chrome(executable_path=driver_path) # Firefox,Ie等 driver.get('https://www.baidu.com/') # 打开网站 # 相对路径定位:// 开头 # 在网页正文中,通过独一无二丶局部路径表示元素信息的一种定位方法(从下往上,一层一层试) driver.find_element(By.XPATH,'//span[1]/input').send_keys('JAVA') # 最简相对路径 driver.find_element(By.XPATH,'//form/span[1]/input').send_keys('JAVA') # 最简相对路径
备注:以上都可以定位到百度搜索框,相对路径的长度和开始位置并不受限制,可以采用从后往前逐层定位直到定位到即可的方式去定位。
3、通过元素索引定位
遇到同层级相同标签元素时,可以使用索引(下标)表示,索引的初始值为1
代码如下:
以百度首页的hao123链接为例
import os from selenium import webdriver from selenium.webdriver.common.by import By current_path = os.path.dirname(os.path.abspath(__file__)) # 当前路径 driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe') # driver路径 driver = webdriver.Chrome(executable_path=driver_path) # Firefox,Ie等 driver.get('https://www.baidu.com/') # 打开网站 # 元素索引定位 # 遇到同层级相同标签元素时,可以使用索引(下标)表示,索引的初始值为1 driver.find_element(By.XPATH,'//div[3]/a[2]').click() # 百度首页hao123链接
4、使用元素属性定位
元素属性定位要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认定位第一个,具体格式://标签名[@属性="属性值"]
支持使用and和or关键字,多个属性一起定位元素
代码如下:
以百度首页的搜索框为例
import os from selenium import webdriver from selenium.webdriver.common.by import By current_path = os.path.dirname(os.path.abspath(__file__)) # 当前路径 driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe') # driver路径 driver = webdriver.Chrome(executable_path=driver_path) # Firefox,Ie等 driver.get('https://www.baidu.com/') # 打开网站 # 元素属性定位 # 利用元素属性值去定位,但是要保证该属性独一无二,否则可能定位到其他元素 # 语法://标签名[@属性名="属性值"] driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys('python') # 多属性定位 and,or //标签名[@属性名1="属性值1" and @属性名2="属性值2" ..] 、//标签名[@属性名1="属性值1" or @属性名2="属性值2"] driver.find_element(By.XPATH,'//input[@id="kw" and @maxlength="255"]').send_keys('python') driver.find_element(By.XPATH,'//input[@id="kw" or @maxlength="255"]').send_keys('python') # xpath 支持正则 driver.find_element(By.XPATH,'//*[@*="kw"]').send_keys('python')
备注:Xpath支持通配符号*号,通过属性定位还可以如下写法:driver.find_element(By.XPATH,'//*[@*="kw"]')
5、使用部分属性值匹配(也称为模糊方法定位)
属性值如果太长或网页中的元素属性动态变化,可以使用此方法
元素属性值字符串开头对比:starts-with(@属性名,"属性值")
元素属性值字符串结尾对比:ends-with(@属性名,"属性值")
元素属性值字符串包含对比:contains(@属性名,"属性值")或者通过模糊匹配文本contains(text(),"文本值")
备注:ends-with()在selenium中不存在,ends-with()是属于xpath2.0的函数库和语法,而xpath1.0不存在该函数;selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法
代码如下:
以百度首页为例
import os from selenium import webdriver from selenium.webdriver.common.by import By current_path = os.path.dirname(os.path.abspath(__file__)) # 当前路径 driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe') # driver路径 driver = webdriver.Chrome(executable_path=driver_path) # Firefox,Ie等 driver.get('https://www.baidu.com/') # 打开网站 # 部分属性值定位: # 当元素属性动态变化或元素属性值过长,可以使用的一种定位方法 # 元素属性动态变化:第一次打开页面page_1,第二次打开页面page_2 //a[starts-with(@href,"page_")] # xpath 三个函数 starts-withs(@属性名,"属性值")字符串开头对比 ends-with()字符串结尾对比 contains()字符串包含 # ends-with()字符串结尾比对 == 是xpath2.0的函数库、语法 而xpath1.0不存在该函数 # selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法 driver.find_element(By.XPATH,'//a[starts-with(@href,"https://haokan.")]').click() driver.find_element(By.XPATH,'//a[contains(@href,"haokan")]').click()
6、使用元素文本定位
6、使用元素文本定位
元素文本在xpath中可以通过text()函数获取,也可以用其来进行元素定位。
格式:
文本定位://a[text()="文本"]
部分文本定位://a[contains(text(),"文本")]
代码如下:
以百度首页为例
import os from selenium import webdriver from selenium.webdriver.common.by import By current_path = os.path.dirname(os.path.abspath(__file__)) # 当前路径 driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe') # driver路径 driver = webdriver.Chrome(executable_path=driver_path) # Firefox,Ie等 driver.get('https://www.baidu.com/') # 打开网站 # 元素文本定位 text()获取元素的文本值 # by_link_text 与 文本定位区别:文本定位它可用于定位所有包含文本的标签元素,而by_link_text只适合a标签 driver.find_element(By.XPATH,'//a[text()="hao123"]').click() # 部分文本定位 driver.find_element(By.XPATH,'//a[contains(text(),"hao")]').click()
总结
如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面
自动化测试相关教程推荐:
2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili
2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili
测试开发相关教程推荐
2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili
postman/jmeter/fiddler测试工具类教程推荐
讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili
2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili
2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili
总结:
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!