提升之路--从0开始学web自动化(3)--xpath元素定位&等待

为什么要使用xpath

当元素没有id name属性,通过class,tagname找到的不是唯一的,而link_text和partial_link_text只能用在a标签

使用xpath可以组合多个条件进行筛选,也可以根据元素之间的层级关系进行查找

绝对路径和相对路径

/绝对路径(不用)

//相对路径

相对路径xpath表达式

//相对路径

*表示任意的标签名称    //input 表示标签是input

[]条件    //input[@id=”kw”] 表示要在input标签里面要有一个id属性 且id属性的值要是kw

Xpath的验证

在页面中按F12后再按ctrl+F

 能够查看找到多少个元素,实际当中要找到唯一的一个

实战当中采取怎样的方式去获取xpath

1,通过右击元素的源代码,复制xpath表达式,但是有时候会获取到绝对路径

2,chropath插件

3,编写xpath表达式 

编写xpath的方法

通过属性

//(相对路径)标签名[@属性名=”属性值”]

通过文本内容

完全匹配//a[text()=””]

 包含标签//a[contains(text(),新闻],一般用在a标签,因为文本最前面可能会有空格

 

多个条件组合 and

 如果多个条件组合后还是有相同,就使用索引 xpath索引是以[1]开头

 

 最好加上括号 表示优先级,表示先获取符合的属性,再取索引

定位最后的元素,不是[-1],而是[last()]

 

元素之间的层级

 先编写父级的元素,再编写子级的元素,父子之间可以用/,隔代要用//

通过子级往上找//sub/../..

 

 轴运算/定位

寻找祖先ancestor

 

寻找同级

选取当前节点之前的所有同级节点 preceding-sibling

选取当前节点之后的所有同级节点 following-sibling

 

查找元素报错的原因

进行web自动化测试时候,会经常出现以下报错,表示没有找到元素

selenium.common.exceptions.NoSuchElementException: Message: no such element

1,表达式错误

2,没有等待,或者等待时间太少

3,不在当前页面 元素在新的窗口,或者在一个iframe当中

4,元素的属性可能会动态发生改变,比如a标签的href属性

如果属性存在一下特征,最好不要用该值作为元素定位的依据:

-属性的值包含数字

-不认识的字符串(通过加密或者编码)

-class里 不要使用hidden active属性

等待的方法

-强制等待,time.sleep(3)

-隐性等待

在规定时间内不断查找,直到元素被加载

智能等待元素被加载,全局只需要设置一次,但是只能等待元素被加载,数据可能还没被加载完成,就算拿到了元素也不一定会生效

 -显性等待

用法相对麻烦,不易理解

智能等待元素被加载,每次使用之前都要使用,用于等待某个元素可以被点击,某个元素可见

可以自己设置某种条件,如果条件满足就返回,如果条件不满足,就会继续执行,知道超时

设置显性等待

1,导入模块,获得等待器,设置倒计时

from selenium.webdriver.support.wait import WebDriverWait
 # 1,获得等待器,设置倒计时
    wait = WebDriverWait(browser, timeout=10)

2,导入模块,设置等待条件,参数传入定位元素(是一个元组)或者一个变量(找到的元素),而元素要符合该条件(方法)

from selenium.webdriver.support import expected_conditions as when
# 2,等待条件,参数输入定位元素,而元素要符合该条件(方法)
    condition = when.element_to_be_clickable((By.XPATH, '//a[@class="setpref"]//following-sibling::a[@href="//www.baidu.com/gaoji/advanced.html"]'))
c1 = browser.find_element("id","su")
condition = when.element_to_be_clickable(c1)

内置条件:

element_to_be_clickable 等待某个元素可以被点击

presence_of_element_located  等待某个元素出现,不管元素是否存在在页面中

visibility_of element_located 等带元素可见,要出现在页面上

扩展:

等待元素消失

一些页面会有动态的动画,比如等待页面的其他图片显示等,会出现类似的等待动画

 这个动画其实是一个页面遮罩,背景是透明,动画显示的时候,页面的其他元素不能被点击,导致定位元素出现超时报错,这个时候就需要添加显性等待元素消失

until_not(when.visibility_of_element_located(locator)

3,表示该元素在超时前,如果等待条件符合了,就会结束等待,可以执行该元素的操作,如果等待条件没出现,会报超时的错误

 # 3,在超时前,如果等待条件符合了,就会结束等待,可以执行该元素的操作,如果等待条件没出现,会报超时的错误
    search_link = wait.until(condition)
    search_link.click()

一套代码下来,表示查找到的元素已经赋予了显性等待 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值