Selenium 2.0 и WebDriver

Programming Language Preference

 

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

Возможности Selenium 2.0

Selenium 2.0 содержит множество замечательных возможностей и улучшений по сравнению с Selenium 1. Самое главное изменение новой версии - это интеграция WebDriver API, альтернативного, упрощенного программного интерфейса, который избавлен от недостатков, характерных для Selenium 1. Цель создания WebDriver API - разработать объектно-ориентированный API, поддерживающий большее количество браузеров и лучше решающий проблемы тестирования современных веб-приложений.

Примечание: Описание новых возможностей Selenium 2.0 будет добавлено позднее. А пока мы отсылаем читателя к официальному анонсу в блоге.

Когда надо использовать Selenium Server

В зависимости от того, каким образом вы намереваетесь использовать Selenium, вам может потребоваться Selenium Server. Если вы будете использовать исключительно WebDriver API, то он вам не пригодится. Selenium Server предоставляет функциональность Selenium RC, тем самым обеспечивая обратную совместимость с Selenium 1.0. Поскольку WebDriver использует принципиально иной подход к взаимодействию с браузером, для его работы Selenium Server не нужен. WebDriver напрямую обращается к браузеру, используя родные для него средства автоматизации. В отличие от него, Selenium RC нуждается в использовании Selenium Server для внедрения специального JavaScript кода в браузер, а также для трансляции сообщений клиентской библиотеки Selenium для языка, на котором написана ваша тестовая программа, в команды вызывающие JavaScript-команды, которые, в свою очередь, автоматизируют действия с тестируемым приложением в браузере. Проще говоря, если вы используете только WebDriver, то Selenium Server вам не нужен.

Другой причиной, почему вам может потребоваться Selenium Server, может быть использование Selenium Grid для распределенного выполнения тестов. И наконец, он вам понадобится, если вы используете WebDriver поверх Selenium (реализация WebDriver API, использующая технологию Selenium 1 для взаимодействия с браузером). Эти темы рассмотрены подробнее далее в этой главе.

Создание проекта для разработки тестов с использованием WebDriver

Действия, необходимые для создания программного проекта, позволяющего разрабатывать тесты с использованием Selenium, зависят от того, на каком языке программирования и с помощью каких сред разработки вы собираетесь это делать.

Java

Самый простой способ для этого языка программирования - использовать Maven для создания проекта. Maven автоматически загрузит клиентскую библиотеку Selenium 2.0 для языка Java вместе со всеми зависимостями и создаст проект, используя файл pom.xml (конфигурационный файл проекта). После того, как вы это сделали, вы можете импортировать проект в предпочитаемую вами среду разработки (IDE) - IntelliJ IDEA или Eclipse.

Сперва создайте директорию, в которой будут находиться все файлы вашего проекта. Затем, чтобы воспользоваться Maven, вам потребуется файл pom.xml, который может быть создан любым текстовым редактором. Мы не будем вдаваться в подробности работы Maven или устройства файла pom.xml, так как это хорошо описано в источниках информации, посвященных этому инструменту. Ваш файл pom.xml будет выглядеть как в приведенном ниже примере. Файл должен находится в директории вашего проекта.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>MySel20Proj</groupId>
        <artifactId>MySel20Proj</artifactId>
        <version>1.0</version>
        <dependencies>
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>2.17.0</version>
            </dependency>
        </dependencies>
</project>

Убедитесь в том, указана последняя версия Selenium. На момент написания указанная в примере версия является последней, однако новые релизы Selenium 2.0 выходят часто. Сверьтесь с информацией, приведенной на веб-странице, где указаны настройки Maven для текущей версии Selenium, и соответствующим образом измените зависимость (<dependency>).

Теперь в командной строке перейдите (cd) в директорию вашего проекта и запустите Maven следующим образом:

mvn clean install

Эта команда загрузит Selenium и все зависимости, а также добавит их в ваш проект.

Наконец, импортируйте созданный проект в в предпочитаемую вами среду разработки. Для тех, кто делает это впервые, мы написали инструкцию.

