我的网络应用程序具有在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左右不是我的选择。
答案 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();