1.XPATH的使用
XPATH是一门在xml文档中查找信息的语言。XPath用于在xml中通过元素和属性进行导航。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,包括绝对路径和相对路径。
绝对XPATH其实是标签的层级路径。/html/body/div[3]/div/div[2]/div[1]/div/ul[4]/li[2]/a。 很不稳定,只要元素前面多出元素就可能影响元素定位的准确性。
相对XPATH是通过属性定位元素。推荐使用相对XPATH或这样的手写XPATH。相对XPATH的结构:
/ | 代表路径 |
// | 代表在当前路径下寻找(比如以//开头,就是在整个html文档中寻找) |
*或标签名 | // *(所有标签) //a(所有元素里面的a标签) |
[ ]里面写筛选条件 | [@id="username"] 筛选id为username的元素 |
@属性 | 选取属性。id,name…… (凡是标签名里面的都是属性的键值对) |
特殊属性 | test() (元素的文本值) //a[text()="个人信息"] |
contains | 包含 (属性值或者文本值包含) //a[contains(text(),"个人信息")] |
1.1XPATH的调试
(1) 打开DevTools(command+option+i) ——打开console页签,使用$x('xpath')调试
(2)在chorme的f12里面(command+f)——输入查找的相对xpath
2.关联型XPATH
关联型xpath即使用轴定位编写xpath。以一个元素为轴,寻找其父元素,子元素,兄弟元素。
#寻找子元素
$x('//span[test()="A"]/../../li//a[text()="A的子元素"]'')
#寻找距离最近的父元素
$x('//span[test()="A"]/ancestor::div[1]')
#寻找最古老的父元素
$x('//span[test()="A"]/ancestor::div')
#寻找兄弟元素
$x('//span[test()="A"]/../following-sibling::li[1]')
3.切换iframe内联框架和切换窗口定位
如果报错找不到元素,有可能是因为该元素在iframe内联框架当中。在selenium里面,每一个iframe和网页本身都是被分割开来的独立部分,必须一层一层进入到iframe,才能看到。
# 切换进入iframe(进入房间)
frame = driver.find_element(By.XPATH, '//*[@id="layui-layer-iframe1"]')
driver.switch_to.frame(frame)
# 退出iframe一定是退到客厅(最外层)
driver.switch_to.default_content()
若网页打开了新窗口,你希望在新打开的窗口上定位操作元素,就必须把窗口切换过去。
# 切换窗口
handles = driver.window_handles
print(handles)
# # 按下标切换
# driver.switch_to.window(handles[1])
# 按title切换
for h in handles:
driver.switch_to.window(h)
if driver.title.__contains__('我的订单'):
break