24

here でアドバイスされているように、暗黙の待機を使用する場合でも、要素の即時の非表示または非存在をアサートしたい場合があります。

言い換えれば、いくつかの要素を非表示にする必要があることを知っており、(そうでなければ便利な) 暗黙の待機のために数秒を費やすことなく、テストでそのアサーションを高速にしたいと考えています。

私が試したことの1つは、次のようなヘルパーメソッドでした:

// NB: doesn't seem to do what I want
private boolean isElementHiddenNow(String id) {
    WebDriverWait zeroWait = new WebDriverWait(driver, 0);
    ExpectedCondition<Boolean> c = invisibilityOfElementLocated(By.id(id));
    try {
        zeroWait.until(c);
        return true;
    } catch (TimeoutException e) {
        return false;
    }
}

しかし、上記のコードでは、暗黙の待機時間が経過した後until()にのみ への呼び出しが返されます。

これは私がこれまでに見つけた唯一の方法です。

@Test
public void checkThatSomethingIsNotVisible()  {
    turnOffImplicitWaits();
    // ... the actual test
    turnOnImplicitWaits();
}

...例turnOffImplicitWaits()は、一般的なSeleniumスーパークラスのヘルパーです。

protected void turnOffImplicitWaits() {
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}

しかし、それはあまりエレガントではないと思います。暗黙の待機を時々バイパスするよりクリーンな方法はありますか?

4

6 に答える 6

23

(Mike Kwan と Slanec が言ったことに基づいて) Selenium が私が望むものを直接提供していないように見えることを考えると、この単純なヘルパー メソッドは、今のところ私が行ったものです:

protected boolean isElementHiddenNow(String id) {
    turnOffImplicitWaits();
    boolean result = ExpectedConditions.invisibilityOfElementLocated(By.id(id)).apply(driver);
    turnOnImplicitWaits();
    return result;
}

private void turnOffImplicitWaits() {
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
}

private void turnOnImplicitWaits() {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

要素が非表示またはまったく存在しない場合、メソッドは true を返します。表示されている場合は false を返します。いずれにせよ、チェックは即座に行われます。

turnOffImplicitWaits() 上記を使用すると、テストケース自体におよびの呼び出しを散らかすよりも、少なくともはるかにクリーンになりturnOnImplicitWaits()ます。

同じアプローチの微調整されたバージョンについては、これらの回答も参照してください。

于 2012-06-15T09:00:19.307 に答える
7

また、要素を探す際の柔軟性を高めるために、パラメーターを「By」ロケーターに変更することをお勧めします。

protected boolean isElementHiddenNow(By locator) {
    turnOffImplicitWaits();
    boolean result = false;
    try {
       result = ExpectedConditions.invisibilityOfElementLocated(locator).apply(driver);
    }
    finally {
       turnOnImplicitWaits();
    }
    return result;
}

そうすれば、id だけでなく、必要に応じて css で検索できます。

By PartLinkLocator = By.cssSelector("div.search-result div.row a");

'もちろん、あなたのロケーターはおそらく 1 つの要素だけを返すように設計されるべきです (私がすぐにつかんだ "By" の例とは異なり、行の css テーブルですべてのパーツ リンクを返します...) したがって、"id" の例は次のようになります

By usernameLocator = By.id("inputEmail");
myResult = isElementHiddenNow(usernameLocator);
于 2014-07-28T18:32:40.503 に答える
6

私の実装:

using (driver.NoImplicitWait())
{
    ....
}

拡張メソッドを使用:

public static NoImplicitWait NoImplicitWait(this IWebDriver driver)
{
    return new NoImplicitWait(driver);
}

そしてクラス:

public sealed class NoImplicitWait : IDisposable
{
    private readonly IWebDriver _driver;

    public NoImplicitWait(IWebDriver driver)
    {
        _driver = driver;
        _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0));
    }

    public void Dispose()
    {
        _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
    }
}
于 2016-03-10T11:03:10.423 に答える
1

私のアプローチは、暗黙の待機を完全にバイパスし、それを (可視性チェックなどを追加して) 自分自身findElement()findElements()現在デフォルトで使用しているメソッドに再実装することでした。このようにして、何かをすぐに確認したい場合は、もちろん待機しない元の WebDriver メソッドを呼び出すことができます。

于 2012-06-14T15:24:22.583 に答える