Как может Selenium пакет много isElementDisplayed звонки?

Selenium имеет удобный механизм для извлечения десятков или сотен элементов из DOM достаточно эффективно и в одном быстром круговом движении:

buttons = driver.find_elements_by_css_selector('button') 

buttons результатов могут представлять собой список из десятков или сотен элементов без каких-либо проблем.

Но при медленном сканировании, если вы хотите отфильтровать элементы, используя is_displayed() (или как Java вызывает его, isElementDisplayed ), потому что каждый вызов метода включает isElementDisplayed обратно в браузер. Даже на моей самой быстрой машине разработки каждый такой вызов занимает около 0,1 с, что означает, что следующий фильтр через 100 элементов занимает 10 секунд (!):

 [b.is_displayed() for b in buttons] 

Такая же проблема возникает, если вы хотите искать кнопку с определенным текстом, потому что каждый поиск атрибута .text фактически вызывает свойство со своим обратным возвратом обратно в браузер:

 [('Subscribe' in b.text) for b in buttons] 

Это затрудняет запись надежных тестов Selenium, которые обращают внимание на две вещи, которые действительно обращены к DOM: является ли элемент видимым и какой текст он содержит. Хотя поворот полностью от видимости и текстового содержимого – скажем, к уникальным идентификаторам или комбинациям классов или местоположения документа – заставит наши тесты работать быстрее, это создаст невидимую связь между нашими тестами Selenium и кнопкой, которую она искала, вместо этого позволяя нашим испытаниям следить за работой пользователя и тем, что пользователи могут видеть и читать на экране.

Мой вопрос:

  • Есть ли способ применить is_displayed() или text тест к элементам в браузере во время первоначальной выборки элементов?

  • Или еще есть способ сделать пакетный is_displayed() который запрашивает множество элементов, а не только один?

  • Или время отклика 0,1 с от теста Python до Selenium под Firefox просто совершенно необоснованно и работает быстрее для всех остальных, и поэтому очевидных серийных версий этих общих операций не существует?

Я подумал, что могу просто повернуть на выполнение execute_script() из Python (Java name: executeScript() ), и изнутри моего кода JavaScript каким-то образом выполняется логика Selenium, которая лежит за сложной идеей «этот элемент виден». К сожалению, executeScript() , похоже, не дает скриптам доступа к любой из функций утилиты, которые Selenium сам считает необходимыми, поэтому, чтобы получить доступ к видимой функции, нам пришлось бы вытащить либо jQuery, либо случайный фрагмент кода Selenium на страницы, которые в противном случае не хватает их, мешая всей концепции теста: он тестирует страницу как есть, не меняя профиль JS просто для того, чтобы запустить наш тест.

Спасибо за любые идеи! Я довольно удивлен тем, что Selenium ожидает, что вызывающие функции executeScript() будут восстанавливать возможности, такие как is_displayed() что, как может executeScript() на executeScript() кода, является главной особенностью Selenium, которая выглядит так, что потребовалось много работы, чтобы получить правильные результаты и что хотелось бы получить доступ ко всему возможному коду, чтобы избежать повторного создания такого важного колеса.

One Solution collect form web for “Как может Selenium пакет много isElementDisplayed звонки?”

Из того, что я понимаю после изучения исходного кода selenium python bindings, нет возможности отправлять команды, например isElementDisplayed , партиями. execute() , который отвечает за передачу команды через JSON Wire Protocol, обрабатывает только одну команду за раз.

FYI, вот базовый алгоритм isDisplayed() из спецификации w3c webdriver. И, я думаю, это то, что сам хром webdriver реализовал .

В качестве обходного пути и опираясь на это решение , мы можем выполнить javascript (не тестировался):

 script = """ function isHidden(el) { var style = window.getComputedStyle(el); return (style.display === 'none') } var result = []; for (var i = 0; i < arguments.length; i++) { result.push(isHidden(arguments[i])); } return result; """ driver.execute_script(script, *buttons) 

Обратите внимание, что это не более чем обходной путь, поскольку, строго говоря, он даже не близок к тому, что действительно делает webdriver для определения видимости.

Говоря о проверке text значения элементов кнопки, одним из возможных способов обхода, помимо использования аналогичного метода execute_script() , было бы использование выражения XPath и проверка текста:

 buttons = driver.find_elements_by_xpath('//button[contains(., "some text")]') 
  • Selenium / python: извлекать текст с динамически загружаемой веб-страницы после каждого прокрутки
  • Использование Selenium для выбора привязки с определенным контентом
  • Webdriver phantomjs больше не ссылается на ссылку на клик
  • Selenium python не может прокручиваться вниз
  • Получение сообщения «h: null»
  • Python Selenium - AttributeError: объект WebElement не имеет атрибута sendKeys
  • Selenium-Python: взаимодействие с системными модальными диалогами
  • Загрузка с хромированным безголовым и селеном
  • Python - Selenium в Ubuntu OSError: Не каталог
  • Использование Python / Selenium / Лучший инструмент для задания для получения URI запросов изображений, созданных с помощью JavaScript?
  • Как подражать Firefox «Сохранить файл» -> ОК в Python
  • Python - лучший язык программирования в мире.