какой метод используется в selenium webdriver чтобы открыть веб страницу в браузере
Управляем браузером с помощью PHP и Selenium
Интро
Всем привет! Сегодня я расскажу вам о том, как с помощью PHP можно работать с Selenium.
Чаще всего это бывает необходимо, когда перед вами стоит задача написать автотесты для web интерфейса или свой парсер/краулер.
Мы рассмотрим следующие нюансы:
1. Готовим Behat и Mink
Behat это php фреймворк, который изначально был создан для поведенческого тестирования (BDD). Он является официальной PHP реализацией более известного продукта Cucumber, который часто используется в других языках программирования.
Сам по себе работать с Selenium он не умеет и предназначен больше для написания функциональных тестов без использования браузера.
Устанавливается как обычный пакет:
Чтобы научить behat работать с браузером, нам понадобится его расширение Mink, а также бридж для работы с конкретным вендором (в нашем случае это Selenium). Полный список вендоров вы сможете найти на страничке Mink. С учетом версий, ваш composer.json должен выглядеть примерно так:
Завершающей фазой является конфигурация
Файлы сценариев или (*.feature файлы) — yml файлы, написанные на псевдо-языке Gherkin, содержат, по сути, набор пошаговых инструкций, которые выполнит ваш браузер в ходе исполнения конкретного сьюта. Подробнее о синтаксисе вы можете узнать, перейдя по ссылке выше.
Каждая такая «инструкция» в свою очередь матчится на методы класса «контекста» с помощью регулярных выражений, указанных в аннотациях класса. Behat\MinkExtension\Context\MinkContext
Имена самих методов роли не играют, хотя хорошим тоном будет придерживаться аналогичного аннотациям именования в CamelCase.
Если вам не хватает доступных по умолчанию конструкций Gherkin, вы можете расширить функционал в классах наследниках MinkContext правильно указав аннотации. Эту роль и выполняют «контекстные» классы.
2. Установка и настройка окружения
Запуск Selenium в Docker немного сложнее. Во-первых вам понадобятся Иксы в контейнере, во-вторых – вам захочется увидеть, что же происходит внутри контейнера.
Ребята из Selenium уже обо всём позаботились и собирать свой контейнер вам не придется. Контейнер со Standalone сервером на борту будет сразу доступен по 5900 порту, куда можно постучаться с любого VNC клиента (например с этого). Внутри контейнера вас встретит приветливый интерфейс Fluxbox с предустановленным Chrome. В моем случае это выглядит так:
Чтобы прийти к успеху, вы можете запустить докер контейнер, согласно инструкции на сайте:
Важный момент, без шаред волюма /dev/shm хрому не хватит памяти и он не сможет запуститься, поэтому не забываем его указать.
В моем случае используется docker-compose, и YAML файл будет выглядеть следующим образом:
Я хочу, чтобы мои тесты заходили на Facebook через VPN, включенный на хост-машине, поэтому важно указать network_mode.
Чтобы запустить контейнер, используя compose, выполним следующую команду:
Теперь пробуем подсоединиться по VNC на localhost:5900 и открыть браузер внутри контейнера. Если вам это удалось и вы видите что-то похожее на скриншот выше — вы прошли этот уровень.
3. От теории к практике. Автоматизируем
В примере, приведенном ниже, я буду доставать всех пользователей Facebook по переданным фамилии и имени. Сценарий будет выглядеть следующим образом:
И соответственно Context класс (констуктор и нэймспейсы опущены)
Часто возникает необходимость в кастомных методах типа FacebookContext::pressFacebookButton, т.к по умолчанию все селекторы в mink умеют искать только по name|value|id|alt|title.
Если вам нужна выборка по другому атрибуту, придется писать свой метод. Кнопка Login у фейсбука имеет атрибут id, но меняет его значение периодически по какой-то своей логике. Поэтому мне и пришлось перепривязаться к data-testid, который, пока что, остается статичным.
Теперь, чтобы всё это завелось, необходимо убедиться, что Selenium запущен и слушает указанный порт.
После чего выполним:
Внутри контейнера должен запуститься инстанс браузера и пойти выполнять указанные инструкции.
4. Кастомизация behat. Расширения
В Behat фреймворк встроен прекрасный механизм расширения через behat.yml. Обратите внимание, что многие классы фреймворка объявлены как final, чтобы умерить соблазн просто их наследовать.
Расширение позволяет дополнять функционал behat, объявлять новые консольные аргументы и опции, модифицировать поведение других расширений и др. Оно состоит из класса имплементирующего
Behat\Testwork\ServiceContainer\Extension интерфейс (он же указывается в behat.yml) и вспомогательных классов, если нужно.
Я хочу научить behat принимать ФИО искомого человека через новый входящий аргумент —search-by-fullname, чтобы в последствие использовать эти данные внутри сьюта.
Ниже привожу код, выполняющий необходимые операции:
В методе SearchExntesion::load пробрасывается Сервис SearchController, отвечающий непосредственно за объявление параметров и их прием/обработку.
Если всё объявлено правильно, то список доступных команд behat дополнится новым аргументом —search-by-fullname:
Получив входные данные внутри SearchController, они могут быть переданы в Context классы напрямую, либо сохранены в базе данных и т.д В примере выше я для этого использую Registry паттерн. Подход вполне рабочий, но если вы знаете, как это сделать по-другому, пожалуйста, расскажите в комментариях.
Selenium для Python. Глава 2. Первые Шаги
Продолжение перевода неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.
Содержание:
2. Первые шаги
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. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:
После этого мы посылаем нажатия клавиш (аналогично введению клавиш с клавиатуры). Специальные команды могут быть переданы с помощью класса Keys импортированного из selenium.webdriver.common.keys:
После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:
В завершение, окно браузера закрывается. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью:
2.3. Использование Selenium для написания тестов
Selenium чаще всего используется для написания тестовых ситуаций. Сам пакет selenium не предоставляет никаких тестовых утилит или инструментов разработки. Вы можете писать тесты с помощью модуля Python unittest. Другим вашим выбором в качестве тестовых утилит/инструментов разработки могут стать py.test и nose.
В этой главе, в качестве выбранной утилиты будет использоваться unittest. Ниже приводится видоизмененный пример с использованием этого модуля. Данный скрипт тестирует функциональность поиска на сайте python.org:
Вы можете запустить тест выше из командной строки следующей командой:
Результат сверху показывает, что тест завершился успешно.
2.4. Пошаговый разбор примера
Сначала были импортированы все основные необходимые модули. Модуль unittest встроен в Python и реализован на Java’s JUnit. Этот модуль предоставляет собой утилиту для организации тестов.
Модуль selenium.webdriver предоставляет весь функционал WebDriver’а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…
Класс теста унаследован от unittest.TestCase. Наследование класса TestCase является способом сообщения модулю unittest, что это тест:
setUp — это часть инициализации, этот метод будет вызываться перед каждым методом теста, который вы собираетесь написать внутри класса теста. Здесь мы создаем элемент класса Firefox WebDriver.
Далее описан метод нашего теста. Метод теста всегда должен начинаться с фразы test. Первая строка метода создает локальную ссылку на объект драйвера, созданный методом setUp.
Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:
Следующая строка — это утверждение, что заголовок содержит слово “Python”:
WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:
После этого мы посылаем нажатия клавиш (аналогично введению клавиш с клавиатуры). Специальные команды могут быть переданы с помощью класса Keys импортированного из selenium.webdriver.common.keys:
После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:
Метод tearDown будет вызван после каждого метода теста. Это метод для действий чистки. В текущем методе реализовано закрытие окна браузера. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью.:
Завершающий код — это стандартная вставка кода для запуска набора тестов [Сравнение __name__ с «__main__» означает, что модуль (файл программы) запущен как отдельная программа («main» (англ.) — «основная», «главная») (а не импортирован из другого модуля). Если вы импортируете модуль, атрибут модуля __name__ будет равен имени файла без каталога и расширения — Прим. пер.]:
2.5. Использование Selenium с remote WebDriver
Строка выше сообщает о том, что вы можете использовать указанный URL для подключения remote WebDriver. Ниже приводится несколько примеров:
Переменная desired_capabilities — это словарь. Вместо того, чтобы использовать словари по умолчанию, вы можете явно прописать значения:
Selenium Webdriver. Введение
Автор: ArtStroy · Опубликовано 12.11.2018 · Обновлено 14.11.2018
Selenium Webdriver- популярный инструмент для управления реальным браузером, который можно использовать как для автоматизации тестирования веб приложений, так и для выполнения других рутинных задач, связанных с работой в вебе.
Кроме того, Selenium Webdriver- проект с открытым исходным кодом, поддерживает множество языков программирования и имеет большое сообщество пользователей.
WebDriver. Обзор и принцип работы
Selenium Webdriver — инструмент для автоматизации реального браузера, как локально, так и удаленно, наиболее близко имитирующий действия пользователя.
Selenium 2 (или Webdriver) — последнее пополнение в пакете инструментов Selenium и является основным вектором развития проекта. Это абсолютно новый инструмент автоматизации. По сравнению с Selenium RC Webdriver использует совершенно иной способ взаимодействия с браузерами. Он напрямую вызывает команды браузера, используя родной для каждого конкретного браузера API. Как совершаются эти вызовы и какие функции они выполняют зависит от конкретного браузера. В то же время Selenium RC внедрял javascript код в браузер при запуске и использовал его для управления веб приложением. Таким образом, Webdriver использует способ взаимодействия с браузером более близкий к действиям реального пользователя.
Самое главное изменение новой версии Selenium — это Webdriver API.
Selenium 1.0 (RC) + WebDriver = Selenium 2.0
По сравнению с более старым интерфейсом он обладает рядом преимуществ:
Для работы с Webdriver необходимо 3 основных программных компонента:
Основные понятия и методы Selenium Webdriver API
Основными понятиями в Selenium Webdriver являются:
Сам процесс взаимодействия с браузером через Webdriver API довольно прост:
4) Первый скрипт WebDriver
Using the Java class «myclass» that we created in the previous tutorial, let us try to create a WebDriver script that would:
Код WebDriver
Ниже приведен фактический код WebDriver для логики, представленной в приведенном выше сценарии.
Примечание. Для запуска Firefox 35 вам необходимо использовать драйвер gecko, созданный Mozilla, для использования веб-драйвера. Selenium 3.0, gecko и firefox имеют проблемы с совместимостью, и их правильная установка может стать непростой задачей. Если код не работает, перейдите на версию Firefox 47 или ниже. Кроме того, вы можете запустить свои скрипты в Chrome. Selenium работает из коробки для Chrome. Вам просто нужно изменить 3 строки кода, чтобы ваш скрипт работал с Chrome или Firefox
Объясняя код
Импорт пакетов
Для начала вам необходимо импортировать следующие два пакета:
Если вашему тесту требуются более сложные действия, такие как доступ к другому классу, создание снимков экрана браузера или манипулирование внешними файлами, определенно вам потребуется импортировать больше пакетов.
Создание объектов и переменных
Обычно так создается объект драйвера.
Класс FirefoxDriver без параметров означает, что профиль Firefox по умолчанию будет запущен нашей программой Java. Профиль Firefox по умолчанию аналогичен запуску Firefox в безопасном режиме (расширения не загружаются).
Для удобства мы сохранили Базовый URL и ожидаемый заголовок в качестве переменных.
Запуск сеанса браузера
Метод get () WebDriver используется для запуска нового сеанса браузера и направляет его на URL-адрес, указанный в качестве его параметра.
Получить фактическое название страницы
Класс WebDriver имеет метод getTitle (), который всегда используется для получения заголовка страницы текущей загруженной страницы.
Сравните ожидаемые и фактические значения
Эта часть кода просто использует базовую структуру Java if-else для сравнения фактического заголовка с ожидаемым.
Завершение сеанса браузера
Метод close () используется для закрытия окна браузера.
Завершение всей программы
Если вы используете эту команду, не закрывая сначала все окна браузера, вся ваша Java-программа завершит работу, оставив окно браузера открытым.
Выполнение теста
Есть два способа выполнить код в Eclipse IDE.
Если вы все сделали правильно, Eclipse выдаст «Test Passed!»
Расположение элементов графического интерфейса
Поиск элементов в WebDriver выполняется с помощью метода « findElement (By. Locator ()) ». Часть кода «локатор» такая же, как и любой из локаторов, ранее обсуждавшихся в главах Selenium IDE этих руководств. На самом деле, рекомендуется размещать элементы графического интерфейса с помощью IDE и после успешной идентификации экспортировать код в веб-драйвер.
Вот пример кода, который находит элемент по его идентификатору. Facebook используется в качестве базового URL.
Мы использовали метод getTagName () для извлечения имени тега того конкретного элемента, чей идентификатор — «email». При запуске этот код должен правильно определять имя тега «input» и выводить его в окне консоли Eclipse.
Резюме для размещения элементов
варьирование | Описание | Образец |
---|---|---|
По. имя класса | находит элементы на основе значения атрибута «class» | findElement (By.className ( «someClassName»)) |
По. CSSSelector | находит элементы на основе движка CSS Selector | findElement (By.cssSelector ( «вход # электронная почта»)) |
По. Я бы | находит элементы по значению их атрибута «id» | findElement (By.id ( «someId»)) |
По. LinkText | находит элемент ссылки по точному тексту, который он отображает | findElement (By.linkText ( «РЕГИСТРАЦИЯ»)) |
По. имя | находит элементы по значению атрибута «имя» | findElement (By.name ( «SomeName»)) |
По. partialLinkText | находит элементы, которые содержат данный текст ссылки | findElement (By.partialLinkText ( «REG»)) |
По. название тэга | находит элементы по имени тега | findElement (By.tagName ( «ДИВ»)) |
По. XPath | находит элементы через XPath | findElement (By.xpath («// html / body / div / table / tbody / tr / td [2] / table / tbody / tr [4] / td / table / tbody / tr / td [2] / table / tbody / tr [2] / td [3] / form / table / tbody / tr [5] «)) |
Примечание по использованию findElement (By.cssSelector ())
В Selenium IDE выше весь тест пройден. Однако в приведенном ниже сценарии WebDriver тот же тест сгенерировал ошибку, поскольку WebDriver не поддерживает ключевое слово «contains» при использовании в методе By.cssSelector ().
Общие команды
Создание веб-элементов
Вместо использования длинного синтаксиса «driver.findElement (By.locator ())» каждый раз, когда вы будете обращаться к определенному элементу, мы можем создать для него объект WebElement. Класс WebElement содержится в пакете «org.openqa.selenium. *».
Нажав на элемент
Нажатие, пожалуй, самый распространенный способ взаимодействия с веб-элементами . Метод click () используется для имитации нажатия любого элемента. В следующем примере показано, как click () использовался для нажатия кнопки «Вход» в Mercury Tours.
Следующие вещи должны быть отмечены при использовании метода click ().
Получить команды
Команды Get выбирают различную важную информацию о странице / элементе. Вот несколько важных команд get, с которыми вы должны быть знакомы.
Навигация по командам
Эти команды позволяют обновлять, переходить и переключаться между различными веб-страницами.
Закрытие и выход из браузера Windows
Чтобы наглядно проиллюстрировать разницу между close () и quit (), попробуйте выполнить приведенный ниже код. Он использует веб-страницу, которая автоматически выскакивает окно при загрузке страницы и открывает другую после выхода.
Обратите внимание, что было закрыто только родительское окно браузера, а не два всплывающих окна.
Но если вы используете quit (), все окна будут закрыты — не только родительское. Попробуйте запустить приведенный ниже код, и вы заметите, что два всплывающих окна выше также будут автоматически закрыты.
Переключение между кадрами
Чтобы получить доступ к элементам GUI во фрейме, мы должны сначала дать указание WebDriver сосредоточиться на фрейме или всплывающем окне, прежде чем мы сможем получить доступ к элементам внутри них. Давайте возьмем, например, веб-страницу http://demo.guru99.com/selenium/deprecated.html
После выполнения этого кода вы увидите, что фрейм «classFrame» перенесен на страницу «Устаревший API», что означает, что наш код успешно смог получить доступ к ссылке «Устаревший».
Переключение между всплывающими окнами
Сначала зайдите на http://jsbin.com/usidix/1 и вручную нажмите «Go!» там и посмотрите сами текст сообщения.
Давайте посмотрим код WebDriver, чтобы сделать это
На консоли Eclipse обратите внимание, что распечатанное предупреждающее сообщение:
Есть два вида ожидания.
Неявное ожидание
Чтобы начать использовать неявное ожидание, вам придется импортировать этот пакет в ваш код.
Затем в части вашего кода, добавьте это.
Явное ожидание
Шаг 1
Импортируйте эти два пакета:
Шаг 2
Объявите переменную WebDriverWait. В этом примере мы будем использовать «myWaitVar» в качестве имени переменной.
Шаг 3
Используйте myWaitVar с ExpectedConditions на участках, где требуется явное ожидание. В этом случае мы будем использовать явное ожидание ввода «username» (Mercury Tours HomePage), прежде чем набирать на нем текст «tutorial».
условия
Следующие методы используются в условных и циклических операциях —
Использование ExpectedConditions
Класс ExpectedConditions предлагает более широкий набор условий, которые вы можете использовать в сочетании с методом ToD () WebDriverWait.
Ниже приведены некоторые из наиболее распространенных методов ExpectedConditions.
Ловить исключения
Если вы используете явное ожидание, тип исключения, которое вы должны перехватить, это «TimeoutException».