Импорт проекта Maven в IntelliJ IDEA.

C#

Начиная с версии 2.2.0 Selenium поставляется как набор подписанных (signed) DLL-библиотек и всех библиотек, от которых зависит Selenium. До версии 2.2.0 все DLL-библиотеки Selenium были не подписаны. Для включения Selenium в ваш проект просто скачайте последнюю версию zip-архива selenium-dotnet с сайта https://code.google.com/p/selenium/downloads/list.

Если вы используете Windows Vista или более новую, вам сначала следует разблокировать zip-архив: щелкните правой кнопкой мыши на архиве, выберите “Свойства”, затем “Разблокировать” и нажмите “ОК”.

Извлеките содержимое архива и добавьте ссылки на разархивированные DLL-библиотеки в ваш проект в Visual Studo или в любой другой используемой вами IDE.

Selenium также распространяется в виде набора пакетов NuGet:

Python

Если вы используете Python для автоматизации тестирования, значит, вероятнее всего, вы уже знакомы с тем, как происходит разработка приложений на нем. Для добавления Selenium к вашему окружению языка Python выполните следующую команду в командной строке:

pip install selenium

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

Ruby

Если вы используете Ruby для автоматизации тестирования, значит, вероятнее всего, вы уже знакомы с этим языком программирования. Для добавления Selenium к вашему окружению языка Ruby выполните следующую команду в интерфейсе командной строки:

gem install selenium-webdriver

Обучение языку Ruby выходит за рамки данного руководства, однако существует множество источников информации о Ruby и, вероятно, вам смогут помочь работающие с вами разработчики.

Perl

В настоящее время Selenium 2.0 не поддерживает Perl. Если у вас есть вопросы или вы хотите предложить помощь в разработке поддержки данного языка, пожалуйста, напишите нашим разработчикам.

PHP

В настоящее время Selenium 2.0 не поддерживает PHP. Если у вас есть вопросы или вы хотите предложить помощь в разработке поддержки данного языка, пожалуйста, напишите нашим разработчикам.

Переход с Selenium 1.0

Для тех, у кого уже есть наборы тестов, написанных с использованием Selenium 1.0, мы предлагаем ряд рекомендаций по тому, как перенести существующий код на Selenium 2.0. Саймон Стюарт (Simon Stewart), ведущий разработчик Selenium 2.0, написал статью по этому поводу, которую вы можете найти в приложении “Миграция с Selenium RC на WebDriver”.

Миграция с Selenium RC на WebDriver

Начало работы с Selenium WebDriver

WebDriver – это инструмент для автоматизированного тестирования веб-приложений, в частности, для проверки того, что приложение работает в соответствии с ожиданиями. Этот инструмент задумывался таким образом, чтобы иметь удобный программный интерфейс (API), позволяющий повысить читаемость и упростить поддержку тестов, более легкий для изучения и понимания, чем Selenium RC (1.0) API. WebDriver API не привязан ни к каким тестовым фреймворкам, что позволяет использовать любые фреймворки модульного тестирования, равно как и старый добрый метод “main”.

Этот раздел поможет ознакомиться с азами WebDriver API и сделать первые шаги в его использовании. Начните с создания WebDriver-проекта, если вы этого еще не сделали, как описано в предыдущем разделе, Создание проекта для разработки тестов с использованием WebDriver.

Когда вы создадите проект, вы увидите, что WebDriver ведет себя как обычная библиотека: он полностью самодостаточен и, как правило, вам не нужно помнить о необходимости запуска дополнительных процессов или запуска инсталляторов перед его использованием, в отличие от прокси-сервера Selenium RC.

Теперь вы готовы начать писать код. Посмотрите следующий пример, который запускает поиск слова “Cheese” в Google и затем печатает заголовок результирующей страницы в консоль.

