Лекция 2-3. Лекция Изучение расширенных взаимодействий WebDriver Понимание действий, построение и выполнение
Скачать 200.68 Kb.
|
Действие moveToElement Метод moveToElement()- еще один, который помогает нам переместить курсор мыши к некоторому веб-элементу. API синтаксис: public Actions moveToElement(WebElement toElement) Вернемся к разделу Действие для щелчка и удержания на текущей позиции и изменим код. Заменим метод moveByOffset(x, y) методом moveToElement(WebElement): public class ClickAndHold{ public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/Sortable.html"); WebElement three = driver.findElement(By.name("three")); Actions builder = new Actions(driver); //Move tile3 to the position of tile2 builder.moveToElement(three) .clickAndHold() .moveByOffset(120, 0) .perform(); } } Мы переместились к плитке 3, щелкнули по ней и удержали ее, затем переместились к позиции плитки 2, задав ее смещение. Если вы хотите, можете добавить метод release() перед методом perform(). Действие dragAndDropBy API синтаксис метода dragAndDropBy(): public Actions dragAndDropBy(WebElement source, int xOffset,int yOffset) source - целевой веб-элемент, который необходимо перетащить, xOffset – горизонтальное смещение, на которое надо переместиться, yOffset – вертикальное смещение, на которое надо переместиться. Откройте файл DragMe.html. Вы можете действительно перетащить тот прямоугольник на любое место веб-страницы. Сделаем это с помощью WebDriver: public class DragMe { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/DragMe.html"); WebElement dragMe = driver.findElement(By.id("draggable")); Actions builder = new Actions(driver); builder.dragAndDropBy(dragMe, 300, 200).perform(); } } dragMe – веб-элемент, который идентифицируется по своему Id и перетаскивается на 300px по горизонтали и на 200px по вертикали. Действие dragAndDrop Метод dragAndDrop() похож на dragAndDropBy(). Единственное различие – что вместо перемещения на смещение мы перемещаем веб-элемент к целевому элементу. API синтаксис: public Actions dragAndDrop(WebElement source, WebElement target) Откройте файл DragAndDrop.html. Здесь мы можем перетащить прямоугольник Drag me to my target к прямоугольнику Drop here. Вот как этого добиться с помощью WebDriver: public class DragAndDrop { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/DragAndDrop.html"); WebElement src = driver.findElement(By.id("draggable")); WebElement trgt = driver.findElement(By.id("droppable")); Actions builder = new Actions(driver); builder.dragAndDrop(src, trgt).perform(); } } Исходный и целевой веб-элементы идентифицируются по своим ID, а метод dragAndDrop() используется, чтобы перетащить один на другой. Действие двойной щелчок на текущей позиции doubleClick() – другой метод, предоставляемый WebDriverом для эмуляции двойного щелчка мыши. Как и click(), он существует в двух вариантах. Во-первых, щелчок по текущей позиции. API синтаксис: public Actions doubleClick() Код: public class DoubleClick { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/DoubleClick.html"); WebElement dblClick= driver.findElement(By.name("dblClick")); Actions builder = new Actions(driver); builder.moveToElement(dblClick).doubleClick().perform(); } } Мы использовали метод moveToElement(WebElement) для перемещения мыши к позиции элемента кнопки и просто дважды щелкнули по текущей позиции. Действие двойной щелчок по веб-элементу Другой метод для эмуляции двойного щелчка по веб-элементу. API синтаксис: public Actions doubleClick(WebElement onElement) Входной параметр – целевой веб-элемент, по которому будет производиться двойной щелчок. Откройте файл DoubleClick.html и щелкните один раз по кнопке Click Me. Ничего не произойдет. Теперь щелкните по ней дважды; вы увидите сообщение с текстом Double Clicked !!. Попробуем сделать то же самое при помощи WebDriver: public class DoubleClick { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/DoubleClick.html"); WebElement dblClick = driver.findElement(By.name("dblClick")); Actions builder = new Actions(driver); builder.doubleClick(dblClick).perform(); } } После выполнения предыдущего кода вы увидите сообщение о том, что кнопка была нажата дважды. Действие щелчок правой кнопкой мыши по веб-элементу Контекст – это меню, список элементов, связанный с неким веб-элементом, основываясь на текущем состоянии веб-страницы. Мы можем эмулировать вызов контекстного меню при помощи метода contextClick(). Существует два его варианта – щелчок по текущему расположению и по заданному веб-элементу. API синтаксис: public Actions contextClick(WebElement onElement) Входной параметр – веб-элемент, по которому будет производиться щелчок правой кнопкой мыши. Откройте файл ContextClick.html, щелкните правой кнопкой по тексту и появится контекстное меню. Щелчок по любому элементу вызывает сообщение, в зависимости от того, какой это элемент. Реализуем это в WebDriver: public class ContextClick { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/ContextClick.html"); WebElement contextMenu = driver.findElement(By.id("div-context")); Actions builder = new Actions(driver); builder.contextClick(contextMenu) .click(driver.findElement(By.name("Item 4"))) .perform(); } } Сначала мы щелкаем правой кнопкой при помощи метода contextClick()по веб-элементу contextMenu, затем щелкаем левой кнопкой по Item 4 из появившегося контекстного меню. Появится сообщение Item 4 Clicked. Действие щелчок правой кнопкой по текущей позиции API синтаксис: public Actions contextClick() Изменим предыдущий пример с использованием данного метода: public class ContextClick { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/ContextClick.html"); WebElement contextMenu = driver.findElement(By.id("div-context")); Actions builder = new Actions(driver); builder.moveToElement(contextMenu) .contextClick() .click(driver.findElement(By.name("Item 4"))) .perform(); } } Переместили курсор к веб-элементу div-context и затем щелкнули по нему правой кнопкой. Изучение взаимодействий, основанных на клавиатуре До сих пор мы работали с мышью. Пора рассмотреть действия, специфичные для клавиатуры. Их три: keyUp, keyDown и sendKeys. Каждое имеет по два перегруженных метода – для выполнения действия непосредственно над веб-элементом и просто выполнение метода независимо от его контекста. Действия нажать и отпустить клавишу Метод keyDown()используется для симуляции действия нажатия и удержания какой-либо клавиши. Клавиши, о которых мы сейчас говорим, - Shift, Ctrl и Alt. Метод keyUp()используется, чтобы отпустить клавишу, которая уже нажата при помощи метода keyDown(). API синтаксис метода keyDown(): public Actions keyDown(Keys theKey) throws IllegalArgumentException Исключение IllegalArgumentException выбрасывается, когда нажатая клавиша не одна из Shift, Ctrl и Alt. API синтаксис метода keyUp(): public Actions keyUp(Keys theKey) Можно ли отпустить клавишу, которая еще не нажата? Поведение в таком случае не определено. Действие keyUp, выполненное над клавишей, над которой еще не выполнено действие keyDown, приведет к неожиданным результатам. Метод sendKeys() Используется, чтобы впечатать буквенно-цифровые и специальные символы в такие веб-элементы, как текстовые поля, текстовые области и т.д. Он отличен от метода WebElement.sendKeys(CharSequence keysToSend), поскольку этот метод предполагает, что веб-элементы уже получили фокус ранее его вызова. API синтаксис: public Actions sendKeys(CharSequence keysToSend) Лекция 3. Исследование свойств WebDriver В этом разделе мы обсудим возможности и свойства WebDriver, позволяющие тестировщику получить лучший контрольно над WebDriver и, соответственно, над тестируемым веб-приложением. Установка желаемых настроек браузера Как пользователь WebDriverа вы можете создать сессию для браузера с теми настройками, которые он должен или не должен иметь. Пока рассмотрим настройки, общие для всех браузеров. Возможности – это интерфейс библиотеки WebDriver, реализованный в классе DesiredCapabilities. Чтобы создать сессию браузера с заданными возможностями, необходимо выполнить следующие шаги:
Создадим эксземпляр FirefoxDriver с включенной takesScreenShot возможностью: public class BrowserCapabilities { public static void main(String... args) { Map capabilitiesMap = new HashMap(); capabilitiesMap.put("takesScreenShot", true); DesiredCapabilities capabilities = new DesiredCapabilities(capabilitiesMap); WebDriver driver = new FirefoxDriver(capabilities); driver.get("http://www.google.com"); } } Записываем все необходимые возможности в контейнер отображение и создаем экземпляр DesiredCapabilities при помощи отображения. Создаем экземпляр FirefoxDriver с этими возможностями. Этот код запустит браузер Firefox, который будет поддерживать снятие скриншотов веб-страницы. Если вы посмотрите определение класса DesiredCapabilities, его конструктор перегружен многими способами. Один из них – передать отображеие. Можно использовать конструктор по умолчанию и создать экземпляр класса DesiredCapabilities, а затем задать возможности при помощи метода setCapability(). Некоторые capabilities по умолчанию, присущие всем браузерам:
Снятие скриншотов Это очень удобная функция, когда ваш тест-кейс проваливается, и вы хотите увидеть состояние приложения, когда это произошло. Интерфейс TakesScreenShot в библиотеке WebDriver реализуется всеми вариантами WebDriver (Firefox Driver, Internet Explorer Driver, Chrome Driver и т.д.). TakesScreenShot возможность включена по умолчанию во всех браузерах. Рассмотрим важный метод интерфейса TakesScreenShot—getScreenshotAs(). API синтаксис getScreenshotAs(): public OutputType – другой интерфейс библиотеки WebDriver. Мы можем попросить WebDriver выдать скриншот в трех форматах: BASE64, BYTES (raw) и FILE. Если вы выберете формат FILE, данные будут записаны в файл.png, который будет удален, как только убит виртуальная машина Java. Поэтому необходимо всегда копировать этот файл в безопасное место. На выходе значение, зависящее от выбранного OutputType. Например, для OutputType.BYTES будет возвращен массив байтов, а для OutputType.FILE – файловый объект. В зависимости от используемого браузера, полученный скриншот будет один из следующих в порядке предпочтения:
Например, при использовании FirefoxDriver getScreenshotAs() выдаст скриншот всей страницы, а ChromeDriver вернет только видимую частьб текущего фрейма. Рассмотрим пример: public class TakesScreenShotExample{ public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.astu.org/"); File scrFile = ((TakesScreenShot)driver). getScreenshotAs(OutputType.FILE); System.out.println(scrFile.getAbsolutePath()); } } Мы использовали метод getScreenshotAs()для получения скринщота веб-страницы и сохранили его в файловом формате. Метод getAbsolutePath() возвращает путь к сохраненному изображению. Файл, в который записан скриншот, - временный и будет удален при выходе из JVM. Необходимо копировать его до завершения теста. Позиционирование целевых окон и iFrames WebDriver позвляет переключаться между разными окнами или фреймами, в которых загружено приложение. Например, когда веб-сайт открыл новое окно или веб-приложение разделено на два фрейма – слева меню, справа контент. Интерфейс WebDriver.TargetLocator используется для позиционирования заданного фрейма или окна. Переключение между окнами Рассмотрим пример работы с несколькими окнами. Будем использовать файл Window.html. Там очень простая веб-страница, которая ссылается на страницу поиска Google. При щелчке на ссылке страница поиска Google открывается в новом окне. Каждый раз, как вы открываете веб-страницу при помощи WebDriver в окне браузера, WebDriver присваивает окну дескриптор. WebDriver использует этот идентификатор для идентификации этого окна. В данном случае регистрируются два дескриптора окон. Сейчас на экране перед вами страницу поиска Google впереди и в фокусе. Для переключения на первое окно браузера вы можете использовать метод switchTo(). API синтаксис метода TargetLocator: WebDriver.TargetLocator switchTo() Возвращает экземпляр WebDriver.TargetLocator, где вы можете сказать WebDriverу, переключаться ли между окнами браузера или фреймами. Посмотрим, как WebDriver работает с этим: public class WindowHandling { public static void main(String... args){ WebDriver driver = new FirefoxDriver(); driver.get("file://C:/Window.html"); String window1 = driver.getWindowHandle(); System.out.println("First Window Handle is: "+window1); WebElement link = driver.findElement(By.linkText("Google Search")); link.click(); String window2 = driver.getWindowHandle(); System.out.println("Second Window Handle is: "+window2); System.out.println("Number of Window Handles so for: " +driver.getWindowHandles().size()); driver.switchTo().window(window1); } } Рассмотрим следующую строчку этого кода: String window1 = driver.getWindowHandle(); Драйвер возвращает идентификатор, присвоенный этому окну. Перед перемещением к другому окну лучше сохранить это значение так, что если мы захотим переключиться на это окно обратно, мы можем использовать этот дескриптор или идентификатор. Чтобы найти все дескрипторы окна, которые зарегистрированы вашим драйвером, можно использовать следующий метод: driver.getWindowHandles() Он вернет множество идентификаторов всех дескрипторов за текущую сессию драйвера. В нашем примере после того, как мы открыли страницу поиска Google, соответствующее ей окно показано впереди и находится в фокусе. Если вы хотите вернуться назад к первому окну, мы должны использовать следующий код: driver.switchTo().window(window1); Он поставит фокус на первое окно. Переключение между фреймами Откройте файл Frames.html. Вы увидите два HTML файла, загруженные в два различных фрейма. Посмотрим, как мы можем вводить текст в текстовые поля, расположенные в каждом из фреймов. public class SwitchBetweenFrames { public static void main(String... args) { WebDriver driver = new FirefoxDriver(); driver.get("file://C:/Frames.html"); Actions action = new Actions(driver); |