Главная страница

Лекция 2-3. Лекция Изучение расширенных взаимодействий WebDriver Понимание действий, построение и выполнение


Скачать 200.68 Kb.
НазваниеЛекция Изучение расширенных взаимодействий WebDriver Понимание действий, построение и выполнение
Дата02.04.2019
Размер200.68 Kb.
Формат файлаdocx
Имя файлаЛекция 2-3.docx
ТипЛекция
#72301
страница3 из 3
1   2   3

driver.switchTo().frame(0);

WebElement txt = driver.findElement(By.name("1")); txt.sendKeys("I'm Frame One");

driver.switchTo().defaultContent();
driver.switchTo().frame(1);

txt = driver.findElement(By.name("2")); txt.sendKeys("I'm Frame Two");

}

}
Мы использовали switchTo().frame вместо switchTo().window , поскольку мы перемещаемся по фреймам.

API синтаксис:

WebDriver frame(int index)

На входе – индекс фрейма, на который следует переключиться. Нумерация начинается с 0. Нулевой индекс присваивается первому фрейму, зарегистрированному в DOM. Аналогично можно переключаться между фреймами, используя их имена, при помощи перегруженного метода.

API синтаксис:

WebDriver frame(String frameNameOrframeID)

Можно передать имя фрейма или его ID.

Другой перегруженный метод:
WebDriver frame(WebElement frameElement)
Входной параметр – веб-элемент для фрейма.

Вернемся к нашему коду. Сначала мы переключились на наш первый фрейм и ввели текст в текстовое поле. Затем, вместо того, чтобы переключиться непосредственно на второй фрейм, мы перешли к главному или дефолтному контенту и затем переключились на второй фрейм:

driver.switchTo().defaultContent();

Если этого не сделать и попытаться переключиться на второй фрейм, когда вы еще на первом, WebDriver запротестует, сообщив, что невозможно найти фрейм с индексом 1. Дело в том, что WebDriver ищет второй фрейм в контексте первого, где его, очевидно, нет. Поэтому надо сначала вернуться к контейнеру верхнего уровня и переключиться на нужный фрейм.
Работа с диалоговыми окнами (alerts)

WebDriver имеет API для работы с диалоговыми окнами:
Alert alert()

Предыдущий метод переключится к активному в данный момент модальному диалогу на веб-странице. Возвращает экземпляр Alert , где соответствующие действия могут быть взяты на этом диалоге. Если этот API вызван при отсутствии диалового окна, будет выброшено исключение NoAlertPresentException.

Интерфейс Alert содержит множество API для выполнения различных действий:

  • void accept(): Эквивалентно нажатию кнопки OK. Будут вызваны соответствующие кнопке OK действия.

  • void dismiss():Эквивалентно нажатию кнопки CANCEL.

  • java.lang.String getText(): Вернет текст, написанный в диалоговом окне.

  • void sendKeys(java.lang.String keysToSend): Позволяет ввести текст в диалоговое окно, если оно предоставляет такую возможность.



Изучение Navigate

Navigate – функция WebDriver, позволяющая тестировщику работать с методами браузера Назад, Вперед и Обновить.

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

Для эмуляции навигации используется метод navigate(). Его синтаксис API:
WebDriver.Navigation navigate()

Возвращаемый тип – интерфейс WebDriver.Navigation, который содержит все навигационные опции браузера, которые позволяют перемещаться по истории браузера.

Пример кода:

public class WebDriverNavigate{

public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.navigate().to("http://www.google.com");
WebElement searchBox = driver.findElement(By.name("q")); searchBox.sendKeys("Selenium WebDriver");

WebElement searchButton = driver.findElement(By.name("btnG")); searchButton.click();

searchBox.clear(); searchBox.sendKeys("ASTU"); searchButton.click();
driver.navigate().back(); driver.navigate().forward(); driver.navigate().refresh();

}

}