package org.openqa.selenium.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium2Example  {
    public static void main(String[] args) {
        // Create a new instance of the Firefox driver
        // Notice that the remainder of the code relies on the interface, 
        // not the implementation.
        WebDriver driver = new FirefoxDriver();

        // And now use this to visit Google
        driver.get("http://www.google.com");
        // Alternatively the same thing can be done like this
        // driver.navigate().to("http://www.google.com");

        // Find the text input element by its name
        WebElement element = driver.findElement(By.name("q"));

        // Enter something to search for
        element.sendKeys("Cheese!");

        // Now submit the form. WebDriver will find the form for us from the element
        element.submit();

        // Check the title of the page
        System.out.println("Page title is: " + driver.getTitle());
        
        // Google's search is rendered dynamically with JavaScript.
        // Wait for the page to load, timeout after 10 seconds
        (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().toLowerCase().startsWith("cheese!");
            }
        });

        // Should see: "cheese! - Google Search"
        System.out.println("Page title is: " + driver.getTitle());
        
        //Close the browser
        driver.quit();
    }
}
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium;

class GoogleSuggest
{

    static void Main(string[] args)
    {
        IWebDriver driver = new FirefoxDriver();

        //Notice navigation is slightly different than the Java version
        //This is because 'get' is a keyword in C#
        driver.Navigate().GoToUrl("http://www.google.com/");
        IWebElement query = driver.FindElement(By.Name("q"));
        query.SendKeys("Cheese");
        System.Console.WriteLine("Page title is: " + driver.Title);
        // TODO add wait
        driver.Quit();
    }

}
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
import time

# Create a new instance of the Firefox driver
driver = webdriver.Firefox()

# go to the google home page
driver.get("http://www.google.com")

# find the element that's name attribute is q (the google search box)
inputElement = driver.find_element_by_name("q")

# type in the search
inputElement.send_keys("Cheese!")

# submit the form (although google automatically searches now without submitting)
inputElement.submit()

# the page is ajaxy so the title is originally this:
print driver.title

try:
    # we have to wait for the page to refresh, the last thing that seems to be updated is the title
    WebDriverWait(driver, 10).until(lambda driver : driver.title.lower().startswith("cheese!"))

    # You should see "cheese! - Google Search"
    print driver.title

finally:
    driver.quit()
require 'rubygems'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://google.com"

element = driver.find_element :name => "q"
element.send_keys "Cheese!"
element.submit

puts "Page title is #{driver.title}"

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until { driver.title.downcase.start_with? "cheese!" }

puts "Page title is #{driver.title}"
driver.quit

В следующих разделах вы узнаете о том, как использовать WebDriver для таких задач, как переход вперед и назад по истории вашего браузера, а также для тестирования веб-сайтов содержащих фреймы и открывающих несколько окон. А также мы рассмотрим и обсудим ещё много разных примеров.

Драйверы, входящие в состав WebDriver

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

Название драйвераПоддерживаемая ОСКласс для создания экземпляра
HtmlUnit Driver Все org.openqa.selenium.htmlunit.HtmlUnitDriver
Firefox Driver Все org.openqa.selenium.firefox.FirefoxDriver
Internet Explorer Driver Windows org.openqa.selenium.ie.InternetExplorerDriver
Chrome Driver Все org.openqa.selenium.chrome.ChromeDriver
Opera Driver    
iPhone Driver    
Android Driver    

Эта таблица находится в состоянии разработки

Следуя по ссылкам в таблице вы найдете больше информации о каждом. Какой из них использовать - зависит от того, что вы хотите сделать. HtmlUnit Driver - лучший выбор с точки зрения скорости, однако он не графический, что означает, что вы не сможете наблюдать за происходящим. Как программист вы можете быть полностью удовлетворены такой функциональностью. Но иногда использование реального браузера может быть весьма полезным, особенно если вы демонстрируете свое приложение или запускаете тесты перед аудиторией. Зачастую это требуется для оценки “надежности” тестов. Различают две ее разновидности. Первая, “реальная надежность”, заключается в соответствии ожидаемой работы тестов действительности. Она может быть измерена и выражена количественно. Вторая, “ощущаемая надежность”, заключается в уверенности наблюдателя в том, что тесты работают, как задумано, и зависит от конкретного человека, его знакомства с тестируемым продуктом, WebDriver и тестовым фреймворком.

