我有一个最终用户页面,其中包含许多控件(文本框,复选框,下拉列表(,假设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"((; } }); 返回元素; }}