Статьи

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

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 ) он, вероятно, станет стандартной платформой для сквозного тестирования веб-приложений на ближайшие годы.