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

11

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

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

据我所知,RenderedWebElement类以及其他变体都已过时。所以不能将其转换为那个类。

谢谢。


应该有一个 WebElement.isDisplayed() 方法来检查元素是否可见。 - A.J
1
不幸的是,捕获异常是解决问题的方法。Displayed和Enabled并不总是呈现可操作元素,这意味着该项可以同时显示和启用,但仍然无法点击。例如,当元素超出视图时(在某些浏览器中),就会发生这种情况,您通常需要做的是滚动到元素,使其变得可见。 - ljgww
4个回答

30

对于Java,RemoteWebElement有isDisplayed()方法,同时也有isEnabled()方法。

在C#中,有Displayed和Enabled属性。

一个元素必须同时为true才能在页面上可见。

对于“即使HTML代码存在,它们也可以被找到”的情况,只需检查isDisplayed(Java)/ Displayed(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;
}

4
我不同意,因为element.Enabled只会对显式禁用的输入元素返回false,所以可见性可以通过element.Displayed属性轻松确定。 - Gucu112

1

目前看来,这个问题的当前答案已经过时了:使用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);
}

你知道这个的C#版本吗? - Kent Abrio
是的。上面的例子是C#。 - bgh

0
你可以使用以下内容:
WebDriver web = new FirefoxDriver(;
String visibility = web.findElement(By.xpath("//your xpath")).getCssValue("display");

0

有一个简单的方法可以做到这一点,按照以下步骤操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接