关于selenium的8种元素定位

时间:2022-07-08 13:58:26

selenium中有八种元素定位,分别是:id,name,class_name,tag_name,link_text、partial_link_text、xpath、css

简单的定位可以用 id、name、class_name、tag_name等,如果遇到复杂的元素需要定位则要使用xpath、或者css定位
下面是每种定位的用法——拿百度来说

1、id——定位到百度的输入框,可以看到百度的输入框id是唯一的,具体可以看下图

关于selenium的8种元素定位

在pycharm中,语句是:driver.find_element_by_id("kw").send_keys("selenium")

send_keys 表示在输入框中输入文本

2、name——还是以百度输入框为例,可以看出百度输入框的name属性也是唯一的

关于selenium的8种元素定位

在pycharm 中语句是:

driver.find_element_by_name("wd").send_keys("selenium")

3、class_name——“百度一下”按钮,可以看出这个的class_name 是唯一的
关于selenium的8种元素定位

在pycharm中的语句是:driver.find_element_by_class_name("bg s_btn").click()

4、tag_name——标签名称

关于selenium的8种元素定位

 这个方法很少用到,一般用xpath/css比较多

5、link_text——用来定位文本链接的
比如定位百度中的新闻:driver.find_element_by_link_text("新闻").click()
6、partial_link_text:和link_text 相似,唯一不同的是定位部分文本
如:点击hao123——driver.find_element_by_partial_link_text("hao").click() 7、xpath
(1)用xpath对标签内的属性进行定位(id、name、class)
方法://标签名[@属性="属性名"] 双引号也可以用单引号表示
当某个元素的属性不是唯一的时候,需要采用组合的方式定位:"//标签名[@属性='属性名' and @属性='属性名']" (2)用text()方法定位
//标签名[text()="XXXX"] (3)模糊定位——contains()方法定位
//标签名[contains(@属性,"属性值")] (4)轴定位(下图来自http://www.runoob.com/xpath/xpath-axes.html)
轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
following-sibling 选取当前节点之后的所有兄弟节点
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。
通过轴定位定位“百度一下”按钮 首先定位到这个按钮,可以看到这是个input标签,input标签的父元素是span标签,span标签的父元素是form标签,那么我们可以从form标签开始定位然后通过descendant来找到它的后代input 
//form[@id='form']/descendant::input[@id='su']

关于selenium的8种元素定位

通过following 来定位——following 表示标签节点之后
//span[@id='s_kw_wrap']/following::input[@id='su']
//span[@id='s_kw_wrap']表示定位到id属性为s_kw_wrap的<span>标签,/following::input[@id='su']表示找到<span>结束标签(即</span>)后的所有input标签,然后通过[@id='su']精准定位到id属性为'su'的<input>标签

parent::可指定要查找的当前节点的直接父节点,例如,父节点是个div,即可写成parent::div,如果要找的元素不是直接父元素,则不可使用parent,可使用ancestor,代表父辈、祖父辈等节点;

child::表示直接子节点元素

following-sibling只会标识出当前节点结束标签之后的兄弟节点,而不包含其他子节点