WEB自动化-selenium-定位方式(总结的一些疑难杂症)
定位元素的时候可以修改JS样式来确定定位的元素是否正确
# 通过selenium修改JS属性, 用来确定我定位的元素是什么? driver.execute_script( "arguments[0].setAttribute('style',arguments[1]);", el, "border: 2px solid green;" # 边框,green绿色 )
首先,driver.find_element(),,括号里一般跟的是(By.ID,"ID的值"),如element = (By.NAME, "btnK") driver.find_element(By.NAME, "btnK"),运行成功
如果我们先定义变量 locator = (By.NAME, "btnK"),再写driver.find_element
element = (By.NAME, "btnK")
driver.find_element(element)
这样运行会报错,原因:第一个版本发送两个参数,第二个版本发送一个参数(字符串)。那么需要修改成如下,才能执行成功
使用*
操作符对参数进行“解压缩”:发送一个参数(一个元组)
args = (By.NAME, "btnK") driver.find_element(*args)
一、CSS 定位方式,这里有个博主写的很详细了,
Selenium之元素定位-css - linux超 - 博客园 (cnblogs.com)
另外发现实际在用class定位的时候,有以下需要注意的:
1、如class的值有空格的时候定位不到,此时需要用.替换空格,如
locator = ("css selector", ".s_input icon_code") # 定位验证码输入框(这里有空格,定位不到元素) locator = ("css selector", ".s_input.icon_code") # 定位验证码输入框--这里需要把空格替换成.
2、后代选取的时候 ,不限于子代,孙代,标签后面用空格,,如果只是子代,用>
二、XPATH
1、标签的text()包含文本,使用contains(text(),"值")定位不到
XPATH用文本定位方式,有的时候文本包含空格的时候,是定位不到的,如
这个时候用符号“.”替换text()就可以定位到
//td[@style="position: relative" and contains(., "野蛮女将军")]
因为里面存在的一些空格,可能导致模糊匹配不成功,用normalize-space()方法去掉空格,再去匹配
//td[@style="position: relative" and contains(normalize-space(), "野蛮女将军")]
2、用多个标签下的元素来定位同一个元素
这里,有多个野蛮女将军,我想定位“野蛮女将军12”对应的章节管理,这里的text()=野蛮女将军12 和 章节管理在不同的元素和标签层级中却在同一个class=book_list下。那么这种的就需要先定位一个元素,在定位一个元素。需要用到的返回上级的xpath方法
/.. 定位 返回上级节点 和parent 效果一样
//tbody/tr/td[@style="position: relative" and text()=" 野蛮女将军12"]/../td/a[text()="章节管理 "]
//tbody/tr/td[@style="position: relative" and text()=" 野蛮女将军12"]/parent::*/td/a[text()="章节管理 "]