web-dev-qa-db-ja.com

セレン-要素が表示されなくなるまで待つ

以下のコードでは、要素が表示されるまで待機しようとしています:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("processing")));

その要素が表示されなくなるまで待つようにドライバーに指示することは可能ですか?

26
user2917239

はい、メソッドinvisibilityOfElementLocatedで可能です

wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
30
TDHM

以下は、要素が表示されなくなるまで、つまり表示されなくなるまで(または10秒後にタイムアウトになるまで)待機する必要があります

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(driver => !driver.FindElement(By.Id("processing")).Displayed);

Id processingを持つ要素が見つからない場合、例外をスローします。

10
Russ Cam
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));

アイデアは、要素が表示されなくなるまで待つことです。最初の行は、要素が消えるまでの待ち時間を設定します。ここでは10秒です。 2行目はSeleniumを使用して、「invisibilityofElementLocated」の条件が満たされているかどうかを確認します。トピックの場合のように、要素はそのIDによって検出されます。つまり、id="processing"。要求された期間内に要素が消えない場合、タイムアウト例外が発生し、テストは失敗します。

5
Me Like Cookies

不可視の方法を使用してください。ここに使用例があります。

final public static boolean waitForElToBeRemove(WebDriver driver, final By by) {
    try {
        driver.manage().timeouts()
                .implicitlyWait(0, TimeUnit.SECONDS);

        WebDriverWait wait = new WebDriverWait(UITestBase.driver,
                DEFAULT_TIMEOUT);

        boolean present = wait
                .ignoring(StaleElementReferenceException.class)
                .ignoring(NoSuchElementException.class)
                .until(ExpectedConditions.invisibilityOfElementLocated(by));

        return present;
    } catch (Exception e) {
        return false;
    } finally {
        driver.manage().timeouts()
                .implicitlyWait(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    }
}
2
1-14x0r

driver.FindElementsを使用して、存在しないアイテムにアクセスできます。

wait.Until(d => d.FindElements(By.Id("processing")).Count == 0);

はい、独自のExpectedConditionを作成し、表示をnot visibleに戻すだけです。

Pythonでそれを行う方法は次のとおりです。

from Selenium.webdriver.support.expected_conditions import _element_if_visible

class invisibility_of(object):

    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        return not _element_if_visible(self.element)

そして、それを使用する方法:

wait = WebDriverWait(browser, 10)
wait.until(invisibility_of(elem))
0
Sergey

私はこれが古いことを知っていますが、これに対する解決策を探していたので、私は自分の考えを追加すると思いました。

IgnoreExceptionTypesプロパティを設定すると、上記の答えが機能するはずです。

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.IgnoreExceptionTypes = new[] { typeof(NoSuchElementException) }
wait Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
0
bornfromanegg
public void WaitForElementNotVisible(string id, int seconds)
    {

        try
        {
            var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(seconds));                   
            wait.Until(driver1 => !visibility(id));
            Console.WriteLine("Element is not visible..");
        }
        catch (WebDriverTimeoutException)
        {
            Assert.Fail("Element is still visible..");
        }


    }


    bool visibility(string id)
    {
        bool flag;
        try
        {
            flag = driver.FindElement(By.Id(locator)).Displayed;
        }
        catch (NoSuchElementException)
        {
            flag = false;
        }
        return flag;
    }
0
Anoop