Selenium С# Webdriver Как определить, является ли элемент видимым

Есть ли способ в последней версии Selenium DotNet Webdriver (2.22.0) проверить, видимо ли элемент, прежде чем нажимать/взаимодействовать с ним?

Единственный способ, которым я нашел, - попытаться обработать исключение ElementNotVisible, которое возникает при попытке отправить ключи или щелкнуть по нему. К сожалению, это происходит только после того, как была предпринята попытка взаимодействия с элементом. Я использую рекурсивную функцию для поиска элементов с определенным значением, и некоторые из этих элементов видны только в определенных сценариях (но их html все еще существует независимо от того, что они могут быть найдены).

Я понимаю, что класс RenderedWebElement устарел, а также другие варианты. Так что не кастинг с этим.

Спасибо.

Ответ 1

Для Java есть isDisplayed() в RemoteWebElement - также isEnabled()

В С# есть свойство Displayed и Enabled.

Оба должны быть истинными для того, чтобы элемент находился на странице и был видимым пользователю.

В случае "html все еще существует независимо от того, что они могут быть найдены", просто проверьте BOTH isDisplayed (Java)/Displayed (С#) AND isEnabled (Java)/Enabled (С#).

Пример, в С#:

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

Ответ 2

Кажется, что текущий ответ на этот вопрос устарел: в WebDriver 3.13 свойства Displayed и Enabled будут возвращать true, пока элемент существует на странице, даже если он находится за пределами области просмотра. Следующий код С# работает для WebDriver 3.13 (из fooobar.com/questions/6733011/...):

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

Ответ 3

Есть простой способ сделать это, следуйте ниже:

public bool ElementDisplayed(By locator)
{
     return driver.FindElement(locator).Displayed;
}