web的自动化测试中,我们经常会遇到这样一种情况:当我们的程序执行时需要页面某个元素,而此时这个元素还未加载完成,这时我们的程序就会报错。怎么办?等待。等待元素出现后再进行对这个元素的操作。
在selenium-webdriver中我们用两种方式进行等待:明确的等待和隐性的等待。
明确的等待
明确的等待是指在代码进行下一步操作之前等待某一个条件的发生。最不好的情况是使用Thread.sleep()去设置一段确认的时间去等待。但为什么说最不好呢?因为一个元素的加载时间有长有短,你在设置sleep的时间之前要自己把握长短,太短容易超时,太长浪费时间。selenium webdriver提供了一些方法帮助我们等待正好需要等待的时间。利用WebDriverWait类和ExpectedCondition接口就能实现这一点。
下面的html代码实现了这样的一种效果:点击click按钮5秒钟后,页面上会出现一个红色的div块。我们需要写一段自动化脚本去捕获这个出现的div,然后高亮之。
Wait.html <html> <head> <title>Set Timeout</title> <style> .red_box {background-color: red; width = 20%; height: 100px; border: none;} </style> <script> function show_div(){ setTimeout("create_div()", 5000); } function create_div(){ d = document.createElement('div'); d.className = "red_box"; document.body.appendChild(d); } </script> </head> <body> <button id = "b" onclick = "show_div()">click</button> </body> </html>
下面的代码实现了高亮动态生成的div块的功能:
import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.WebDriverWait; public class WaitForSomthing { /** * @author gongjf */ public static void main(String[] args) { // TODO Auto-generated method stub System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe"); WebDriver dr = new FirefoxDriver(); String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html" dr.get(url); WebDriverWait wait = new WebDriverWait(dr,10); wait.until(new ExpectedCondition<WebElement>(){ @Override public WebElement apply(WebDriver d) { return d.findElement(By.id("b")); }}).click(); WebElement element = dr.findElement(By.cssSelector(".red_box")); ((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element); } }
上面的代码WebDriverWait类的构造方法接受了一个WebDriver对象和一个等待最长时间(10秒)。然后调用until方法,其中重写了ExpectedCondition接口中的apply方法,让其返回一个WebElement,即加载完成的元素,然后点击。默认情况下,WebDriverWait每500毫秒调用一次ExpectedCondition,直到有成功的返回,当然如果超过设定的值还没有成功的返回,将抛出异常。
隐性等待
隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。上面的代码就变成了这样:
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.WebDriverWait; public class WaitForSomthing { /** * @author gongjf */ public static void main(String[] args) { // TODO Auto-generated method stub System.setProperty("webdriver.firefox.bin","D:\\Program Files\\Mozilla Firefox\\firefox.exe"); WebDriver dr = new FirefoxDriver(); //设置10秒 dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html" dr.get(url); //注释掉原来的 /*WebDriverWait wait = new WebDriverWait(dr,10); wait.until(new ExpectedCondition<WebElement>(){ @Override public WebElement apply(WebDriver d) { return d.findElement(By.id("b")); }}).click();*/ dr.findElement(By.id("b")).click(); WebElement element = dr.findElement(By.cssSelector(".red_box")); ((JavascriptExecutor)dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element); } }
相关推荐
例如,可以编写一个JavaScript函数检查所有图片是否加载完成,或者等待特定的DOM元素出现。然后,使用WebBrowser的`InvokeScript`方法调用这个函数,并在返回结果表明页面准备好的时候触发一个C#事件。 4. **等待...
隐式等待是Selenium WebDriver的一种配置,用于设置一个全局默认值,表示在尝试找到页面元素时等待的最长时间。在这个例子中,`driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);` 设置了20秒的...
- 定义元素:在Selenium中,我们通常使用`find_element_by_*`系列方法来定位页面元素,如`find_element_by_id`, `find_element_by_name`, `find_element_by_xpath`等。这些元素可以封装在页面对象类中作为属性。 -...
Selenium提供了解决这一问题的方法,下面我们将详细探讨如何使用Selenium模拟浏览器动态加载页面。 首先,我们需要理解动态加载页面的工作原理。许多现代网站使用AJAX技术来提高用户体验,通过在用户滚动页面时逐步...
在Selenium自动化测试中,元素定位是...同时,结合各种等待策略,如显式等待、隐式等待,确保元素加载完成后再进行操作,以提高测试的稳定性。在编写测试用例时,注意代码的可读性和维护性,确保测试用例的可复用性。
总结起来,解决Selenium页面加载慢或超时问题的关键在于正确使用显式等待,通过等待页面中关键元素的出现,而不是等待整个页面加载完成。这不仅能提高脚本的执行效率,还能避免因页面加载问题导致的脚本崩溃。同时,...
Selenium 获取新页面元素失败的解决方法可以通过获取窗口的所有句柄,然后遍历这个句柄集合,直到存在句柄(handle)与当前窗口的句柄(currentHandle)不一样,将之前的 WebDriver 转到新的句柄(handle)所指向的...
Selenium 操作隐藏的元素(Python+Java) Selenium 是一个流行的自动化测试工具,能够模拟用户的行为来操作网页元素。但是在实际应用中,我们经常会遇到隐藏的元素,这些元素因为某些原因而不可见,从而导致 ...
2. **元素未加载完成**:如果页面元素是在动态加载的内容中,需要确保在尝试操作元素之前,整个页面或特定部分已经完全加载。可以使用`WebDriverWait`配合预期条件(Expected Conditions)来解决这个问题。 3. **...
在爬取某些网站时,页面中的内容并非一次性加载完成,而是通过JavaScript异步加载(AJAX技术)动态显示的。如果使用传统的urllib2等方式获取页面内容,可能只能获取到初始的静态页面,而遗漏了后续动态加载的数据。...
这个例子中,我们首先访问了百度网站,输入了“selenium python”进行搜索,然后等待一段时间让页面加载。接着,向下滚动200像素,找到并滚动到搜索结果中的第一个链接使其可见,最后向右滚动200像素。 总之,...
在这个场景中,我们将探讨如何利用Selenium来批量下载网页上的图片以及如何在浏览器滚动加载时同步获取更多元素。 首先,让我们详细讲解如何使用Selenium进行批量下载图片: 1. **初始化Selenium WebDriver**:...
Page Factory 会在页面加载时自动处理元素定位。 4. **POM 的优点**: - **可维护性**:当页面结构改变时,只需要修改相应的页面对象类,而不会影响到测试脚本。 - **可读性**:测试脚本变得更加简洁,因为它们只...
Selenium提供了多种方法来定位页面元素,常用的定位方法包括: 1. 使用id定位 2. 使用name定位 3. 使用链接的全部文字定位 4. 使用部分链接文字定位 5. 使用XPath定位 6. 使用CSS选择器定位 7. 使用类名称定位 8. ...
在Selenium自动化测试框架中,等待(Waits)是处理页面元素加载延迟问题的关键工具。页面元素的加载延迟可能是由网络延迟、服务器响应慢或者页面上执行JavaScript脚本导致的。在自动化测试中,如果不处理这些延迟...
Selenium 等待机制是 Selenium 自动化测试中一个非常重要的概念,它可以帮助我们在自动化测试中更好地处理页面加载和元素的出现问题。在 Selenium 中,有两种等待机制:显式等待(Explicit Wait)和隐式等待...
然而,在实际应用中,我们往往只需要等待关键元素加载完成即可进行下一步操作。因此,了解并调整Selenium的页面加载策略对于提高效率至关重要。 #### 二、设置页面加载超时 1. **页面加载超时**: - Selenium允许...
- **clickAndWait**:点击后等待页面加载完成。 #### 三、元素定位技巧 ##### 1\. 基础定位方式 - **ID定位**:`By.id()` - **Name定位**:`By.name()` - **ClassName定位**:`By.className()` - **TagName定位**...