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