Для большей “ощущаемой надежности” вы можете выбрать другой драйвер, такой как Firefox Driver. Его преимущество в том, что он на самом деле отображает веб-страницу в настоящем браузере, и, как следствие, это дает возможность определить, например, позицию элемента на странице или применяемые к нему свойства CSS. Однако эти возможности имеют свою цену - скорость выполнения тестов сильно уменьшается. Когда вы разрабатываете тесты с использованием WebDriver у вас есть возможность выбрать наиболее подходящий драйвер для каждого конкретного теста.

Давайте начнем с самого простого драйвера HtmlUnit Driver:

WebDriver driver = new HtmlUnitDriver();

Команды и операции

Открытие страниц

Первая вещь, которую вы вероятно захотите сделать при помощи WebDriver - открыть веб-страницу. Для этого обычно используют метод “get”:

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

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

Взаимодействие со страницей

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

<input type="text" name="passwd" id="passwd-id" />

то можно найти его любым из приведенных ниже способов:

WebElement element;
element = driver.findElement(By.id("passwd-id"));
element = driver.findElement(By.name("passwd"));
element = driver.findElement(By.xpath("//input[@id='passwd-id']"));

Вдобавок к этому, вы можете находить ссылки по их тексту. Но будьте внимательны! Текст ссылки должен быть точным совпадением! Также, будьте внимательны при использовании XPath в WebDriver. В случае, если критериям поиска удовлетворяет несколько элементов, результатом выполнения “findElement” будет первый из них. Если же ничего найти не удалось, будет выдано исключение “NoSuchElementException”.

WebDriver обладает объектно-ориентированным API, все типы элементов страницы представлены единым интерфейсом WebElement. Это означает, что несмотря на то, что функция автозаполнения в IDE показывает вам множество возможных методов, не все они будут иметь смысл или могут быть применены к конкретному найденному элементу. Не волнуйтесь! Если вы вызовете метод, который не имеет смысла (например, setSelected() для элемента “meta”), это приведет к появлению исключения.

Итак, вы нашли элемент страницы, что дальше? Во-первых, вы можете пожелать ввести какой-либо текст в поле ввода:

element.sendKeys("немного текста");

Вы можете имитировать нажатие стрелок на клавиатуре используя класс “Keys”:

element.sendKeys(" еще немного текста", Keys.ARROW_DOWN);

Можно вызывать метод “sendKeys” для любого элемента, что дает возможность тестировать “горячие клавиши”, вроде тех, что есть в GMail. Это дает следующий побочный эффект: когда вы что-то вводите в текстовое поле, оно не будет очищено автоматически. Иначе говоря, то, что вы вводите, будет добавлено к уже имеющемуся тексту. Однако вы легко можете очистить текстовое поле (как однострочное “input type=’text’”, так и многострочное “textarea”):

element.clear();

Идентификация элементов страницы

Примечание: данный раздел нуждается в доработке.

Идентификация элементов в WebDriver происходит при помощи класса “By”. Этот класс реализует все используемые методы поиска.

Использование XPath выражений

WebDriver использует встроенные возможности браузеров везде, где это возможно. Для тех браузеров, в которых встроенная поддержка XPath отсутствует, мы сделали собственную реализацию. Все это может приводить к неожиданным результатам в некоторых случаях, если вы не знаете о различиях в поведении, присущих разным реализациям XPath.

ДрайверИмя атрибута или тегаЗначение атрибутаВстроенная поддержка XPath
HtmlUnit Driver Строчные буквы Так, как в HTML документе Да
Internet Explorer Driver Строчные буквы Так, как в HTML документе Нет
Firefox Driver Не зависит от регистра Так, как в HTML документе Да

Поскольку это несколько абстрактно, рассмотрим пример. Для следующего HTML кода:

<input type="text" name="example" />
<INPUT type="text" name="other" />

эти выражения будут находить следующее количество совпадений:

