selenium的等待

等待是做什么的,为什么需要等待

在做自动化测试,设计测试用例的时候,有时下一步的操作会依赖上一步的结果或者内容,上一步操作成功之后才能进行下一步操作等,这时候,我们就需要使用等待,来判断上一步操作是否完成,什么时候可以进行下一步操作。

否则,上一步操作如果花费的时间较长,还没有完成,就去进行下一步操作,这时就会产生无法定位到元素,元素状态不正确,数据校验结果不正确等异常。

例如在进行登录操作时,要等待登录页面加载成功,才能定位到用户名和密码输入框,然后填充用户名和密码,进行登录操作。

例如需要定位的元素在某个弹窗上,只有这个弹窗打开之后,才能定位到这个元素。

例如需要验证查询的结果,数据是否正确,就要等查询结束之后,再去定位所需要验证的数据等等。

1、强制等待:不管浏览器是否加载完成都要等待X秒,这种比较少用

Thread.sleep(X);

缺点:不能准确把握需要等待的时间(有时操作还未完成,等待就结束了,导致报错;有时操作已经完成了,但等待时间还没有到,浪费时间),如果在用例中大量使用,会浪费不必要的等待时间,影响测试用例的执行效率。

优点:使用简单,可以在调试时使用。

2、隐式等待:是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,如果元素不是马上就能定位成功就会在固定等待时长内不停去搜索元素,在设置时间内发现元素则执行后面操作,如果超出了设置的时间还没发现元素则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。

webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

缺点:使用隐式等待,程序会一直等待整个页面加载完成,才会执行下一步操作;
但有时候页面想要的元素早已经加载完成了,但是因为网页上个别元素还没有加载完成,仍要等到页面全部完成才能执行下一步,使用也不是很灵活。

优点:隐性等待对整个driver的周期都起作用,所以只要设置一次即可。

3、显式等待:显示等待是等待指定元素设置的等待时间,在设置时间内,默认每隔0.5s检测一次当前的页面这个元素是否存在,如果在规定的时间内找到了元素则执行相关操作,如果超过设置时间检测不到则抛出异常。默认抛出异常为:NoSuchElementException。做自动化的时候推荐使用显示等待

WebDriverWait wait=new WebDriverWait(driver,10);  //显示等待指定元素10秒
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//*[@id='dp']/div")));

缺点:使用相对比较复杂

优点:等待判断准确,不会浪费多余的等待时间,在用例中使用,可以提高执行效率。

ExpectedConditions的各种用法如下:

摘自:https://blog.csdn.net/qq_39704682/article/details/85596644

1、 判断当前页面的title是否精确等于预期:

titleIs( String title)

2、判断当前页面的title是否包含预期字符串:

titleContains( String title)

3、判断当前页面的url是否精确等于预期:

urlToBe( String url)

4、判断当前页面的url是否包含预期字符串:

urlContains( String fraction)

5、字符串正则表达式:

urlMatches( String regex)

6、判断元素是否出现,只要有一个元素出现,就通过。(代表在不代表可见) 判断是否至少有 1 个元素存在于 dom 树中。举个例子,如果页面上有 n 个元素的 class 都是’column-md-3’,那么只要有 1 个元素存在,这个方法就返回 True。

presenceOfElementLocated( By locator)

7、判断元素是否出现,必须所有符合条件的元素都加载出来,才通过。

presenceOfElementsLocated( By locator)

8、如果给定元素是可见的且具有非零大小,否则为null

elementIfVisible(WebElement element)

9、判断元素是否出现。

presenceOfAllElementsLocatedBy( By locator)

10、传入类型为:locator判断某个元素是否可见. 可见代表元素非隐藏,并且元素宽和高都不等于 0

visibilityOfElementLocated( By locator)

11、判断某组元素是否可见

visibilityOfAllElementsLocatedBy( By locator)

12、传入类型为:element判断某个元素是否可见. 可见代表元素非隐藏,并且元素宽和高都不等于 0

visibilityOfAllElements(final List elements)

13、判断某个元素中的text是否包含了预期的字符串;

textToBePresentInElement( WebElement element, String text)

14、判断某个元素中的 text 是否 包含 了预期的字符串

textToBePresentInElement(By locator, String text)

15、判断某个元素中的 text 是否 包含 了预期的字符串

textToBePresentInElementLocated(final By locator, final String text)

16、判断某个元素中的 value 属性是否包含 了预期的字符串

textToBePresentInElementValue( WebElement element, String text)

17、判断某个元素中的 value 属性是否包含 了预期的字符串

textToBePresentInElementValue(final By locator, final String text)

18、判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False

frameToBeAvailableAndSwitchToIt(final String frameLocator)

19、判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False

frameToBeAvailableAndSwitchToIt(final By locator)

20、某个元素中是否不存在于dom树或不可见;

invisibilityOfElementLocated(final By locator)

21、判断带有文本的元素要么不可见,要么文本不存在于元素上

invisibilityOfElementWithText(final By locator, final String text)

22、判断某个元素中是否可见并且是enable的,这样的话才叫clickable;

elementToBeClickable(final By locator)

23、判断某个元素中是否可见并且是enable的,这样的话才叫clickable;

elementToBeClickable(final WebElement element)

24、判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是 否刷新了。

stalenessOf(final WebElement element)

25、

refreshed(final ExpectedCondition condition)

26、页面元素处于被选中状态

elementToBeSelected(WebElement element)

27、判断某个元素的选中状态是否符合预期,传入element

elementSelectionStateToBe( WebElement element, boolean selected)

28、判断某个元素是否被选中了,一般用在下拉列表;

elementToBeSelected(By locator)

29、判断某个元素的选中状态是否符合预期,传入locator

elementSelectionStateToBe(final By locator, final boolean selected)

30、判断页面上是否存在alert。

alertIsPresent()

你可能感兴趣的:(#,selenium爬虫)