0

我的 Web 应用程序具有在 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速度太快了。有时会出现“您只能在单次运行时与可见的元素进行交互。有人可以帮我解决这个问题吗?使用 FirefoxDriver 左右对我来说不是一个选项。

4

2 回答 2

1

implicit wait在找到该submenu项目后使用。我认为那里没有隐式等待。使用隐式等待最可取的地方是在初始化Driver instance.

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

有关 Selenium 等待的更多信息,请参阅这篇文章。

于 2013-02-08T10:07:01.133 回答
1

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

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

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();
于 2013-02-12T05:08:55.897 回答