Xpath复杂元素定位 find_element

31 Xpath复杂元素定位 find_element
(67,68,69)
文章写的好固然分享并转载:https://www.cnblogs.com/ananmy/p/13323921.html

目录

一、python八大元素定位

正文

一、python八大元素定位方式

id、name、class_name、tag_name、link_text、partial_link_text、xpath、css_selector

1.元素定位

得到的返回值是一个webelement的python对象.------》定位的元素,下面以百度页面的输入框为例:
在这里插入图片描述
① find_element_by_id(“kw”)

input_elem=driver.find_elemrnt_by_id(“kw”)
print(input_elem) #webelement对象
得到的结果就是一个webelement

那么如何获取元素的属性?------就是获取webelement的属性,get_attribute()

attr = input_elem.get_attribute(“name”)
print(attr)
注意:Python中,当前还不能直接修改元素,selenium没有封装对应的方法。

②find_element_by_id VS find_elements_by_id

find_element_by_id :

1)查找一个,得到的是一个webelement对象;

2)找不到元素的话,报错:NoSuchElementException

find_elements_by_id :

1).查找多个,得到一个列表

2.查找不到元素的话,得到的是一个空列表

在实际定位的时候,不知道该元素存不存在,可以用下面的判断方法:

if not driver.find_elements_by_id(“kk”)
print(“该元素不存在”)
else:
print(“该元素存在”)

③name属性定位---->find_element_by_name

driver.find_element_by_name(“wd”)
driver.find_elements_by_name(“wd”)

④class属性---->class_name

driver.find_element_by_class_name(“s_ipt”)
driver.find_elements_by_class_name(“s_ipt”)

⑤link_text :通过超链接的文本,进行元素定位(只能定位超链接,其他的元素是不能定位的,所以只能定位a标签)

e = driver.find_element_by_link_text(“新闻”)
e.click() # 如果定位成功,会点击进入新闻这个链接的页面
⑥partial_link_text:通过超链接的文本的一部分进行元素定位

e = driver.find_element_by_partial_link_text(“新”)
e.click()
注意:若果有多个新开头的超链接,永远定位到的都是第一个。

⑦tagname ---->定位的元素比较多,测试的时候很少用

driver.find_element_by_tagname(“input”)

总结:以上6种定位方法,用的最多的是id、name、class_name用的最多

id:是唯一的

name:用户输入经常会带name属性(提前在浏览器中,F12,在源代码中,按ctrl+F,查找元素出现的次数)

class_name:出现次数多

元素定位的坑

1.不要用可能会发生动态变化的属性进行元素定位。------->属性是静态的才能定位

比如说:1)不规则的字符串(比较长可能是加密),就不能用这个属性进行元素定位

2)有些属性有数字,纯数字的,不能用来定位

3)带数字的,也要警惕

2.class_name定位的时候,class_name值中间不能有空格-------》class是分组的

下面定位百度,class_name的值中间有空格,是定位不到的

class = "bg s_btn"表示2个class,用空格分开。

所以通过class_name进行定位,只能写其中一个。

driver.find_element_by_class_name(“bg”) 或者 driver.find_element_by_class_name(“s_btn”)
在这里插入图片描述
3.如何确定我的元素表达式只能找到一个元素

1).复制表达式到浏览器,在F12的源码中ctrl+F

2).find_element只有一个元素

以上6种 元素定位的方式:通过单属性定位只能定位特征明显的元素。

下面介绍xpath,css_selector--------面试题

优势:组合多个特征、组合多个属性,能够更加精准的定位元素;定位元素的时候,因为可以组合,有更大的灵活性。

面试题:八大元素定位有哪些?

先说八种元素定位方式;再说,其实没有8种元素定位方式:find_element_by_id / by_name / by_tag_name / by class_name等都是在find_element()方法的基础上,进行二次封装的。其本质都是使用的find_element()方法,进行元素定位的。

如下:find_element()方法的源码:
在这里插入图片描述
driver.find_element(“id”,“kw”) == driver.find_element_by_id(“kw”)

即上面的语句是等价的。

69节

⑦xpath

1)定义:Xpath即XML路径语言(XML Path language),用来确定XML文档中某部分位置的语言。XML跟HTML很相像,所以也可以进行HTML

2)使用xpath进行元素定位

 获取xpath的表达式:

------1.通过浏览器,F12定位,在源码上右击,copy--》copy xpath 、copy selector、copy full xpath (第三顺位)

------2.使用插件   (第二顺位)

------3.自己编写。(第一顺位,最重要)

学习的时候:不要使用工具获取xpath,有时候是不正确的,一般最好是自己写。

实际项目中,节省时间可以使用插件。

3).绝对定位 相对定位
在这里插入图片描述
绝对路径 VS 相对路径

在自动化测试中,使用相对路径,不使用绝对路径。

面试题:↓↓

绝对路径:

1)从最开始的位置,一层一层进入对应的元素。

2)冗余,容错性更差

相对路径:

1)在某个位置,不需要从最开始的位置

2) 更加简洁、灵活,容错性更好

例如:前端工程师,喜欢加层级(多个div),使用绝对路径就很可能找不到元素。相对路径则比较灵活。容错性更好。

3)xpath表达式 解释

单个属性定位

//*[@id = “kw”] :查找任意的元素,这个元素的属性id=kw

