如何在硒网络驱动程序中手动处理等待



我有一个最终用户页面,其中包含许多控件(文本框,复选框,下拉列表(,假设30 .所有这些都从 管理面板 .

我已经将所有这些单独包含在尝试捕获块中,例如

try
{
    driver.findElement(By.locator); // For Control 1
}
catch(Exception e)
{
}
try
{
    driver.findElement(By.locator); // For Control 2
}
catch(Exception e)
{
}
and So On...

问题是,假设管理员只启用了 1 个字段,这是我代码中的最后一个字段。因此,在执行脚本时,我的脚本太慢了,因为它逐个检查每个元素,如果未找到,则在 catch 块中处理它,直到找到最后一个元素。

有什么方法可以减轻这种时间浪费吗?

您可以使用

findElements并检查是否找到任何元素。如果没有,您将获得一个空列表,没有例外。您可以构建一个方法,该方法如果元素存在则返回元素,如果不存在,则返回null

private WebElement findElement(WebDriver driver, By locator) {
    List<WebElement> elements = driver.findElements(By.locator);
    return elements.size() > 0 ? elements.get(0) : null;
}
findElements(driver, By.locator); // For Control 1
findElements(driver, By.locator); // For Control 2
// ...

您可以通过执行以下操作来管理超时:

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

如果需要,可以在方法开始时执行此操作,然后将其再次设置为您拥有的并最适合您网站的需求。

更多关于: http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp

在这种情况下,使用FluentWait是最可靠的方法。您应该使用 driver.findElement(By) 进行切入,而是创建一个方法getElement(By)在通常可访问的类中,例如 BasePage.class

公共类基本页 {    网络驱动程序驱动程序;    public BasePage(WebDriver driver( {        这个.驱动程序 = 驱动程序;    }    public WebElement getElement(By locator( {        等待 30 秒,让元素出现在页面上,检查        因为它每 5 秒出现一次。        等待等待 = 新的 FluentWait(驱动程序(            .withTimeout(30, SECONDS(            .pollingEvery(5, SECONDS(            .ignoring(NoSuchElementException.class(;        获取 Web 元素        WebElement element = wait.until(new Function(( {            public WebElement apply(WebDriver driver( {                return driver.findElement(By.id("foo"((;            }        });        返回元素;    }}

最新更新