Selenium C#Webdriver如何检测元素是否可见

时间:2012-06-07 14:55:04

标签: selenium webdriver visibility visible

最新版本的Selenium DotNet Webdriver(2.22.0)中是否有办法在点击/与之交互之前检查元素是否可见?

我发现的唯一方法是尝试处理尝试发送密钥或单击它时发生的ElementNotVisible异常。不幸的是,这只发生在尝试与元素交互之后。我正在使用递归函数来查找具有特定值的元素,其中一些元素仅在某些情况下可见(但无论如何它们的html仍然存在,因此可以找到它们。)

我的理解是不推荐使用RenderedWebElement类以及其他变体。所以没有铸造。

感谢。

3 个答案:

答案 0 :(得分:28)

对于Java,RemoteWebElement上有isDisplayed() - isEnabled()

在C#中,有一个显示&启用属性。

对于要在页面上显示且对用户可见的元素,两者都必须为true。

如果“html仍然存在,那么可以找到它们”,只需检查是否显示(Java)/显示(C#)和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;
}

答案 1 :(得分:0)

该问题的当前答案似乎已过时:使用WebDriver 3.13,只要元素存在于页面上,则DisplayedEnabled属性都将返回true,即使该元素位于页面之外视口。以下C#代码适用于WebDriver 3.13(来自this StackOverflow answer):

{
    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);
}

答案 2 :(得分:0)

有一个简单的方法可以做到这一点,如下:

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