Web自动化的3种等待方式
显式等待
设定一个预期的超时时间,等待某个事件的发生,如果超时,则等待失败,抛出异常。
显示等待:指定一个最长的等待时间,在这个时间内反复地确认预期的事件是否发生了,如果发生了,则结束等待,继续执行,如果超时还未发生,则报错。
显式等待,在selenium中可以使用两种方式在until方法中指定等待的事件:
1、new expectedcondition 可以自己编写等待的事件。
2、expectedconditions 当中预定义好的静态方法指定等待事件
显式等待的优势:能够自定义等待的事件,等待时间非常灵活。
隐式等待
和显式等待的等待逻辑是一样的,设定最长的等待时间,等待预期事件的发生,区别是等待的预期事件是固定的:
等待driver.findelement方法定位的元素能够被定位到。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Webdriver对象的整个生命周期内生效。显式等待与隐式等待同时使用时注意调试,可能导致不可预知的等待时间问题。
隐式等待的优势:只需要设置一次,在driver实例化完成之后进行设置,那么在driver关闭之前,全局范围之内只要调用findelement方法,都会生效,进行等待。
隐式等待是用的最多的方式,因为简单,并且也是最常用的等待条件。所以,在driver实例化之后,直接加上隐式等待。
注意:在进行显式等待的设置时,一般只对元素定位事件以外一些特殊事件进行定义,尽量不要在使用隐式等待的同时,再加上一个等待元素能够被定位的显式等待(因为没意义),即使一定要用,最好时长设为一致。
强制等待
通过thread.sleep完成线程休眠,没有结束等待的条件,死等指定时长,一般用于不明原因的时间等待。
元素定位方法
selenium提供了两个定位元素的方法:
findelement 定位符合元素定位表达式的唯一元素,如果定位表达式能够定位到多个,取第一个。
findelements 定位符合元素定位表达式的所有元素。返回类型是List<webelement> 返回所有符合定位表达式的元素,放在list里面。
如果需要对某一组符合特定条件的元素进行批量操作,那么先编写定位表达式,定位所有符合条件的元素,然后通过findelements方法获取所有元素,再对list进行遍历操作即可。
元素定位的方式:
通过by来决定定位时使用哪种方式:
id 基于元素的id属性。
name 基于name属性进行定位
可以用xpath中的[@id='id值']和[@name='name值']代替
css selector 中的 [name='name值']
tagname 基于元素的标签名进行定位。
classname 基于元素的class属性进行定位。 class属性的唯一作用就是用于css样式的取名定义。
相当于//tagname[@class='classname']
这两个通常很难唯一定位元素。
linktext 相当于xpath的text()=‘内容’ 用精确搜索匹配a元素的文本内容
partiallinktext 相当于xpath的 contains(string(),'内容') 用模糊搜索匹配a元素的文本内容。
基于a元素的文本内容来进行定位,也就是xpath中的 text() 或者string()属性,不可以用于除了a之外的其它元素的文本定位。
xpath
cssselector
万能的定位方法,在html中的元素,都能用它们来进行定位,涵盖了上述6种定位方法。因此使用定位方法时,建议大家直接使用xpath或者cssSelector就足矣。
Webelement对象也可以调用findelement方法,从而查找元素中的子元素。
Xpath或css选择器定位时,记得先在浏览器中用开发者工具进行校验之后再写进脚本!
界面元素定位方法
xpath轴定位
总共有八个轴关键字,parent,child,ancestor祖先,descendant后裔,following,following-sibling兄弟姐妹,preceding,preceding-sibling。具体含义如下:
- parent::div 上层父节点,你那叫div的亲生爸爸,最多有一个;
- child::div 下层所有子节点,你的所有亲儿子中叫div的;
- ancestor::div 上面所有直系节点,是你亲生爸爸或者你亲爹或者你亲爹的爸爸中叫div的;
- descendant::div 下面所有节点,你的后代中叫div的,不包括你弟弟的后代;
- following::div 自你以下页面中所有节点叫div的;
- following-sibling::div 同层下节点,你所有的亲弟弟中叫div的;
- preceding::div 同层上节点,你所有的亲哥哥以及他们的后代中叫div的;
- preceding-sibling::div 同层上节点,你所有的亲哥哥中叫div的;
定位元素常见问题
定位元素常见问题定位元素常见问题
网友评论