Как заставить Selenium WebDriver нажать на элемент, который в данный момент не виден? - PullRequest
95 голосов
/ 23 мая 2011

Я использую Selenium 2 Java API с FirefoxDriver. Когда я заполняю форму, флажки добавляются на страницу в зависимости от ввода формы.

Я бы хотел смоделировать щелчок по этим флажкам с помощью Selenium. Элемент видим и доступен в обычном браузере, но Селен утверждает, что элементы не видны.

"Element is not currently visible and so may not be interacted with"

Можно ли заставить селен игнорировать невидимое состояние элементов? Как заставить Selenium взаимодействовать с невидимым элементом?

Ответы [ 14 ]

100 голосов
/ 11 июня 2011

Selenium определяет, является ли элемент видимым или нет по следующим критериям (используйте инспектор DOM, чтобы определить, что CSS применяет к вашему элементу, убедитесь, что вы смотрите на вычисленный стиль):

  • visibility! =скрыто
  • display! = none (также проверяется для каждого родительского элемента)
  • opacity! = 0 (это не проверяется при нажатии на элемент)
  • оба> 0
  • для входа, тип атрибута! = скрытый

Ваш элемент соответствует одному из этих критериев.Если у вас нет возможности изменить стиль элемента, вот как вы можете принудительно сделать это с помощью javascript (предполагается, что WebDriver, так как вы сказали Selenium2 API):

((JavascriptExecutor)driver).executeScript("arguments[0].checked = true;", inputElement);

Но это победило 'Чтобы запустить событие javascript, если вы зависите от события change для этого ввода, вам придется его тоже запускать (для этого есть много способов, проще всего использовать любую библиотеку javascript, загруженную на этой странице).

Источник для проверки видимости -

https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L577

Спецификация WebDriver, которая определяет это -

https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html#widl-WebElement-isDisplayed-boolean

27 голосов
/ 23 апреля 2012

Иногда это означает, что на странице есть несколько элементов, обладающих тем же свойством, по которому вы пытаетесь выполнить поиск, и вы «говорите не с тем».

Если ваш элемент не может быть однозначно идентифицирован с помощью: id или: name (или: class), это может быть сложно.

Иногда поиск элемента с помощью: xpath поможет, а в некоторых случаях даже это нецелесообразно.

В этих случаях вам, возможно, придется получить все элементы, которые соответствуют вашим критериям, и указать правильный индекс по индексу. Это грязно, но работает.

Я использую Selenium / Watir из приложения Ruby on Rails, поэтому в моем случае пример будет:

browser = Watir::Browser.new(:firefox, :profile => "default")       
browser.goto("http://www.google.com/analytics")
# login
browser.divs(:text, "+ New Property").last.click

Надеюсь, это поможет.

15 голосов
/ 10 января 2015

У меня была похожая проблема, но она была связана с тем, что элемент не виден в окне просмотра. Я сделал скриншот и понял, что окно браузера слишком узкое, и элемент не виден. Я сделал один из них, и это сработало:

driver.maximize_window()

См .: WebDriver.maximize_window ()

7 голосов
/ 12 августа 2015

Или вы можете использовать Selenium Action Class для симуляции взаимодействия с пользователем - например,

    WebDriver = new FirefoxDriver();

    WebElement menu = driver.findElement(By.xpath("")); // the triger event element

    Actions build = new Actions(driver); // heare you state ActionBuider
    build.moveToElement(menu).build().perform(); // Here you perform hover mouse over the needed elemnt to triger the visibility of the hidden
    WebElement m2m= driver.findElement(By.xpath(""));//the previous non visible element
    m2m.click();
6 голосов
/ 14 ноября 2013

Существует также другой случай, когда видимый элемент будет распознан как невидимый:

  • Когда элемент преобразован в CSS
  • Когда родительский элемент элемента преобразован в CSS

Чтобы проверить, является ли элемент, с которым вы не хотите взаимодействовать, преобразованным CSS, в CHROME сделайте следующее:

  1. открытый инспектор
  2. Найти интересующий элемент (или, более вероятно, его родительский элемент, предположительно div-элемент)
  3. Выберите вкладку 'Computed'
  4. , если есть параметр: webkit-transform: matrix (...), это означает, что элемент являетсяCSS преобразуется и может не распознаваться селеном 2 как видимый элемент
5 голосов
/ 18 ноября 2013

Невидимость также может быть вызвана временем, когда элемент должен медленно появляться. В этом случае может помочь принудительное ожидание браузера.

См., Например, вопрос о том, как позволить WebDriver дождаться появления элемента .

2 голосов
/ 23 мая 2015

Вы не можете принудительно получить доступ / изменить элемент, к которому пользователь обычно не имеет доступа, поскольку Selenium предназначен для имитации взаимодействия с пользователем.

Если эта ошибка возникает, проверьте:

*Элемент 1004 * виден в вашем окне просмотра, попытайтесь развернуть текущее окно, используемое веб-драйвером (например, maximize() в node.js , maximize_window() в Python), ваш элемент не появляется дважды (под одним и тем же селектором), и вы выбираете неправильный, , если ваш элемент скрыт, а затем подумайте о созданииэто видно, , если вы хотите получить доступ / изменить значение скрытого элемента, несмотря на ограничение, то используйте для этого Javascript (например, executeScript() в node.js, execute_script() в Python).
2 голосов
/ 28 ноября 2012

У меня была такая же проблема с селеном 2 в Internet Explorer 9, но мое исправление действительно странное. Я не смог нажать на входы внутри моей формы -> повторы селена, их не видно.

Это произошло, когда моя форма имела изогнутые тени -> http://www.paulund.co.uk/creating-different-css3-box-shadows-effects: в конкретном «Эффекте № 2»

Понятия не имею, почему и как это решение с псевдоэлементом остановило тесты на селен, но оно работает для меня.

1 голос
/ 08 февраля 2018

Я получаю исключение ElementNotVisibleException, использующее селен для функциональных тестов на сайте django с загрузочными глификонами в качестве ссылок в шаблонах:

<a href="{% url 'item-add' %}"><span class="glyphicon glyphicon-plus text-danger"></span></a>

Во время моих функциональных тестов стиль начальной загрузки не загружается, поэтому попытка щелкнуть по таким ссылкам вызовет исключение ElementNotVisibleException. Мне удается сделать их кликабельными , просто добавив в тег пробел , например:

<a href="{% url 'item-add' %}"><span class="glyphicon glyphicon-plus text-danger">&nbsp;</span></a>
1 голос
/ 03 мая 2017

Я просто решаю эту ошибку, ожидая свойства отображения элемента

waitFor() { element.displayed }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...