前言
什么是 XPath?
• XPath 使用路径表达式在 XML 文档中进行导航
• XPath 包含一个标准函数库
• XPath 是 XSLT 中的主要元素
• XPath 是一个 W3C 标准
XPath 路径表达式
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
以上为w3school中对xpath的定义。
建议先简单了解一下xpath,不然看见一串字符一样的xpath可能会有点懵逼。
1)绝对路径定位(不推荐)
已测试窝登录界面为例,我们通过元素一层一层的往下找,找到我们用户名输入框节点为:’/html/body/div/form/div/div/div/input’
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(“https://www.testwo.com/user/login")
#查找路径为/html/body/div/form/div/div/div/input’节点
driver.find_element_by_xpath('/html/body/div/form/div/div/div/input').send_keys("testwo")
#等待3s,退出浏览器
time.sleep(3)
driver.quit()
当我们页面结构发生变动时,就会导致我们的绝对路径发生变化,那么测试脚本的稳定性就会较差,所以不建议使用绝对路径定位
2)相对路径定位
a.查找相对路径下元素input的id为inputName节点
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#通过xpath定位
#查找input元素属性id为”inputName”节点
driver.find_element_by_xpath('//input[@id="inputName"]').send_keys("testwo")
time.sleep(3)
driver.quit()
b.由于在HTML结构中,如果我们的ID是唯一的,我们可以直接使用通配符*号去匹配,任意元素id为inputName的节点。
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#通过xpath定位
#查找id为inputName的节点
driver.find_element_by_xpath('//*[@id="inputName"]').send_keys("testwo")
time.sleep(3)
driver.quit()
c.当我们需要定位的元素不存在id时,我们可以通过定位其他属性来定位该节点
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#查找input元素属性name为”name”的节点
driver.find_element_by_xpath('//*[@name="name"]').send_keys("testwo")
time.sleep(3)
driver.quit()
3)索引定位
当我们定位的元素存在多个时,那么我们可以通过索引选择我们具体的元素。
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#查找元素form下第一个div元素下的input元素(感觉有点绕)
driver.find_element_by_xpath('//form/div[1]//input').send_keys("testwo")
time.sleep(3)
driver.quit()
4)局部(模糊)匹配定位
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.testwo.com/user/login")
#通过xpath定位
#匹配name中含有name的元素,name='name'
driver.find_element_by_xpath('//*[contains(@name,"name")]').send_keys("testwo")
time.sleep(2)
#匹配id以inputP开头的元素,id='inputPassword'
driver.find_element_by_xpath('//*[starts-with(@id,"inputP")]').send_keys("password")
time.sleep(2)
#匹配name以cha结尾的元素,name='ca',我在本地试验会报错,目前暂未找到解决方法
driver.find_element_by_xpath('//*[ends-with(@name,"captcha")]').send_keys("验证码")
time.sleep(2)
driver.quit()
声明:欢迎大家加入测试窝官方交流群(316016449),如上述内容存在错误,请帮忙指出,我会及时更正。