XPath выражениеHtmlUnit DriverFirefox DriverInternet Explorer Driver
//input 1 (“example”) 2 2
//INPUT 0 2 0

Иногда HTML элементы не нуждаются в явном указании атрибутов в коде по причине того, что они имеют какое-то стандартное значение по умолчанию. Например: элемент “input” не нуждается в атрибуте “type”, потому что этот атрибут имеет значение по умолчанию “text”. В такой ситуации на практике вы НЕ должны ожидать, что XPath-запрос обнаружит такой неявный атрибут.

Ввод данных - Заполнение полей формы

Мы уже познакомились с тем, как вводить данные в текстовые поля, но как быть с другими элементами? Вы можете использовать метод click для переключения состояния чекбоксов или выбора нужного значения (тег “option”) из списка (тег “select”). Работа со списками не так уж и сложна:

WebElement select = driver.findElement(By.xpath("//select"));
List<WebElement> allOptions = select.findElements(By.tagName("option"));
for (WebElement option : allOptions) {
    System.out.println(String.format("Значение: %s", option.getAttribute("value")));
    option.click();
}

Этот фрагмент кода найдет первый элемент “select” на странице и в цикле переберет все варианты выбора (“option”), выводя с каждой итерацией значение текущего варианта, а также помечая его выбранным. Впрочем, вы наверняка заметили, что это не самый удобный способ работы с элементом “select”. Среди вспомогательных классов WebDriver существует специальный класс “Select”, предоставляющий удобные для работы с такими элементами методы.

Select select = new Select(driver.findElement(By.xpath("//select")));
select.deselectAll();
select.selectByVisibleText("Эдам");

Приведенный код найдет первый элемент “select” на странице, отменит текущий выбор (deselect all), а затем выберет элемент с текстом “Эдам”.

После того, как вы заполните поля формы, вы, вероятно, захотите отправить её. Один из способов сделать это - найти и нажать кнопку отправки.

driver.findElement(By.id("submit")).click();
// если предположить, что ID кнопки - submit

Кроме того, WebDriver позволяет вызывать метод “submit” для произвольного элемента. Если он вызван для элемента, который находится в некоторой форме, WebDriver будет двигаться вверх по DOM до тех пор, пока не найдет форму, включающую его в себя, и затем вызовет для нее “submit”. Если элемент находится не внутри формы, то будет выдано исключение “NoSuchElementException”.

element.submit();

Переключение между окнами и фреймами

Некоторые веб-приложения имеют несколько окон или фреймов. WebDriver способен переключаться между ними при помощи метода “switchTo”:

driver.switchTo().window("windowName");

Все последующие вызовы “driver” будут интерпретированы как адресованные к определенному окну. Но как узнать нужное имя окна? Посмотрите на javascript или ссылку, которые открывают окно:

<a href="somewhere.html" target="windowName">Эта ссылка открывает новое окно</a>

Также вы можете передать методу “switchTo().window()” дескриптор окна. Так, описанным ниже способом, вы можете обойти все окна:

for (String handle : driver.getWindowHandles()) {
    driver.switchTo().window(handle);
}

Также вы можете переключаться в нужные фреймы (или плавающие фреймы):

driver.switchTo().frame("frameName");

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

driver.switchTo().frame("frameName.0.child");

Этот код приведет вас во фрейм с именем “child”, находящийся внутри первого фрейма (индекс 0), вложенного во фрейм с именем “frameName”. Нумерация фреймов идет *с верхнего*.

Всплывающие диалоговые окна

Начиная с 2.0 beta 1, Selenium располагает встроенными средствами для работы с диалоговыми окнами. После выполнения какого-либо действия, приводящего к появлению диалога на экране, вы можете получить к нему доступ следующим образом:

Alert alert = driver.switchTo().alert();

Этот код вернет объект, соответствующий модальному диалогу, открытому на экране в данный момент. При помощи этого объекта вы можете совершить действия “принятия”, “отказа”, получить содержимое окна или даже написать что-либо в поле ввода диалога. Интерфейс Alert одинаково хорошо работает для диалогов alert, confirm и prompt. Для получения дополнительной информации ознакомьтесь с JavaDocs.

