Лекция 2-3. Лекция Изучение расширенных взаимодействий WebDriver Понимание действий, построение и выполнение
Скачать 200.68 Kb.
|
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 для выполнения различных действий:
Изучение 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 Модальное окно в графическом интерфейсе пользователя — окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь это окно не закроет. |