Selenium как открыть браузер

Обновлено: 07.07.2024

Продолжение перевода неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.

Содержание:

2.1. Простое использование

Если вы установили привязку Selenium к Python, вы можете начать использовать ее с помощью интерпретатора Python.


Код выше может быть сохранен в файл (к примеру, python_org_search.py), и запущен:

Запускаемый вами Python должен содержать установленный модуль selenium.

2.2. Пошаговый разбор примера

Модуль selenium.webdriver предоставляет весь функционал WebDriver'а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…


Далее создается элемент класса Firefox WebDriver.


Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:


Следующая строка — это утверждение (англ. assertion), что заголовок содержит слово “Python” [assert позволяет проверять предположения о значениях произвольных данных в произвольном месте программы. По своей сути assert напоминает констатацию факта, расположенную посреди кода программы. В случаях, когда произнесенное утверждение не верно, assert возбуждает исключение. Такое поведение позволяет контролировать выполнение программы в строго определенном русле. Отличие assert от условий заключается в том, что программа с assert не приемлет иного хода событий, считая дальнейшее выполнение программы или функции бессмысленным — Прим. пер.]:


WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:


После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:


В завершение, окно браузера закрывается. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью:

2.3. Использование Selenium для написания тестов


Вы можете запустить тест выше из командной строки следующей командой:

Результат сверху показывает, что тест завершился успешно.

2.4. Пошаговый разбор примера

Сначала были импортированы все основные необходимые модули. Модуль unittest встроен в Python и реализован на Java’s JUnit. Этот модуль предоставляет собой утилиту для организации тестов.

Модуль selenium.webdriver предоставляет весь функционал WebDriver'а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…


setUp — это часть инициализации, этот метод будет вызываться перед каждым методом теста, который вы собираетесь написать внутри класса теста. Здесь мы создаем элемент класса Firefox WebDriver.


Далее описан метод нашего теста. Метод теста всегда должен начинаться с фразы test. Первая строка метода создает локальную ссылку на объект драйвера, созданный методом setUp.


Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:


Следующая строка — это утверждение, что заголовок содержит слово “Python”:


WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:


После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:


Метод tearDown будет вызван после каждого метода теста. Это метод для действий чистки. В текущем методе реализовано закрытие окна браузера. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью.:


Завершающий код — это стандартная вставка кода для запуска набора тестов [Сравнение __name__ с "__main__" означает, что модуль (файл программы) запущен как отдельная программа («main» (англ.) — «основная», «главная») (а не импортирован из другого модуля). Если вы импортируете модуль, атрибут модуля __name__ будет равен имени файла без каталога и расширения — Прим. пер.]:

2.5. Использование Selenium с remote WebDriver


Для использования remote WebDriver (удаленного веб-драйвера) необходимо запустить Selenium server. Для запуска сервера используйте команду:

Строка выше сообщает о том, что вы можете использовать указанный URL для подключения remote WebDriver. Ниже приводится несколько примеров:


Переменная desired_capabilities — это словарь. Вместо того, чтобы использовать словари по умолчанию, вы можете явно прописать значения:

Как открыть новую вкладку в существующем браузере Firefox с помощью Selenium WebDriver (a.к. a. Селен 2)?

приведенный ниже код откроет ссылку на новой вкладке.

код ниже откроет пустую новую вкладку.

обратите внимание, что фактические ключи для отправки зависят от вашей ОС, например, Mac использует COMMAND + t , вместо CONTROL + t .

Рубин

Python

почему бы не сделать это

попробуйте это для браузера FireFox.

ниже кода откроется ссылка в новом окне

чтобы открыть новое окно в Chrome Driver.

вы можете использовать следующий код, используя Java с Selenium WebDriver:

С помощью JavaScript:

чтобы открыть новую вкладку в существующем браузере Chrome с помощью Selenium WebDriver, вы можете использовать этот код:

Я использую Selenium 2.52.0 в Java и Firefox 44.0.2. К сожалению, ни одно из вышеперечисленных решений не сработало для меня. Проблема в том, что я водитель вызова.getWindowHandles () я всегда получаю 1 одну ручку. Почему-то это имеет смысл для меня, как Firefox-это один процесс и каждая вкладка отдельный процесс. Но может я ошибаюсь. Во всяком случае, я пытаюсь написать свое собственное решение:

я использовал комбинацию Ctrl+t, чтобы открыть новую вкладку, Ctrl+w, чтобы закрыть ее, и вернуться к исходной вкладке, которую я использовал Ctrl+1 (первая вкладка). Я знаю, что мое решение не идеально или даже хорошо, и я также хотел бы переключиться с вызовом switchTo водителя, но, как я написал, это было невозможно, поскольку у меня была только одна ручка. Возможно, это будет полезно для кого-то с такой же ситуацией.

у меня были проблемы с открытием новой вкладки в chrome на некоторое время. Даже driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t"); не сработало для меня.

я узнал, что недостаточно того, что selenium фокусируется на драйвере, окна также должны иметь окно спереди.