Навигация по истории браузера

Ранее мы говорили о навигации при помощи метода “get” (“driver.get(“http://www.example.com”)”). Как вы, возможно, заметили из предыдущего раздела, WebDriver использует небольшие узкоспециализированные интерфейсы для различных задач (таких как работа с диалоговыми окнами). Поскольку загрузка страницы является основополагающей задачей, осуществляющий её метод находится в основном интерфейсе WebDriver. На самом деле он - всего лишь синоним для следующего кода:

driver.navigate().to("http://www.example.com");

Еще раз: “”navigate().to()”” и “”get()”” делают абсолютно одно и то же. Просто второй короче писать.

Интерфейс навигации (“navigate”) обладает возможностью перемещаться вперед и назад по истории браузера:

driver.navigate().forward();
driver.navigate().back();

Учтите, что данная функциональность полностью полагается на ее реализацию браузером. Если вы привыкли к определенному поведению одного браузера, есть вероятность того, что в другом может произойдет нечто вами не ожидаемое.

Куки (cookies)

Давайте рассмотрим, как работать с куки, прежде чем идти дальше. Прежде всего, вы должны работать со страницей, находящейся в домене, для которого эти куки действительны. Если вы хотите установить куки до того, как начнете взаимодействие с веб-сайтом, и если ваша главная страница большая (или долго загружается), вы можете воспользоваться любой другой, меньшей по объему, страницей. Например, это может быть страница 404 (http://example.com/some404page).

// Переходим на страницу в нужном домене
driver.get("http://www.example.com");

// Теперь устанавливаем куки. Этот действителен для всего домена.
// Здесь имя cookie это 'key' и значение 'value'
Cookie cookie = new Cookie("key", "value");
driver.manage().addCookie(cookie);

// Выводим все куки доступные для текущего URL
Set<Cookie> allCookies = driver.manage().getCookies();
for (Cookie loadedCookie : allCookies) {
    System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
}

// Удалить куки можно 3 способами
// Используя имя
driver.manage().deleteCookieNamed("CookieName");
// Используя объект Cookie
driver.manage().deleteCookie(loadedCookie);
// Или все сразу
driver.manage().deleteAllCookies();
# Переходим на страницу в нужном домене
driver.get("http://www.example.com")

# Теперь устанавливаем куки. Этот действителен для всего домена.
# Здесь имя куки это 'key' и значение 'value'
driver.add_cookie({'key': 'value'})

# Выводим все куки доступные для текущего URL
for cookie in driver.get_cookies:
    print "%s -> %s" % (cookie['name'], cookie['value'])

# Удалить куки можно 2 способами
# По имени
driver.delete_cookie("CookieName")
# Или все сразу
driver.delete_all_cookies()

Перетаскивание (Drag&Drop)

Вот пример того как использовать класс Actions для перетаскивания (drag&drop).

WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));

new Actions(driver).dragAndDrop(element, target).perform();

Подробнее про это рассказано в главе appendix_advanced_user_interactions

Достоинства, недостатки и специфика драйверов

HtmlUnit Driver

На данный момент это наиболее быстрая и легковесная реализация WebDriver. Базируется на технологии HtmlUnit, что, собственно, ясно из названия.

Плюсы

  • Самая быстрая реализация WebDriver.
  • Платформенно-независимое решение, так как используется только Java.
  • Поддержка JavaScript.

Минусы

  • Эмулирует реализацию JavaScript браузера (подробности ниже)

JavaScript в HtmlUnit Driver

Ни один из популярных браузеров не использует движок JavaScript, используемый HtmlUnit (Rhino). Если вы тестируете JavaScript при помощи HtmlUnit, то результаты работы могут существенно отличаться от работы в “настоящих” браузерах.

Когда мы говорим “JavaScript”, на самом деле мы подразумеваем “JavaScript и DOM”. И хотя DOM API и его поведение описаны в стандартах W3C, каждый браузер имеет собственную реализацию со своими особенностями и различиями в поведении, а также в том, как JavaScript взаимодействует с DOM. HtmlUnit имеет впечатляюще полную реализацию DOM и хорошую поддержку JavaScript. Но при этом он ничем не отличается от остальных браузеров: его реализация так же имеет свои особенности и отличия, как от стандарта W3C, так и от наиболее популярных браузеров, не смотря на способность их имитации.

Используя WebDriver, мы стоим перед выбором - либо включить поддержку JavaScript в HtmlUnit Driver, повысив вероятность возникновения связанных с этим проблем, или выключить JavaScript, зная, что все больше и больше сайтов зависят от него. Мы придерживаемся консервативного подхода, и JavaScript по умолчанию выключен в HtmlUnit. Каждый раз перед выходом релиза WebDriver и HtmlUnit мы рассматриваем возможность включить JavaScript по умолчанию, и надеемся, что рано или поздно такой момент настанет.

Включение JavaScript

Если вы не можете ждать, включить JavaScript совсем несложно:

HtmlUnitDriver driver = new HtmlUnitDriver();
driver.setJavascriptEnabled(true);

Этот код включит JavaScript, и по умолчанию HtmlUnit Driver будет эмулировать обработку JavaScript браузером Internet Explorer.

Firefox Driver

Плюсы

  • Запуск тестов в реальном браузере, поддержка JavaScript
  • Быстрее, чем Internet Explorer Driver

Минусы

Изменение User Agent

При использовании Firefox Driver это можно сделать так:

FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "тут указан UserAgent");
WebDriver driver = new FirefoxDriver(profile);

