Selenium 2 содержит новые API и реализации, которые называются WebDriver. Это более простой, быстрый, объектно-ориентированный API-интерфейс, который применим к задачам тестирования современных веб-приложений. Больше не нужно отправлять шестнадцатеричные числа в элемент для написания текста!
Важным нововведением является то, что вам не нужно запускать Selenium Server для локального использования Java Api WebDriver, например, для запуска Firefox в системе Linux, как я. Сервер может работать независимо, но только для совместимости с Selenium 1.x, в сетках для распределенного тестирования или для поддержки привязок на других языках.
WebDriver работает непосредственно с браузером, как всегда делал Selenium; он не работает в клетке JavaScript. В настоящее время поддерживаются привязки Java, C #, Python и Ruby; PHP и Perl могут получить доступ к WebDriver через сторонние привязки.
Водители
WebDriver — это имя интерфейса Java, реализуемого различными драйверами браузера; Вы всегда будете писать код, который зависит только от этого интерфейса.
Основные драйверы:
- HTMLUnit , который использует Rhino в качестве JS и не отображает страницы. Это не настоящий браузер, но он действительно быстрый и поддерживает JavaScript, хотя поддержка отключена по умолчанию (но его легко включить).
- Fire Fox
- Internet Explorer , протестирован до версии 8.x и работает только на машинах Windows.
- Google Chrome для тестирования примера браузера Webkit.
Другие драйверы включают Opera, Android и iPhone, причем последние два работают на реальных устройствах или эмуляторах.
Особенности
По крайней мере, в Java Api читаемость значительно улучшена за счет использования небольших объектов конфигурации, таких как By.id () и ExpectedCondition.
Взаимодействие с DOM в основном блокируется, и есть разные способы ожидания событий:
- явные ожидания , которые охватывают от простого сна в худшем случае до ожидания выполнения условия (например, наличия текста). Вам нужно добавить код, чтобы ждать: поэтому они называются явными .
- Неявное ожидание , когда Selenium продолжает опрашивать DOM, пока не будет найден элемент (потому что он был создан или добавлен), с возможностью тайм-аута. Неявные талии устанавливаются один раз при запуске, и, надеюсь, вам больше никогда не придется беспокоиться о дальнейшей синхронизации.
Я видел даже поддержку скриншотов в документации, на случай, если вы захотите протестировать хрупкие пиксельные макеты.
Пример Java (самый непосредственный Api)
Я скачал привязки Java в виде одного архива, но вы можете использовать Maven, как указано в официальной документации. Я поместил на путь к классу selenium-java-2.9.0.jar и все файлы, представленные в библиотеках.
Затем я запускаю этот тест, взятый из документации (слегка измененный):
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 GoogleSearchTest { /** * @param args */ public static void main(String[] args) { System.out.println(System.currentTimeMillis()); // TODO Auto-generated method stub // 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(); System.out.println(System.currentTimeMillis()); } }
Работа с Firefox в Linux заняла около 8 секунд. Повторные казни кажутся очень стабильными.
В любом случае мне придется провести более серьезное тестирование, чтобы проверить типичные болевые точки тестирования в браузере:
- такие события, как щелчки и фокусировка; поддержка кажется более надежной, так как они теперь генерируются путем управления интерфейсом браузера вместо выполнения кода JavaScript .
- редактирование насыщенного текста;
- ожидание завершения вызовов Ajax;
- ошибки в переводе между Api на разных языках, например, при вызове WebDriver из процесса PHP.
Работа в процессе
Сейчас я не собираюсь разрабатывать набор тестов на основе HTTP (изучаю такие шаблоны, как Page Object). Поддержка Selenium 2 в других языках, таких как PHP, также является важной областью для изучения, поскольку мы хотели бы, чтобы набор тестов был написан на одном языке для каждого из наших приложений: одна команда для запуска и один отчет для чтения. WebDriver предоставляет REST-подобный доступ, поэтому теоретически можно написать привязку на любом языке, который может выполнять HTTP-запросы.
Документация Selenium переписывается, чтобы показать возможности WebDriver, и она определенно находится в стадии разработки. Однако из-за его популярности, выразительной мощи и надежного источника ( ThoughtWorks ) он, вероятно, станет стандартной платформой для сквозного тестирования веб-приложений на ближайшие годы.