моим решением было вызвать предупреждение в chrome, которое выведет окно вперед, а затем выполнит команду. пример кода:

использование Selenium WebDriver с JAVA , Я пытаюсь автоматизировать функциональность, где я должен открыть новую вкладку, сделать некоторые операции там и вернуться к предыдущей вкладке (родительской). Я использовал ручку переключателя, но она не работает. И одна странная вещь, две вкладки имеют одинаковый дескриптор окна, из-за которого я не могу переключаться между вкладками.

однако, когда я пытаюсь с разными окнами Firefox, он работает, но для вкладки он не работает.

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

(Я заметил , что при открытии разных вкладок в одном окне дескриптор окна остается неизменным.)

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

Это простое решение для открытия новой вкладки, изменения фокуса на нее, закрытия вкладки и возврата фокуса на старую / исходную вкладку:

существует разница в том, как веб-драйвер обрабатывает разные окна и как он обрабатывает разные вкладки.

Пример 1:
В случае, если есть несколько окон, то следующий код может помочь:

Пример 2:
Если в одном окне есть несколько вкладок, то есть только один дескриптор окна. Следовательно, переключение между дескрипторами окон сохраняет элемент управления на одной вкладке.
в этом случае с помощью Ctrl + \t (Ctrl + Tab) для переключения между вкладками более полезно.

обойти

предположение : нажав что-то на веб-странице приводит к открытию новой вкладки.

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

таким же образом вы можете снова переключиться на первую вкладку.

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

первое, что вам нужно сделать, это открыть новую вкладку и сохранить его дескриптор имя. Лучше всего сделать это с помощью javascript, а не клавиш (ctrl+t), поскольку ключи не всегда доступны на серверах автоматизации. пример:

второе, что вам нужно сделать, это переключение между вкладками. Делать это только переключателями окон, не всегда будет работать, так как вкладка, на которой вы будете работать, не всегда будет в фокусе, и селен будет время от времени терпеть неудачу. Как я уже сказал, Это немного проблематично использовать клавиши, и javascript действительно не поддерживает переключение вкладок, поэтому я использовал оповещения для переключения вкладок, и это сработало как шарм:

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

с Selenium 2.53.1 с использованием firefox 47.0.1 в качестве WebDriver в Java: независимо от того, сколько вкладок я открыл, "драйвер.getWindowHandles () " вернет только один дескриптор, поэтому невозможно переключаться между вкладками.

Как только я начал использовать Chrome 51.0, я мог получить все ручки. В следующем коде показано, как получить доступ к нескольким драйверам и нескольким вкладкам в каждом драйвере.

надеюсь, это дает вам хорошее представление о том, как работать с несколькими вкладками в несколько окна браузера.

С driver.window_handles не в порядке, лучшим решением является это.

первый переход на первую вкладку с помощью ярлыка Control + X перейти на вкладку " x " в окне браузера .

недавно у меня была проблема, ссылка была открыта на новой вкладке, но selenium сосредоточился все еще на начальной вкладке.

Я использую Chromedriver, и единственный способ сосредоточиться на вкладке - использовать switch_to_window() .

таким образом, совет должен узнать имя дескриптора окна, которое вам нужно, они хранятся как список в

пожалуйста, см. ниже:

надеюсь, это полезно!

это очень простой процесс: предположим, у вас есть две вкладки, поэтому вам нужно сначала закрыть текущую вкладку с помощью client.window(callback) потому что команда switch "переключается на первый доступный". Затем вы можете легко переключить вкладку с помощью client.switchTab .

краткий пример, как переключаться между вкладками в браузере (в случае с одним окном):

Я пишу Thread.sleep(2000) просто тайм-аут, чтобы увидеть переключение между вкладками.

вы можете использовать CTRL + TAB для перехода на следующую вкладку и CTRL+SHIFT+TAB для перехода на предыдущую вкладку.

Selenium сегодня является стандартом де-факто для автоматизации выполнения тестов в браузерах. Все популярные браузеры поддерживаются из коробки, а архитектура хорошо известна. Существуют даже компании, предоставляющие Selenium за деньги. Но удобен ли обычный Selenium сервер для локальной отладки тестов?





Проблема

Как веб-разработчик или инженер по автоматизации тестирования вы можете столкнуться со следующими неудобствами при работе со стандартным Selenium сервером:

  1. Нужно устаналивать несколько разных браузеров себе на компьютер. В обычной жизни вы, как правило, используете один браузер, например, Chrome, но вам приходится устанавливать себе Firefox и Opera, чтобы отлаживать в них Selenium-тесты.
  2. Трудно устанавливать и использовать несколько версий одного браузера. Если вы устанавливаете браузер из пакетов, то вообще можно иметь только одну установленную версию. Кроме того Selenium и его веб-драйверы обычно ищут исполняемый файл браузера по определенному пути. Поэтому, поверьте, использовать несколько версий может быть трудной задачей.
  3. Если вы запускаете браузер, установленный в вашей операционной системе — он забивает место на диске своими временными файлами и содержимым кеша.
  4. Нельзя гарантировать, что настройки браузера всегда останутся в том же состоянии, как после чистой установки. Например, вы можете случайно изменить адрес прокси-сервера или настройки безопасности. Это может привести к падению ранее работавших тестов.
  5. Трудно запускать несколько тестов в разных браузерах параллельно. Попытка сделать это как правило приводит к различным проблемам: окна начинают конкурировать за фокус, не срабатывающие события, не ожидаемые CSS стили и так далее.
  6. Нужно знать какая версия Selenium совместима с какой версией браузера. То же самое верно для исполняемых файлов веб-драйверов (например, Chromedriver).

