关于selenium的智能等待页面加载的问题
Posted 碎冰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于selenium的智能等待页面加载的问题相关的知识,希望对你有一定的参考价值。
我们经常会碰到用selenium操作页面上某个元素的时候,需要等待页面加载完成后,才能操作, 否则页面上的元素不存在,会抛出异常。
或者碰到AJAX异步加载,我们需要等待元素加载完成后,才能操作。
首先来讲,我们最不推荐的就是使用 Thread.sleep( ) ; 这个也叫做线程休眠。
这种写法通常是固定了一个时间,然而我们不知道页面具体的等待情况,有快有慢,虽然很百搭,但是并不适用于框架中。
selenium 中提供了非常简单,智能的方法,来判断元素是否存在。我来简单的举例说明几种(在我使用的过程中,我会逐步添加到这里)
阅读目录(ctrl+F,根据自己所需来搜索查看吧):
- 实例要求
- 隐式等待
- 显式等待
实例要求
实例:set_timeout.html
下面的html 代码, 实现的是点击click 按钮5秒后, 页面上会出现一个红色的div快, 我们需要写一段自动化脚本智能的去判断这个div是否存在, 然后把这个div高亮。
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <title>Set Timeout</title> 8 <style> 9 .red_box {background-color: red; width:20%; height: 100px; border: none;} 10 </style> 11 <script> 12 function show_div(){ 13 setTimeout("create_div()", 5000); 14 } 15 16 function create_div(){ 17 d = document.createElement(‘div‘); 18 d.className = "red_box"; 19 document.body.appendChild(d); 20 } 21 </script> 22 </head> 23 <body> 24 <button id = "b" onclick = "show_div()">click</button> 25 </body> 26 </html>
隐式等待
通常,我们会这么写
1 WebDriver driver = new FirefoxDriver(); 2 driver.get("file:///C:/Users/Tank/Desktop/set_timeout.html"); 3 4 driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 5 WebElement element = driver.findElement(By.cssSelector(".red_box")); 6 ((javascriptExecutor)driver).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);
其中
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
意思是, 总共等待10秒, 如果10秒后,元素还不存在,就会抛出异常 org.openqa.selenium.NoSuchElementException。
换句话说,当元素没有立即出现,隐式等待将等待一段时间再查找。
一旦设置了隐式等待,则会存在整个WebDriver对象实例的声明周期中,它将寻找每个元素的时候都进行等待,增加整个测试执行的时间。
即针对全局设置的,webdriver中执行所有命令的超时时间都设置为10秒了。
显式等待
显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间或条件之内都没找到,那么就跳出Exception.
一般使用ExpectedConditions类中自带方法,点击查看API页
显式等待可以自定义等待的条件,用于更加复杂的页面等待条件
等待的条件 |
WebDriver方法 |
页面元素是否在页面上可用和可被单击 |
elementToBeClickable(By locator) |
页面元素处于被选中状态 |
elementToBeSelected(WebElement element) |
页面元素在页面中存在 |
presenceOfElementLocated(By locator) |
在页面元素中是否包含特定的文本 |
textToBePresentInElement(By locator) |
页面元素值 |
textToBePresentInElementValue(By locator, java.lang.String text) |
标题 (title) |
titleContains(java.lang.String title) |
只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑
如果超过设定的最大显式等待时间阈值, 测试程序会抛出异常。
1 public static void testWait2(WebDriver driver) { 2 driver.get("file:///C:/Users/Ice/Desktop/set_timeout.html"); 3 4 WebDriverWait wait = new WebDriverWait(driver, 20); 5 wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".red_box"))); 6 WebElement element = driver.findElement(By.cssSelector(".red_box")); 7 ((JavascriptExecutor) driver).executeScript("arguments[0].style.border = \"5px solid yellow\"", element); 8 }
以上就是对Java selenium 等待页面加载的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!
以上是关于关于selenium的智能等待页面加载的问题的主要内容,如果未能解决你的问题,请参考以下文章
Java Selenium 操作弹出窗口 & 智能等待页面加载完成 & 处理 Iframe 中的元素
如何用python的selenium提取页面所有资源加载的链接