selenium+python元素定位方法

一、WebDriver8种基本元素定位方式

以下方式返回元素位置,如果找到多个元素,则返回第一个

  • find_element_by_id(根据id定位)
  • find_element_by_name(根据name定位)
  • find_element_by_class_name(类名)
  • find_element_by_tag_name(标签名)
  • find_element_by_xpath(根据xpath语法)
  • find_element_by_link_text(根据链接文字定位)
  • find_element_by_partial_link_text(根据链接文字模糊定位)
  • find_element_by_css_selector(根据css语法)

当我们需要定位一组元素时,使用以下方式,返回的是元素【列表】

  • find_elements_by_id
  • find_elements_by_name
  • find_elements_by_class_name
  • find_elements_by_tag_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_css_selector

二、Xpath定位方式详解

1.绝对路径定位

利用html标签名的层级关系依次往下进行查找。

find_element_by_xpath("/html/body/div[1]/form/input")

一般不会使用这种方法,当页面元素位置发生改变,就要修改,比较繁琐

2.相对路径定位

//开头,长度和开始位置不受限制

find_element_by_xpath("//input[x]") #[x],表示定位第x个input标签,可以省略,省略时表示取第一个
find_element_by_xpath("//div[x]/form[x]/input[x]") 

这里用到了索引,需要注意的是:xpath的定位同一级别的多个标签索引从1开始,而不是0.

3.标签属性定位

标签属性定位,要求属性唯一,如果存在多个相同属性的标签,默认取第一个

 find_element_by_xpath("//input[@id='kw']")
 find_element_by_xpath("//*[@name='wd']")

也可以不指定标签名,用 * 代替,表示任意标签。

4.文本、逻辑、模糊
a.标签文本
find_element_by_xpath("//button[text()="登录"]")
b.逻辑组合

当某个属性不足以唯一区别某一个元素时,可以使用逻辑运算符,连接多个条件。逻辑运算支持与(and)、或(or)、非(not)。

find_element_by_xpath("//input[@type='name' and @name='kw1']")
c.模糊匹配

标签文本值模糊匹配

find_element_by_xpath("//标签[contains(text(),'文本值')]") 
# 尽量在html中复制文本内容,避免因为肉眼无法分辨的字符导致定位失败

标签属性模糊匹配

find_element_by_xpath("//标签[contains(@href,'logout')]")
# 标签的herf属性中包含logout

标签属性的开始、结尾模糊匹配

find_element_by_xpath("//button[starts-with(@class,"btn")]")
# button标签的class属性,以btn开头。当class名为动态值,如'btn-1264',但是值开头不变时,可以使用

find_element_by_xpath("//input[ends-with(@class,"-special")]")
# input标签的class属性,以-special结尾。

标签正则表达式匹配

待定
6.xpath轴定位

当某个元素的各个属性及其组合都不足以定位时,我们可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位,xpath中支持以下方法:

  • 1、child 选取当前节点的所有子元素
  • 2、parent 选取当前节点的父节点
  • 3、descendant选取当前节点的所有后代元素(子、孙等)
  • 4、ancestor 选取当前节点的所有先辈(父、祖父等)
  • 5、descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身
  • 6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
  • 7、preceding-sibling选取当前节点之前的所有同级节点
  • 8、following-sibling选取当前节点之后的所有同级节点
  • 9、preceding 选取文档中当前节点的开始标签之前的所有节点
  • 10、following 选取文档中当前节点的结束标签之后的所有节点
  • 11、self 选取当前节点
  • 12、attribute 选取当前节点的所有属性
  • 13、namespace选取当前节点的所有命名空间节点
具体使用方法没有仔细研究,先摆个例子感受一下
find_element_by_xpath("//td[contains(text(),’17051915200001’)]/following-sibling::td[8]/a[@class='link']")

7.多种方法结合

如果以上方法都不能准确定位到元素,那么可以使用以上方法的结合,比如使用标签属性找到确定父级在根据路径找到目标元素,比如利用逻辑运算符等等。

find_element_by_xpath("//form[@id='form' and name='ert']/span/input")
find_element_by_xpath("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3]")

三、用By定位

针对上述8大定位放方法,webdriver还提供了另外一套写法。调用find_element()方法,通过By来声明定位方法,并且传入对应定位方法的参数。具体写法如下:

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su") 

上述方法在使用前需导入By类:from selenium.webdriver.common.by import By。通过查看webdriver底层代码发现,其实和前面的方法是一回事儿,但是webdriver更推荐前面的那种写法。

https://blog.csdn.net/qq_32897143/article/details/80383502 史上最全!Selenium元素定位的30种方式
https://blog.csdn.net/huiseqiutian/article/details/73739707 python selenium xpath定位方式
http://www.cnblogs.com/yoyoketang/p/6123938.html

非原创,参考各个博客为自己整理的笔记

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值