Приведенный выше список недостатков далеко не полный. Но давайте остановимся на этом и попробуем гораздо более удобный способ отладки Selenium-тестов локально.

Selenoid

В моей предыдущей статье (часть I, часть II) я коротко описал новые открытые инструменты для работы с Selenium: Ggr и Selenoid. Ggr в основном нужен для больших Selenium кластеров и не нужен для отладки тестов на вашей машине. Сегодня я более подробно расскажу о Selenoid — альтернативной реализации Selenium хаба, которая запускает браузеры в Docker контейнерах.

Но почему же запуск браузеров в контейнерах так удобен? И в чем разница между запуском браузеров из контейнеров, поставляемых разработчиками Selenium и Selenoid? — Основная идея Selenoid состоит в том, чтобы запускать новый контейнер для каждой Selenium сессии (т.е. запроса нового браузера) и останавливать их сразу же после закрытия сессии. Такой подход сразу же решает все проблемы связанные с залипанием состояния в кешах и использования одних настроек браузера в разных сессиях. В каждом контейнере находится конкретная версия браузера, правильная версия веб-драйвера или Selenium сервера, поддерживающая этот браузер и все зависимости наподобие шрифтов, графических библиотек и так далее. Более того, контейнеры обеспечивают достаточный уровень изоляции процессов браузеров. Это позволяет запускать неограниченное количество разлиных версий браузеров параллельно и забыть о проблемах с фокусом. Безусловно, эти же проблемы решаются и обычными Selenium контейнерами. Но для того, чтобы получить поведение, аналогичное Selenoid, в дополнение к Docker как правило требуется использовать сложные админские инструменты наподобие Ansible или Salt.

Установка

Немного порекламировав Selenoid, настало время показать как просто с ним работать. Для того, чтобы получить работающий Selenium нужно выполнить 3 коротких шага:

Установить Docker. Обычно это делается при помощи стандартного менеджера пакетов вашей операционной системы такого как APT, Yum или Homebrew. Подробности можно найти в документации Docker.

Создать каталог для хранения конфигурации Selenoid и сгенерировать конфигурационный файл:

Последняя команда также скачает образы Docker-контейнеров двух последних версий Firefox, Chrome и Opera и сгенерирует правильный файл конфигурации для Selenoid.

Все — прошло 60 секунд и Selenoid готов к работе. Не нужно устанавливать Java и скачивать Selenium руками. Просто запустите свои тесты, используя тот же самый URL, что и у обычного Selenium server:

Мордочка и сбор статистики

Selenoid может использоваться совместно с Ggr для настройки большого Selenium кластера, поэтому у него нет графического интерфейса наподобие Grid Console в обычном Selenium. Посмотреть потребление браузеров можно двумя способами:

I. Запустить дополнительный легковесный контейнер с Selenoid UI. Это делается командой:




II. Отправлять статистику Selenoid во внешнюю систему: Graphite, InfluxDB, ElasticSearch и так далее. Статистика Selenoid может быть получена по следующему URL:

Данные отправляются в виде JSON следующего формата:

Готовые контейнеры с браузерами

Согласитесь, круто иметь инструмент, автоматически запускающий контейнеры с разными браузерами. Но еще круче иметь набор готовых контейнеров с разными версиями популярных браузеров. Мы проделали много работы и подготовили образы контейнеров с разными версиями Firefox, Chrome и Opera. Полный список можно посмотреть на selenoid@DockerHub.

Чтобы всегда иметь набор свежих версий браузеров нужно лишь время от времени выполнять команду:

Эта команда автоматически скачивает последние версии контейнеров и генерирует новую JSON-конфигурацию для Selenoid. Чтобы начать использовать новые браузеры отправьте Selenoid команду на перечитывание конфигурации (можно делать под нагрузкой):

Наши контейнеры также поддерживают возможность установки произвольно разрешения экрана (по-умолчанию 1920x1080x24 ). Чтобы выставить разрешение просто передайте capability screenResolution :

Заключение

В этой статье я рассказал как эффективно управлять различными браузерами при помощи Selenoid. Поверьте — работа с Selenium может быть комфортной. Если вам интересны вопросы построения эффективной инфраструктуры тестирования, вы можете взглянуть на другие открытые инструменты в нашей организации на Github или подпишитесь на наш Твиттер @aerokube.

В благодарность автору замечательной картинки, посмотрите как ее рисовали.

Читайте также: