web-dev-qa-db-ja.com

Selenium C#Webdriver要素が表示されているかどうかを検出する方法

最新バージョンのSelenium DotNet Webdriver(2.22.0)で、要素をクリックして操作する前に要素が表示されているかどうかを確認する方法はありますか?

私が見つけた唯一の方法は、キーを送信しようとしたとき、またはそれをクリックしたときに発生するElementNotVisible例外を処理しようとすることです。残念ながら、これは要素との相互作用の試みが行われた後にのみ発生します。再帰関数を使用して特定の値を持つ要素を検索していますが、これらの要素の一部は特定のシナリオでのみ表示されます(ただし、HTMLは何があっても存在するため、検索できます)。

私の理解では、RenderedWebElementクラスは他のバリアントと同様に非推奨になっています。したがって、それにキャストする必要はありません。

ありがとう。

11
user1442482

Javaの場合、RemoteWebElementにisDisplayed()があります-isEnabled()もあります

C#には、Displayed&Enabledプロパティがあります。

要素がページ上にあり、ユーザーに表示されるためには、両方が真である必要があります。

「htmlはまだ何もないので見つけることができます」の場合は、isDisplayed(Java)/ Displayed(C#)AND isEnabled(Java)/ Enabled(C#)の両方をチェックするだけです。

例、C#:

public void Test()
{
    IWebDriver driver = new FirefoxDriver();
    IWebElement element = null;
    if (TryFindElement(By.CssSelector("div.logintextbox"), out element)
    {
        bool visible = IsElementVisible(element);
        if  (visible)
        {
            // do something
        }
    }
}

public bool TryFindElement(By by, out IWebElement element)
{
    try
    {
        element = driver.FindElement(by);
    }
    catch (NoSuchElementException ex)
    {
        return false;
    }
    return true;
}

public bool IsElementVisible(IWebElement element)
{
    return element.Displayed && element.Enabled;
}
29
Arran

この質問に対する現在の回答は古くなっているようです。WebDriver3.13では、要素がページの外にある場合でも、ページに要素が存在する限り、DisplayedプロパティとEnabledプロパティの両方がtrueを返します。ビューポート。次のC#コードはWebDriver 3.13で機能します( このStackOverflowの回答 から):

{
    return (bool)((IJavaScriptExecutor)Driver).ExecuteScript(@"
        var element = arguments[0];
        var boundingBox = element.getBoundingClientRect();
        var cx = boundingBox.left + boundingBox.width/2, cy = boundingBox.top + boundingBox.height/2;
        return !!document.elementFromPoint(cx, cy);
        ", element);
}
0
bgh

これを行う簡単な方法があります。以下に従ってください。

public bool ElementDisplayed(By locator)
{
     new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)).Until(condition: ExpectedConditions.PresenceOfAllElementsLocatedBy(locator));
     return driver.FindElement(locator).Displayed ;
}
0
Ramon Freitas