我有一个最终用户页面,其中包含多个控件(文本框,复选框,下拉列表),例如30。所有这些都是从管理面板启用的。
我已将所有这些都包含在try catch块中,例如
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...
问题是,假设管理员只启用了我的代码中最后一个字段。因此,在执行脚本时,我的脚本太慢,因为它逐个检查每个元素,如果没有找到,则在catch块中处理它,直到找到最后一个元素。
有没有办法减少浪费时间?
答案 0 :(得分:1)
您可以使用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
// ...
答案 1 :(得分:0)
您可以通过以下方式管理超时:
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
如果您想要在方法的开头,然后再将其设置为您所拥有的,并且最符合您网站的需求,则可以执行此操作。
更多相关内容:http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
答案 2 :(得分:0)
在这种情况下,使用FluentWait是最可靠的方法。您应该使用driver.findElement(By)
查看,而是在常用的类中创建方法getElement(By)
,例如BasePage.class
public class BasePage { WebDriver driver; public BasePage(WebDriver driver) { this.driver = driver; } public WebElement getElement(By locator) { // Waiting 30 seconds for an element to be present on the page, checking // for its presence once every 5 seconds. Wait wait = new FluentWait(driver) .withTimeout(30, SECONDS) .pollingEvery(5, SECONDS) .ignoring(NoSuchElementException.class); // Get the web element WebElement element = wait.until(new Function() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("foo")); } }); return element; } }