Используя Java-класс myclass, который мы создали в предыдущем руководстве, давайте попробуем создать сценарий WebDriver, который:
- получить домашнюю страницу Mercury Tours
- проверить его название
- распечатать результат сравнения
- закройте его перед завершением всей программы.
Код WebDriver
Ниже приведен фактический код WebDriver для логики, представленной в приведенном выше сценарии.
Примечание. Начиная с Firefox 35, вам необходимо использовать драйвер gecko, созданный Mozilla, чтобы использовать веб-драйвер. У Selenium 3.0, gecko и firefox есть проблемы с совместимостью, и их правильная установка может стать сложной задачей. Если код не работает, перейдите на Firefox версии 47 или ниже. Кроме того, вы можете запускать свои скрипты в Chrome. Selenium сразу работает с Chrome. Вам просто нужно изменить 3 строки кода, чтобы ваш скрипт работал с Chrome или Firefox.
пакет newproject;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;// прокомментируйте строку выше и раскомментируйте строку ниже, чтобы использовать Chrome// импортировать org.openqa.selenium.chrome.ChromeDriver;public class PG1 {public static void main (String [] args) {// объявление и создание экземпляров объектов / переменныхSystem.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Драйвер WebDriver = новый FirefoxDriver ();// закомментируем 2 строки выше и раскомментируем 2 строки ниже, чтобы использовать Chrome//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe ");// Драйвер WebDriver = новый ChromeDriver ();Строка baseUrl = "http://demo.guru99.com/test/newtours/";String expectedTitle = "Добро пожаловать: Mercury Tours";String actualTitle = "";// запускаем Fire fox и направляем его на базовый URLdriver.get (baseUrl);// получаем актуальное значение заголовкаactualTitle = driver.getTitle ();/ ** сравните фактическое название страницы с ожидаемым и распечатайте* результат как «пройден» или «не пройден»* /if (actualTitle.contentEquals (expectedTitle)) {System.out.println («Тест пройден!»);} еще {System.out.println («Тест не пройден»);}// закрываем Fire foxdriver.close ();}}
Объяснение кода
Импорт пакетов
Для начала вам необходимо импортировать следующие два пакета:
- org.openqa.selenium. * - содержит класс WebDriver, необходимый для создания экземпляра нового браузера, загруженного с определенным драйвером
- org.openqa.selenium.firefox.FirefoxDriver - содержит класс FirefoxDriver, необходимый для создания экземпляра специфичного для Firefox драйвера в браузере, созданного классом WebDriver.
Если вашему тесту требуются более сложные действия, такие как доступ к другому классу, создание снимков экрана браузера или управление внешними файлами, вам определенно потребуется импортировать больше пакетов.
Создание экземпляров объектов и переменных
Обычно именно так создается объект драйвера.
Класс FirefoxDriver без параметров означает, что профиль Firefox по умолчанию будет запущен нашей программой Java. Профиль Firefox по умолчанию аналогичен запуску Firefox в безопасном режиме (расширения не загружаются).
Для удобства мы сохранили базовый URL и ожидаемый заголовок как переменные.
Запуск сеанса браузера
Метод WebDriver get () используется для запуска нового сеанса браузера и направляет его на URL-адрес, который вы указываете в качестве его параметра.
Получите фактическое название страницы
Класс WebDriver имеет метод getTitle (), который всегда используется для получения заголовка текущей загруженной страницы.
Сравните ожидаемые и фактические значения
Эта часть кода просто использует базовую структуру Java if-else для сравнения фактического заголовка с ожидаемым.
Завершение сеанса браузера
Метод close () используется для закрытия окна браузера.
Завершение всей программы
Если вы воспользуетесь этой командой, не закрыв сначала все окна браузера, вся ваша программа Java завершится, а окно браузера останется открытым.
Запуск теста
Есть два способа выполнить код в Eclipse IDE.
- В строке меню Eclipse щелкните Выполнить> Выполнить.
- Нажмите Ctrl + F11, чтобы запустить весь код.
Если вы все сделали правильно, Eclipse выдаст сообщение «Тест пройден!».
Расположение элементов графического интерфейса
Поиск элементов в WebDriver осуществляется с помощью метода findElement (By. Locator ()) . «Локаторная» часть кода такая же, как и в любом из локаторов, ранее обсуждавшихся в главах этих руководств по Selenium IDE. Фактически, рекомендуется находить элементы графического интерфейса с помощью IDE и после успешной идентификации экспортировать код в WebDriver.
Вот пример кода Selenium, который находит элемент по его идентификатору. Facebook используется в качестве базового URL.
пакет newproject;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class PG2 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Драйвер WebDriver = новый FirefoxDriver ();Строка baseUrl = "http://www.facebook.com";Строка tagName = "";driver.get (baseUrl);tagName = driver.findElement (By.id ("электронная почта")). getTagName ();System.out.println (имя тега);driver.close ();System.exit (0);}}
Мы использовали метод getTagName () для извлечения имени тега того конкретного элемента, идентификатор которого - «электронная почта». При запуске этот код должен быть в состоянии правильно идентифицировать имя тега «input» и распечатать его в окне консоли Eclipse.
Резюме для размещения элементов
Вариация | Описание | Образец |
---|---|---|
К. className | находит элементы на основе значения атрибута "класс" | findElement (By.className ("someClassName")) |
К. cssSelector | находит элементы на основе движка селектора CSS, лежащего в основе драйвера | findElement (By.cssSelector ("input # email")) |
К. я бы | находит элементы по значению их атрибута "id" | findElement (By.id ("someId")) |
К. linkText | находит элемент ссылки по отображаемому в ней тексту | findElement (By.linkText ("РЕГИСТРАЦИЯ")) |
К. имя | находит элементы по значению атрибута name | findElement (By.name ("someName")) |
К. partialLinkText | находит элементы, содержащие указанный текст ссылки | findElement (By.partialLinkText ("REG")) |
К. название тэга | находит элементы по имени их тега | findElement (By.tagName ("div")) |
К. 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 ())
By.cssSelector () не поддерживает функцию «содержит» . Рассмотрим код Selenium IDE ниже -
В Selenium IDE выше весь тест пройден. Однако в приведенном ниже сценарии Selenium WebDriver тот же тест вызвал ошибку, поскольку WebDriver не поддерживает ключевое слово «содержит» при использовании в методе By.cssSelector ().
Общие команды
Создание экземпляров веб-элементов
Вместо использования длинного синтаксиса driver.findElement (By.locator ()) каждый раз, когда вы обращаетесь к определенному элементу, мы можем создать для него экземпляр объекта WebElement. Класс WebElement содержится в пакете org.openqa.selenium. *.
Щелчок по элементу
Щелчок - это, пожалуй, самый распространенный способ взаимодействия с веб-элементами . Метод click () используется для имитации щелчка любого элемента. В следующем примере Selenium Java показано, как click () использовался для нажатия кнопки «Войти» в Mercury Tours.
При использовании метода click () необходимо учитывать следующее.
- Он не принимает никаких параметров / аргументов.
- Метод автоматически ожидает загрузки новой страницы, если это возможно.
- Элемент, на который нужно щелкнуть, должен быть видимым (высота и ширина не должны быть равны нулю).
Получить команды
Команды Get извлекают различную важную информацию о странице / элементе. Вот несколько важных команд "get", с которыми вы должны быть знакомы.
Команды | использование |
---|---|
get () Пример использования: |
|
getTitle () Пример использования: |
|
getPageSource () Пример использования: |
|
getCurrentUrl () Пример использования: |
|
getText () Пример использования: |
|
Команды навигации
Эти команды позволяют обновлять, переходить и переключаться между различными веб-страницами.
navigate (). to () Пример использования: |
|
navigate (). refresh () Пример использования: |
|
navigate (). back () Пример использования: |
|
navigate (). forward () Пример использования: |
|
Закрытие и выход из окон браузера
close () Пример использования: |
|
quit () Пример использования: |
|
Чтобы наглядно проиллюстрировать разницу между close () и quit (), попробуйте выполнить приведенный ниже код. Он использует веб-страницу, которая автоматически открывает окно при загрузке страницы и открывает другое после выхода.
Обратите внимание, что было закрыто только родительское окно браузера, а не два всплывающих окна.
Но если вы используете quit (), все окна будут закрыты, а не только родительское. Попробуйте запустить приведенный ниже код, и вы заметите, что два всплывающих окна выше также автоматически закроются.
пакет newproject;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class PG3 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Драйвер WebDriver = новый FirefoxDriver ();driver.get ("http://www.popuptest.com/popuptest2.html");driver.quit (); // используя QUIT, все окна закроются}}
Переключение между кадрами
Чтобы получить доступ к элементам графического интерфейса во фрейме, мы должны сначала указать WebDriver, чтобы он сфокусировался на фрейме или всплывающем окне, прежде чем мы сможем получить доступ к элементам внутри них. Возьмем, например, веб-страницу http://demo.guru99.com/selenium/deprecated.html
Эта страница имеет 3 фрейма, атрибуты "name" которых указаны выше. Мы хотим получить доступ к ссылке «Устаревшие», обведенной желтым кружком. Для этого мы должны сначала проинструктировать WebDriver переключиться на фрейм "classFrame" с помощью метода "switchTo (). Frame ()" . Мы будем использовать атрибут name фрейма в качестве параметра для части «frame ()».
пакет newproject;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class PG4 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Драйвер WebDriver = новый FirefoxDriver ();driver.get ("http://demo.guru99.com/selenium/deprecated.html");driver.switchTo (). frame ("classFrame");driver.findElement (By.linkText ("Устарело")). click ();driver.close ();}}
После выполнения этого кода вы увидите, что кадр «classFrame» переносится на страницу «Устаревший API», что означает, что нашему коду удалось получить доступ к ссылке «Устаревший».
Переключение между всплывающими окнами
WebDriver позволяет отображать всплывающие окна, такие как предупреждения, в отличие от Selenium IDE. Чтобы получить доступ к элементам в предупреждении (например, к содержащемуся в нем сообщению), мы должны использовать метод switchTo (). Alert () . В приведенном ниже коде мы будем использовать этот метод для доступа к окну предупреждения, а затем получить его сообщение с помощью метода "getText ()" , а затем автоматически закрыть окно с предупреждением, используя "switchTo (). Alert (). Accept ()" " метод.
Сначала перейдите на http://jsbin.com/usidix/1 и вручную нажмите «Пуск!». кнопку там и сами убедитесь в тексте сообщения.
Давайте посмотрим на пример кода Selenium, чтобы сделать это -
пакет mypackage;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.firefox.FirefoxDriver;public class myclass {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");Драйвер WebDriver = новый FirefoxDriver ();Строка alertMessage = "";driver.get ("http://jsbin.com/usidix/1");driver.findElement (By.cssSelector ("input [value = \" Go! \ "]")). click ();alertMessage = драйвер.switchTo (). alert (). getText ();driver.switchTo (). предупреждение (). accept ();System.out.println (alertMessage);driver.quit ();}}
Обратите внимание на напечатанное предупреждающее сообщение на консоли Eclipse:
Ждет
Есть два вида ожидания.
- Неявное ожидание - используется для установки времени ожидания по умолчанию во всей программе.
- Явное ожидание - используется для установки времени ожидания только для определенного экземпляра
Неявное ожидание
- Кодировать проще, чем явное ожидание.
- Обычно это объявляется в части кода, посвященной созданию экземпляра.
- Для импорта вам понадобится только один дополнительный пакет.
Чтобы начать использовать неявное ожидание, вам нужно будет импортировать этот пакет в свой код.
Затем в части вашего кода, посвященной созданию экземпляра, добавьте это.
Явное ожидание
Явные ожидания выполняются с использованием классов WebDriverWait и ExpectedCondition . В следующем примере Selenium WebDriver мы подождем до 10 секунд, пока элемент с идентификатором username станет видимым, прежде чем переходить к следующей команде. Вот шаги.
Шаг 1
Импортируйте эти два пакета:
Шаг 2
Объявите переменную WebDriverWait. В этом примере мы будем использовать myWaitVar в качестве имени переменной.
Шаг 3
Используйте myWaitVar с ExpectedConditions в тех частях, где требуется явное ожидание. В этом случае мы будем использовать явное ожидание на входе «имя пользователя» (Mercury Tours HomePage), прежде чем вводить на него текст «учебник».
Условия
Следующие методы используются в условных и циклических операциях:
- isEnabled () используется, когда вы хотите проверить, включен ли определенный элемент перед выполнением команды.
- isDisplayed () используется, когда вы хотите проверить, отображается ли определенный элемент перед выполнением команды.
- isSelected () используется, когда вы хотите проверить, выбран ли определенный флажок, переключатель или параметр в раскрывающемся списке . Не работает с другими элементами.
Использование ожидаемых условий
Класс ExpectedConditions предлагает более широкий набор условий, которые вы можете использовать вместе с методом WebDriverWait до ().
Ниже приведены некоторые из наиболее распространенных методов ExpectedConditions.
- alertIsPresent () - ждет, пока не отобразится окно с предупреждением.
- elementToBeClickable () - ожидает, пока элемент не станет видимым и в то же время не будет включен. В приведенном ниже примере кода Selenium будет ожидаться, пока элемент с не станет видимым и включенным, прежде чем назначить этот элемент как переменную WebElement с именем «txtUserName».
- frameToBeAvailableAndSwitchToIt () - ожидает, пока данный кадр уже не станет доступен, а затем автоматически переключается на него.
Выявление исключений
При использовании isEnabled (), isDisplayed () и isSelected () WebDriver предполагает, что элемент уже существует на странице. В противном случае это вызовет исключение NoSuchElementException . Чтобы этого избежать, мы должны использовать блок try-catch, чтобы программа не прерывалась.
WebElement txtbox_username = driver.findElement (By.id ("имя пользователя"));пытаться{if (txtbox_username.isEnabled ()) {txtbox_username.sendKeys («учебник»);}}catch (NoSuchElementException nsee) {System.out.println (nsee.toString ());}
Если вы используете явное ожидание, вам следует перехватить тип исключения «TimeoutException».
Резюме
- Чтобы начать использовать WebDriver API, вы должны импортировать как минимум эти два пакета.
- org.openqa.selenium. *
- org.openqa.selenium.firefox.FirefoxDriver
- Метод get () эквивалентен команде Open в Selenium IDE.
- Поиск элементов в WebDriver осуществляется с помощью метода findElement () .
- Ниже перечислены доступные варианты размещения элементов в WebDriver:
- К. className
- К. cssSelector
- К. я бы
- К. linkText
- К. имя
- К. partialLinkText
- К. название тэга
- К. xpath
- By.cssSelector () не поддерживает функцию «содержит» .
- Вы можете создать экземпляр элемента с помощью класса WebElement .
- Щелчок по элементу выполняется с помощью метода click () .
- WebDriver предоставляет следующие полезные команды получения :
- получать()
- getTitle ()
- getPageSource ()
- getCurrentUrl ()
- getText ()
- WebDriver предоставляет эти полезные команды навигации
- навигация (). вперед ()
- навигация (). назад ()
- перейдите к()
- навигация (). обновление ()
- Методы close () и quit () используются для закрытия окон браузера. Close () используется для закрытия одного окна; в то время как quit () используется для закрытия всех окон, связанных с родительским окном, которым управлял объект WebDriver.
- SwitchTo (). Рамка () и switchTo (). Предупреждения () методы используются для фокусировки прямого WebDriver в на раме или предупреждения, соответственно.
- Неявные ожидания используются для установки времени ожидания во всей программе, в то время как явные ожидания используются только для определенных частей.
- Вы можете использовать isEnabled (), isDisplayed (), isSelected () и комбинацию методов WebDriverWait и ExpectedConditions при проверке состояния элемента. Однако они не проверяют, существует ли элемент.
- Когда вызывается isEnabled (), isDisplayed () или isSelected (), когда элемент не существует, WebDriver генерирует исключение NoSuchElementException .
- Когда методы WebDriverWait и ExpectedConditions вызывались, когда элемент не существовал, WebDriver генерировал исключение TimeoutException .
Примечание:
driver.get (): он используется для перехода на конкретный веб-сайт, но он не поддерживает историю браузера и файлы cookie, поэтому мы не можем использовать кнопки вперед и назад, если мы нажмем на нее, страница не получит расписание
driver.navigate (): он используется для перехода на конкретный веб-сайт, но сохраняет историю браузера и файлы cookie, поэтому мы можем использовать кнопку вперед и назад для перехода между страницами во время кодирования Testcase.