Изменение профиля Firefox

Предположим, вы хотите изменить User Agent, но у вас есть профиль, содержащий множество полезных пользовательских расширений. Есть два способа, как можно использовать такой профиль. Если этот профиль был создан при помощи менеджера профилей FireFox (“firefox -ProfileManager”), тогда можно найти его по имени:

ProfileIni allProfiles = new ProfilesIni();
FirefoxProfile profile = allProfiles.getProfile("WebDriver");
profile.setPreferences("foo.bar", 23);
WebDriver driver = new FirefoxDriver(profile);

Другой способ, если профиль не был зарегистрирован в Firefox:

File profileDir = new File("path/to/top/level/of/profile");
FirefoxProfile profile = new FirefoxProfile(profileDir);
profile.addAdditionalPreferences(extraPrefs);
WebDriver driver = new FirefoxDriver(profile);

По мере разработки новых возможностей Firefox Driver мы даем возможность их использования. Например, для операционной системы Linux поддержка нативных событий отключена по умолчанию до тех пор, пока мы не будем уверены в их стабильной работе. Но тем не менее вы можете включить эту возможность:

FirefoxProfile profile = new FirefoxProfile();
profile.setEnableNativeEvents(true);
WebDriver driver = new FirefoxDriver(profile);

Дополнительная информация

Наиболее актуальную информацию вы можете найти на странице про Firefox в нашей вики

Internet Explorer Driver

Этот драйвер был протестирован на Internet Explorer 6, 7 и 8 на Windows XP и Vista.

Плюсы

  • Запуск тестов в реальном браузере, поддержка JavaScript

Минусы

  • Очевидно, что работает только на Windows!
  • Относительно медленный (хотя, местами, весьма шустрый :)

Дополнительная информация

Наиболее актуальную информацию вы можете найти на странице про Internet Explorer в нашей вики . Обратите особое внимание на раздел “Требования к конфигурации” (Required Configuration).

Chrome Driver

Chrome Driver разрабатывается и поддерживается участниками проекта Chromium

Плюсы

  • Запуск тестов в реальном браузере и поддержка JavaScript
  • Так как Chrome базируется на движке Webkit, это позволит убедиться, что веб-сайт с известной долей вероятности работает и в браузере Safari. Однако учтите, что, поскольку Chrome использует интерпретатор JavaScript V8, а Safari - Nitro, исполнение JavaScript может отличаться.

