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

问题描述 投票:0回答:5

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

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

据我了解,RenderedWebElement 类以及其他变体均已弃用。所以没有选角。

谢谢。

selenium webdriver visibility visible
5个回答
30
投票

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

在 C# 中,有一个 Displayed & Enabled 属性。

两者都必须为真,元素才能出现在页面上并且对用户可见。

在“无论如何,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;
}

1
投票

这个问题的当前答案似乎已经过时:在 WebDriver 3.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
投票

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

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

0
投票

您可以使用以下内容:

WebDriver web = new FirefoxDriver(;
String visibility = web.findElement(By.xpath("//your xpath")).getCssValue("display");

0
投票

试试这个:

  if(webDriver.FindElements(By.ClassName("registerOrLogin_closeButton")).Count() > 0)
  webDriver.FindElement(By.ClassName("registerOrLogin_closeButton")).Click();
© www.soinside.com 2019 - 2024. All rights reserved.