// :表示相对路径

  • :表示通配符,所有的标签名称 (上面的式子定位百度输入框,就等价于 //input[@id = “kw”])

[@id=“kw” ]:谓语条件 属性=值,@表示这个属性。@+属性。

组合多个条件:如果一个属性定位不到,就考虑组合多个条件

例如://input[@id= “kw” and name=“wd” and class=“s_ipt”]

text()文本定位:文本不是属性,不能加@

//a[text()="新闻”]

xpath函数—contains包含 模糊匹配

常用的语法:// *[contains(text() , " XXX")]

                 //*[contains(@id,"XX")]

下面的情况就可以用contains进行过滤

—class可能有多个,有空格 《------(class属性定位,一定不能有空格)

----text()定位一部分

----有空格的情况

举例:通过xpath定位 新闻 这个文本

e = driver.find_element(“xpath”,”//a[text() = "新闻“]“) #a标签
e.click()
上面的例子,通过contains进行元素定位(如果新闻两个字前后有空格,定位的时候不注意,只定位新闻二字,就定位不到,用contains进行过滤)

e = driver.find_element(“xpath”,”//a[conatins(text() , "新闻“)]“)
e.click()
e = driver.find_element(“xpath”,”//a[conatins(text() , "新“)]“)
e.click()
定位的是属性

e = driver.find_element(“xpath”,”//a[conatins(@id , "kw“)]“)
e.click()

祖级(//)、父级(/)查找子元素

组合查找,还是定位不到元素,该怎么办?-----父级元素进行查找

举例://span[@class=“bg s_btn_wr” ]/*[@id=“su”]
在这里插入图片描述
层级之间加 / :表示父、子级关系

层级之间加 // :表示祖孙关系(可以是儿子,孙子,曾孙、、、、、、后代)

子元素查找父级元素—缺点,不能跨级定位,只能一级一级定位

/…/…定位上一级元素(不能跨级)

//input[@id=“kw”]/…/…定位到爷爷级
在这里插入图片描述
特殊手段定位元素

手段1.通过索引查找,索引从1开始。并且索引前面加括号

(//input[1])

如果不加括号,会查找出3个索引为1的元素。
在这里插入图片描述
70节

手段2.轴定位 轴运算

–1.灵活设计:子孙元素找祖先

–2.可以找同胞(关系查找)

轴定位表达式
在这里插入图片描述
在这里插入图片描述
sibling: 当前节点的同胞(姐姐或者哥哥 弟弟或者妹妹)

※ preceding-sibling :当前节点的同胞,只是哥哥或者姐姐 (当前节点的前面)

※following-sibling:当前节点的同胞,只是弟弟或者妹妹 (当前节点的后面)

※ancestor: 祖先

这三个轴运算,是xpath很难实现的,使用轴运算就很方便。

举例:百度输入框input

1.查找input元素的同胞节点(哥哥/姐姐)-------> //input[@id=“kw”]//preceding-sibling::span

如果直接写成 //input[@id=“kw”]//sibling::span 是查找不到的,因为有同胞有input 前面的跟后面的
在这里插入图片描述
2.查找input元素的同胞节点(弟弟/妹妹)-------> //input[@id=“kw”]//following-sibling::span
在这里插入图片描述
3.祖先 ,当前节点所有的外层元素(从父亲级开始查找,父亲级找不到再找爷爷级,只要是祖先级别,都可以找到)

举例:input输入框的祖先----> //input[@id=“kw”]//ancestor::span
在这里插入图片描述
4.组合查找:父亲的同胞--------> //input[@id=“kw”]//ancestor::span//preceding-sibling::input
在这里插入图片描述
⑧ css_selector css选择器

css表达式
在这里插入图片描述
1)css选择器的一般写法:input[id=kw] ------》对应的xpath的写法是//input[@id=“kw”]

css选择器的表达式,更加简洁(//,@,""都可以省略)
在这里插入图片描述
2)一个点 . 表示class

查找class_name = s_ipt,用css选择器来查找,就是.s_ipt
在这里插入图片描述
3)#号:表示id

查找id=“kw” ,用css选择器来查找,就是 #kw,也可以直接写为input#kw
在这里插入图片描述在这里插入图片描述

css查找的单向性—只能通过父元素找子元素

总结:

xpath比之前的6种元素定位方式的优势:

xpath可以进行组合:可以组合元素的标签、属性、text文本、上下级关系。

//input[@id = “kd” and text() = "新闻”]

//div/input[@id = “kd” and text() = "新闻”] 父级必须是div,父元素定位子元素

//*[] 任意标签名

//input[@*=“kw”] *表示的是任意属性

//input[@id] 有id属性,具体id值不知道也可以。爬虫(测试中条件要精确,这个表示方法基本不用)

//input[contains(text(),"新闻“)] //input[contains(@class,“value”)]

//input[@id= “kw”]/…/…子元素找父元素

xpath VS CSS----面试题

css的优势:

1.表达方式更加简洁

2.主流浏览器,查询速度快(毫秒级别的差别)

xpath 的优势:

1.功能更强,支持更多的函数,可以查找父元素、轴元素、(css只能用父元素找子元素)

2.支持用text()文本定位查找的(css不支持)

3.对于复杂的元素,xpath的写法反而比css简洁(支持跟多的函数、组合定位)

在find_element()函数中,使用的是css选择器,而不是xpath的原因:查询速度快一点点。

平时查找使用xpath,封装函数建议使用css_seletor.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值