为什么要使用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()
一套代码下来,表示查找到的元素已经赋予了显性等待