31Xpath复杂元素定位find_element (67,68,69)
⽬录
⼀、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 = _attribute("name")
print(attr)
注意:Python中,当前还不能直接修改元素,selenium没有封装对应的⽅法。
②find_element_by_id VS find_elements_by_id
xpath语法 pythonfind_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"]/../..定位到爷爷级
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论