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 の速度が速すぎます。ときどき、「表示されている要素とのみ対話する可能性があります」というメッセージが 1 回の実行でも発生します。誰かがこの問題を解決するのを手伝ってくれますか? FirefoxDriver などを使用することは、私にとって選択肢ではありません。

4

2 に答える 2

1

あなたはアイテムimplicit waitを見つけた後に使用していsubmenuます。そこでは暗黙の待機は役に立たないと思います。暗黙の待機を使用する最も推奨される場所は、を初期化した後に宣言することDriver instanceです。

Explicit Waitページ内の要素を待機するために使用できるもう1つのソリューション。

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 に答える