WebDriver 显示等待和隐式等待

等待是在执行自动化任务一段时间后才继续下一步。

[b]显示等待[/b]
一个显示等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。最坏的一个例子当属Thread.sleep(),它用一段明确的等待时间作为条件。WebDriver有一些方便的方法可以帮助你写出按需等待的代码。WebDriverWait结合ExpectedCondition便是其中一种。

java
WebDriver driver = new FirefoxDriver(); driver.get("http://somedomain/url_that_delays_loading"); 
WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));


csharp
IWebDriver driver = new FirefoxDriver(); 
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); IWebElement myDynamicElement = wait.Until<IWebElement>((d) => { return d.FindElement(By.Id("someDynamicElement")); });


python
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0 ff = webdriver.Firefox() ff.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))) finally: ff.quit()


ruby
require 'rubygems' # not required for ruby 1.9 or if you installed without gem require 'selenium-webdriver' driver = Selenium::WebDriver.for :firefox driver.get "http://somedomain/url_that_delays_loading" wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds begin element = wait.until { driver.find_element(:id => "some-dynamic-element") } ensure driver.quit end


这段代码会等待10秒直到抛出TimeoutException或者它找到了相关Element,在0-10秒返回该Element。默认情况下,WebDriverWait每500ms调用一次ExpectedCondition直到其成功返回。对于Boolean类型的ExpectedCondition而言,表示成功的返回值是true,而对于所有其他类型的ExpectedCondition而言则是非空返回值。

本例与第一个隐式等待 例子在功能上是等价的.

Expected Conditions
在自动化web浏览器时有一些常用的条件。下面列出了每个条件的实现。Java恰巧有方便的方法,因此您不需要自己编写一个ExpectedCondition类或为它们创建自己的实用程序包。

元素可点击–元素已显示并且可用。
java
WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

python
from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.Id,'someid')))

ExpectedConditions包 (Java) (Python) (.NET) 含有一组可同WebDriverWait一同使用的预定义条件。

[b]隐式等待[/b]
隐式等待使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,如果Element或数组没有马上被发现的话。默认设置是0。一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用。

java
WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://somedomain/url_that_delays_loading"); 
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));


csharp
WebDriver driver = new FirefoxDriver(); driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));


python
from selenium import webdriver ff = webdriver.Firefox() ff.implicitly_wait(10) # seconds ff.get("http://somedomain/url_that_delays_loading") myDynamicElement = ff.find_element_by_id("myDynamicElement") 


ruby

require 'rubygems' # not required for ruby 1.9 or if you installed without gem require 'selenium-webdriver' driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # seconds driver.get "http://somedomain/url_that_delays_loading" element = driver.find_element(:id => "some-dynamic-element")
Selenium是一个广泛使用的自动化测试框架,它支持多种浏览器。其中,显示等待(explicit waits)等待(implicit waits)是用于处理网页元素加载时间不确定的情况。 **显示等待(Explicit Waits)**: 显示等待是一种显的暂停操作,在指定的条件满足之前,会持续等待一段时间。它需要我们明确地设置等待的时间判断条件。例如,我们可以设置等待某个特定元素(如通过`find_element_by_*()`方法找到的元素)出现、变为可用(比如元素可见或者某些属性改变),当条件成立时才会继续执行后续步骤。这种方可以避免因为网络延迟或其他不确定性导致的程序崩溃。 ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myElement")) ) ``` 这里,driver是我们正在控制的浏览器实例,10是等待的最大秒数,`EC.presence_of_element_located()`则定义了我们要等待的条件。 **等待(Implicit Waits)**: 等待则是设置全局的默认查找超时时间。在元素定位失败时,Selenium会在接下来的操作前等待一定的时间,直到找到匹配的元素。如果在这段时间内仍然找不到元素,等待就会结束,并抛出异常。设置等待通常适用于不太确定元素何时会出现的场景,但过度的等待可能会延长整体脚本运行时间。 ```python driver.implicitly_wait(5) # 设置默认查找时间为5秒 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值