isDisplayed ищет, отображается ли элемент на экране браузера. Свойство display проверяет, находится ли какая-либо часть нарисованного элемента внутри области просмотра. Это определяется алгоритмом. В селене он реализован следующим образом.
/**
* Test whether this element is currently displayed.
*
* @return {!Promise<boolean>} A promise that will be
* resolved with whether this element is currently visible on the page.
*/
isDisplayed() {
return this.execute_(
new command.Command(command.Name.IS_ELEMENT_DISPLAYED));
}
IS_ELEMENT_DISPLAYED сам по себе является ENUM, определенным в webdriver.CommandName.
Команда передана (IS_ELEMENT_DISPLAYED) использует JsonWireProtocol для получения отображаемого свойства с использованием следующего метода get:
session/:sessionId/element/:id/displayed
GET /session/:sessionId/element/:id/displayed
Determine if an element is currently displayed.
URL Parameters:
:sessionId - ID of the session to route the command to.
:id - ID of the element to route the command to.
Returns:
{boolean} Whether the element is displayed.
Potential Errors:
NoSuchWindow - If the currently selected window has been closed.
StaleElementReference - If the element referenced by :id is no longer attached to the page's DOM.
Из W3C и JsonWireProtocol, который реализован селеном. Я цитировал это. [https://w3c.github.io/webdriver/#element-displayedness]
"Подход, рекомендованный разработчикам для определения элемента
видимость была первоначально разработана проектом Selenium и является
на основе грубых приближений о природе элемента и
отношения в дереве. Элемент, как правило, должен рассматриваться
видно, если какая-то его часть нарисована на холсте в границах
окна просмотра.
Алгоритм отображаемого элемента является логическим состоянием, где true
означает, что элемент отображается, а false означает, что
элемент не отображается. Чтобы вычислить состояние элемента, вызовите
Call (bot.dom.isShown, null, element). Если это не дает
ошибка, вернуть возвращаемое значение из этого вызова функции. Иначе
вернуть ошибку с кодом ошибки неизвестная ошибка. "
Простые слова, которые я выучил:
Если элемент отсутствует в дереве DOM, вызов isDisplayed()
сообщит NoSuchElementException
, поэтому транспортир имеет isPresent()
API.
Если размер элемента равен нулю, селен будет обрабатывать его как не показанный даже
установить dispaly: block
CSS на элемент
или значение CSS отображения его родителя / предков установлено на none
(display: none
), элемент не отображается.