Открываем страницу поиска Google и сначала ищем текст Selenium WebDriver; затем, когда результаты поиска загружены, производим второй поиск для ASTU и ждем результатов. Теперь, когда в браузере создана навигационная история, используем навигацию WebDriver, чтобы вернуться назад в истории браузера, затем пойти вперед и обновить страницу.

В этой строке загружается страница Google при помощи метода to() класса Navigation:
driver.navigate().to("http://www.google.com");

Здесь сначала driver.navigate() возвращает интерфейс WebDriver.Navigation , на котором используется метод to() для навигации к заданному URL. API синтаксис:

void to(java.lang.String url)

Этот метод загрузит страницу при помощи операции HTTP GET и будет блокировать все остальное до полной загрузки страницы. Этот метод – такой же, как метод driver.get(String url).

Интерфейс WebDriver.Navigation также предоставляет перегруженный метод to() для упрощения передачи URL. API синтаксис:

void to(java.net.URL url)

Затем в нашем примере кода мы производим пару поисков и затем используем метод класса Navigation back() для эмуляции кнопки браузера «Назад»:
driver.navigate().back();

Браузер перейдет к странице результатов поиска по запросу «Selenium WebDriver». API синтаксис:
void back()

Этот метод возвращает браузер на один уровень назад в его истории.

Следующий метод навигации - forward(), похожий на back(), но переводящий браузер в противоположном направлении. В нашем примере кода вызов следующего кода перенаправит браузер к странице результатов поиска по запросу ASTU:
driver.navigate().forward();

API синтаксис:

void forward()

В последней строке мы используем метод refresh():
driver.navigate().refresh();
Этот метод перезагрузит текущий URL для эмуляции обновления в браузере (клавиша F5). API синтаксис:
void refresh()

Ожидание загрузки веб-элементов

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

WebDriver предоставляет разработчикам тестовых сценариев удобную функцию, чтобы управлять временем ожидания. Wait time – время, в течение которого ваш драйвер будет ждать загрузки веб-элемента, прежде чем выбросит исключение NoSuchElementException.

Заставить WebDriver дожидаться веб-элемента можно двумя способами:

  • неявное время ожидания

  • явное время ожидания.


Неявное время ожидания

Используется, когда вы хотите настроить время ожидания WebDriver как целое для тестируемого приложения. Предположим, вы разместили веб-приложение на локаьном сервере и на удаленном сервере. Очевидно, время загрузки этой веб-страницы на локальном сервере будет меньше, чем на удаленном, из-за латентности (задержки) сети. Соответственным образом надо настроить время ожидания. WebDriver позволяет задать неявное время ожидания для всех операций, которые производит драйвер, при помощи метода manage().

Рассмотрим пример кода:

public class ImplicitWaitTime {

public static void main(String... args) { WebDriver driver = new FirefoxDriver();

driver.manage().timeouts().implicitlyWait(10, TimeUnit.

SECONDS);

driver.get("www.google.com");

}

}

Здесь driver.manage().timeouts() возвращает интерфейс WebDriver.Timeouts, который объявляет метод implicitlyWait, в котором вы задаете время, в течение которого драйвер должен ждать в процессе поиска веб-элемента на странице, если он не найден сразу. WebDriver будет периодически искать веб-элемент, пока не закончится заданное время ожидания. В данном случае задано время 10 секунд. Если он загрузится до истечения этого срока, WebDriver продолжит выполнять следующий код; иначе будет выброшено исключение NoSuchElementException.

Задание слишком длинного отрезка времени в неявной форме задержит выполнение всего теста. Поэтому удобно использовать также явное время ожидания.
Явное время ожидания

Задается для конкретного веб-элемента:

public class ExplicitWaitTime {

public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com");

WebElement element = (new WebDriverWait(driver, 20)).until(new ExpectedCondition() {

@Override

public WebElement apply(WebDriver d) { return d.findElement(By.name("q"));

}

});

}

}
Мы создали условное ожидание отдельного веб-элемента. Интерфейс ExpectedCondition может быть использован, чтобы применить условное ожидание к некоторому веб-элементу. В данном случае WebDriver будет ждать этот конкретный веб-элемент максимум 20 секунд. Что до неявного времени, то оно к этому элементу не будет применяться. Если за 20 секунд веб-элемент не загрузится, то драйвер выбросит исключение NoSuchElementException. Таким образом, вы можете переопределить неявное время исключительно для тех веб-элементов, которые, по вашему мнению, займут много времени.
Работа с куками

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

