硒C#的webdriver如何检测如果元素是可见(Selenium C# Webdriver How

2019-07-29 18:42发布

是否有DOTNET的硒webdriver的(2.22.0)的最新版本的方式来检查,看看是否元素点击之前是可见/与其交互?

我发现的唯一方法是尽量处理,当您尝试发送键或点击它时出现的ElementNotVisible例外。 不幸的是已经取得了与要素互动的尝试后,才会出现这种情况。 我使用递归函数来找到具有一定的价值元素,这些元素都只是在某些情况下可见的(但他们的HTML仍然存在,不管是什么,这样他们就可以找到)。

这是我的理解是,RenderedWebElement类是过时以及其他变体。 因此,没有铸造了这一点。

谢谢。

Answer 1:

对于Java有isDisplayed()在RemoteWebElement - 以及是的IsEnabled()

在C#中,有一个显示和Enabled属性。

一个元素是页面和用户可见的两个必须是真实的。

在的情况下, “HTML仍然存在,不管是什么,这样他们就可以找到”,简单地检查这两个isDisplayed(JAVA)/显示(C#)和的IsEnabled(JAVA)/启用(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;
}


Answer 2:

看来目前这个问题的答案已经过时:随着3.13的webdriver同时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);
}


Answer 3:

有一个简单的方法来做到这一点,请按照下列:

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


文章来源: Selenium C# Webdriver How to detect if element is visible