动作和htmlunitdriver - 速度问题

时间:2013-02-07 12:10:29

标签: selenium selenium-webdriver htmlunit xpath

我的网络应用程序具有在MouseOver上打开的菜单。我正在使用htmlunitdriver编写测试。

触发菜单的测试代码是

    Actions builder = new Actions(driver);
    WebElement menu = driver.findElement(By.xpath("//a[starts-with(@href,'/index.html')]"));
    Thread.sleep(2000);
    builder.moveToElement(menu).build().perform();
    Thread.sleep(2000);
    driver.findElement(By.xpath("//a[starts-with(@href,'/submenuitem')]")).click();
    driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);

当我进行一次测试时,它通过就好了。但是当我尝试同时运行所有80个测试时,我得到了

无法使用// a [starts-with(@href,'/ submenuitem'

)定位节点

我猜这个子菜单还没有打开,htmlunitdriver的速度太快了。 Somethimes a“你可能只与单个运行中可见的元素进行交互。有人可以帮助我解决这个问题吗?使用FirefoxDriver左右不是我的选择。

2 个答案:

答案 0 :(得分:1)

您在找到implicit wait项后使用submenu。我认为隐含的等待是没有用的。使用隐式等待的最可取的地方是在初始化Driver instance后声明。

另一种解决方案,您可以使用Explicit Wait等待页面中的元素。

有关Selenium等待的详细信息,请参阅此post

答案 1 :(得分:1)

使用手动Thread.sleep(时间)等待硒动作是一个肮脏的解决方案,根本不应该使用。

相反,您可以运行检查,在与元素交互之前元素是可见的。

public void waitUntilVisible(WebDriver driver, WebElement element){
    WebDriverWait waiting = new WebDriverWait(driver, 10);
    waiting.until(ExpectedConditions.visibilityOf(element));
}

public void waitUntilClickable(WebDriver driver, By locator){
    WebDriverWait waiting = new WebDriverWait(driver, 10);
    waiting.until(ExpectedConditions.elementToBeClickable(locator));
}

Actions builder = new Actions(driver);
WebElement menu = driver.findElement(By.xpath("//a[starts-with(@href,'/index.html')]"));

waitUntilVisible(driver, menu);
builder.moveToElement(menu).build().perform();

WebElement menuItem = driver.findElement(By.xpath("//a[starts-with(@href,'/submenuitem')]"));

waitUntilClickable(driver, By.xpath("//a[starts-with(@href,'/submenuitem')]"));
menuItem.click();