Минусы

Запуск тестов с Chrome Driver

Скачайте запускаемый файл Chrome Driver и следуйте инструкциям на странице нашей вики

Opera Driver

Самую свежую информацию об использовании Opera Driver вы можете найти в разделе про Opera Driver в нашей вики.

iPhone Driver

Самую свежую информацию об использовании Mac iOS Driver вы можете найти в разделе про iPhone Driver на нашей вики.

Android Driver

Самую свежую информацию об использовании Android Driver вы можете найти в разделе про Android Driver на нашей вики.

WebDriver под Selenium RC

Java-версия WebDriver включает в себя реализацию Selenium RC API. Это означает, что вы можете использовать лежащую в основе WebDriver технологию в сочетании с Selenium RC API. В первую очередь эта возможность существует для обеспечения обратной совместимости. Это позволяет существующим тестовым наборам, написанным на базе Selenium RC API работать поверх WebDriver, что облегчает переход на использование Selenium WebDriver. Также это позволяет использовать сразу оба API, бок о бок в одном и том же коде теста.

Пример использования Selenium-WebDriver:

// Вы можете использовать любую реализацию WebDriver. В качестве примера используется Firefox
WebDriver driver = new FirefoxDriver();

// Базовый URL, используемый Selenium для преобразования всех относительных URL
String baseUrl = "http://www.google.com";

// Создаем объект Selenium RC
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

// Выполняем действия, используя Selenium RC API
selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");

// Получаем используемый объект WebDriver. Это будет тот же самый
// экземпляр WebDriver, на который ссылается выше переменная "driver".
WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getUnderlyingWebDriver();

// В конце мы закрываем браузер. Необходимо вызывать метод "stop" у экземпляра
// "WebDriverBackedSelenium", а не "driver.quit()". В противном случае
// JVM продолжит работу после того, как будет закрыт браузер.
selenium.stop();

Плюсы

  • Позволяет одновременно использовать WebDriver API и Selenium API.
  • Предоставляет возможность легкого перехода с Selenium RC API на WebDriver.
  • Не требует запуска Selenium RC Server.

Минусы

  • Реализованы не все методы.
  • Продвинутые возможности (например, “browserbot” или другие методы JavaScript встроенного в Selenium Core) могут быть недоступны
  • Работа некоторых методов может замедлиться в связи с различиями в используемых технологиях.

Selenium под WebDriver

WebDriver не поддерживает столь же много браузеров, сколько поддерживает Selenium RC. Обеспечить такую поддержку, используя WebDriver, вы можете при помощи класса “SeleneseCommandExecutor”:

Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName("safari");
CommandExecutor executor = new SeleneseCommandExecutor("http:localhost:4444/", "http://www.google.com/", capabilities);
WebDriver driver = new RemoteWebDriver(executor, capabilities);

На данный момент у этого подхода существуют некоторые существенные ограничения, в частности то, что метод “findElements” может работать не так, как ожидается. А также, поскольку для непростой задачи управления браузером используется Selenium Core, вы ограничены изолированной средой исполнения JavaScript.

Вики Selenium WebDriver

Дополнительную информацию можно найти на странице в нашей WebDriver вики.

Дальнейшие шаги

Этот раздел поверхностно описывает WebDriver API и его ключевые возможности. После ознакомления с WebDriver API вы скорее всего захотите узнать как создавать легко поддерживаемые, расширяемые тестовые наборы, которые не начинают сбоить при частых изменениях тестируемого приложения. Многие эксперты по Selenium рекомендуют использовать шаблон проектирования Page Object, по возможности совместно с шаблоном Page Factory. Для этих целей WebDriver API включает класс “PageFactory” в таких языках как Java и C#. Как использовать данный подход, а также и некоторые другие углублённые знания описаны в следующей главе. В главе Аспекты проектирования тестов также дано описание данного подхода. Обе эти главы посвящены методам создания удобных для поддержки тестов путем разделения программного кода на логические модули.

Дополнительная информация