Для получения всех кук, которые загружены для веб-страницы, в WebDriver существует метод:
driver.manage().getCookies()

Он вернет все куки, сохраненные данной веб-страницей в текущую сессию. Каждая кука ассоциируется с именем, значением, доменом, путем, истечением и статусом, задающим ее безопасность. Для проверки клиентской куки сервер анализирует все эти значения. Теперь мы будем хранить всю эту информацию для каждой куки в файле, так чтобы наши тест-кейсы могли считать из файла и загрузить эту информацию в драйвер. Тогда сервер Facebook будет считать сессию вашего браузера авторизованной и сразу направлять вас на запрошенный вами URL.

Код для хранения информации из кук:

package com.astu.webdriver.lection3;
import java.io.BufferedWriter; import java.io.File;

import java.io.FileWriter;
import org.openqa.selenium.By; import org.openqa.selenium.Cookie;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver; public class StoreCookieInfo {

public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.facebook.com");

driver.findElement(By.name("email")).sendKeys("<<ваш e-mail>>"); driver.findElement(By.name("pass")).sendKeys("<<ваш пароль>>"); driver.findElement(By.name("persistent")).click(); driver.findElement(By.name("pass")).submit();

File f = new File("browser.data"); try{

f.delete(); f.createNewFile();

FileWriter fos = new FileWriter(f); BufferedWriter bos = new BufferedWriter(fos);
for(Cookie ck : driver.manage().getCookies()) {

bos.write((ck.getName()+";"+ck.getValue()+";"+ck.getDomain()

+";"+ck.getPath()+";"+ck.getExpiry()+";"+ck.isSecure()));

bos.newLine();

}

bos.flush();

bos.close();

fos.close();

}catch(Exception ex){

ex.printStackTrace();

}

}

}

Теперь для каждого тест-кейса или для набора тест-кейсов мы загружаем информацию о куках из файла browser.data и добавляем ее к драйверу при помощи следующего метода:
driver.manage().addCookie(ck);
Когда вы добавили эту информацию к сессии браузера и переходите на страницу Facebook, она автоматически переадресует вас на главную страницу, не запрашивая логин. Следующий код добавляет все предыдущие куки к драйверу:
package com.astu.webdriver.lection3;
import java.io.BufferedReader; import java.io.File;

import java.io.FileReader; import java.util.Date;

import java.util.StringTokenizer;
import org.openqa.selenium.Cookie; import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver; public class LoadCookieInfo {

public static void main(String... args){ WebDriver driver = new FirefoxDriver(); driver.get("http://www.facebook.com"); try{

File f = new File("browser.data");

FileReader fr = new FileReader(f2);

BufferedReader br = new BufferedReader(fr);

String line;

while((line=br.readLine())!=null){

StringTokenizer str = new StringTokenizer(line,";");

while(str.hasMoreTokens()){

String name = str.nextToken();

String value = str.nextToken();

String domain = str.nextToken();

String path = str.nextToken();

Date expiry = null;

String dt;

if(!(dt=str.nextToken()).equals("null")){

expiry = new Date(dt);

}

boolean isSecure = new Boolean(str.nextToken()).booleanValue();

Cookie ck = new Cookie(name,value,domain,path,expiry,isSecure);

driver.manage().addCookie(ck);

}

}

}catch(Exception ex){

ex.printStackTrace();

}

driver.get("http://www.facebook.com");

}

}

После создания экземпляра драйвера мы пишем:
driver.get("http://www.facebook.com");

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


1 class A{

public A print(){

System.out.println("Hello!");

return this;

}

}

new A().print().print().print().print().print().print();

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

1   2   3


написать администратору сайта