提高selenium自动化的稳定性2-等待

本文介绍了Selenium WebDriver中处理页面元素动态加载的几种等待方法,包括直接sleep、隐式等待及显式等待的具体实现与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多页面元素都是ajax动态生成的,这就要求进行适当的等待

如何进行等待呢?

1.直接sleep

public static void sleep(int seconds) {
    try {
        TimeUnit.SECONDS.sleep(seconds);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

这种方法,用于直接的让thread进行等待指定的seconds。

2.使用selenium webdriver提供的等待方法

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

这种方法是webdriver提供的一种隐式等待。
隐式等待是指当要查找元素(driver.findElement()),而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。
比如使用:driver.findElement(By.id("element"));来查找id=”element”的元素。如果没有设置隐式等待,那么执行到这一步的时候就会直接报错NoSuchElementException。而设置后,则会在10秒内不断就查询元素是否存在,如果存在则返回。超过10秒仍没找到,才报错。

3.使用WebDriver提供的Wait<T>接口

FluentWait<T> implements Wait<T>  

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
   .withTimeout(30, SECONDS)
   .pollingEvery(5, SECONDS)
   .ignoring(NoSuchElementException.class);

WebElement element = wait.until(new Function<WebDriver, WebElement>() {
 public WebElement apply(WebDriver driver) {
   return driver.findElement(By.id("element"));
 }
});
element.click();//something to do

此方法用于等待一个元素在页面上出现,超时时间为30S,每隔5S去请求一次,并且忽略掉until中抛出的NoSuchElementException
FluentWait的源码中这样写到:

private Duration timeout = FIVE_HUNDRED_MILLIS;  
private Duration interval = FIVE_HUNDRED_MILLIS;   

因此,如果不设置withTimeoutpollingEvery则相当于等待了500ms,并且请求了一次,要使用FluentWait应该依据实际需要进行设置。那有没有更好的方法呢,有的,请往下看。

WebDriverWait extends FluentWait<WebDriver>

Wait<WebDriver> waiter = new WebDriverWait(driver, 10);
WebElement element = waiter.until(new Function<WebDriver, WebElement>() {
        public WebElement apply(WebDriver driver) {
            return driver.findElement(By.id("element"));
        }

    });
element.click();//something to do

WebDriverWait是继承于FluentWait的,并且实现了对功能进行了增强。从源码看出WebDriverWait的构造函数进行了如下的设置:

withTimeout(timeOutInSeconds, TimeUnit.SECONDS);
pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS);
ignoring(NotFoundException.class);

设置了超时时间、每次请求的间隔为sleepTimeOut(默认500ms)、忽略了NotFoundException。因此直接使用WebDriverWait更加的省事。

总结

WebDriver提供了很多等待机制来增加selenium自动化的稳定性,只要合理利用是可以达到理想的效果的。
无疑第一种方法sleep是最不可取的,是万不得已才用的一份方法,因为元素的加载与网络速度等客观因素直接相关。这个sleep的值是很难取的,值小了不行,值大了会造成case的运行速度缓慢。
第二种方法是从全局的角度来解决元素查找问题的,在解决通用性的问题上有一定的优势,可以考虑使用。
第三种方法是最好的,也是推荐的一种等待方式,很好的解决了动态元素的查找问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值