Показаны сообщения с ярлыком ajax. Показать все сообщения
Показаны сообщения с ярлыком ajax. Показать все сообщения

вторник, 3 июля 2012 г.

Перехват ajax с помощью BrowserMob Proxy

В данной статье я покажу как перехватывать асинхронный скрипт, используя BrowserMob Proxy. Статья применима ко всем типам фреймворков, но в конкретно будет показан только перехват из JSF RichFaces.

Для начала сконфигурируем pom.xml

<dependencies>
            <dependency>
                <groupId>biz.neustar</groupId>
                <artifactId>browsermob-proxy</artifactId>
                <version>2.0-beta-6</version>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.seleniumhq.selenium</groupId>
                        <artifactId>selenium-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>2.24.1</version>
            </dependency>
        </dependencies>

Теперь можно приступить к написанию кода:

//Стартуем browsermob proxy
ProxyServer server = new ProxyServer(4444);
        server.start();

//перехватываем ajax запрос и пишем в консоль "AJAX is starting"
    server.addRequestInterceptor(new HttpRequestInterceptor() {
            public void process(HttpRequest arg0, HttpContext arg1)
                    throws HttpException, IOException {
                for (Header header : arg0.getAllHeaders()) {
                    if (header.getName().contains("Faces-Request")) {
                        if (header.getValue().contains("partial/ajax")) {
                            System.out.println("AJAX is starting");
                                                }
                    }
                }
            }
        });

Теперь нам необходимо как-то встроить это в наши Selenium тесты (иначе зачем я вообще это пишу)

//получаем прокси
Proxy proxy = server.seleniumProxy();

    //настраиваем
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, proxy);

        // и стартуем браузер
        WebDriver driver = new FirefoxDriver(capabilities);

Теперь каждый раз когда у нас с jsf страницы будет выполнятся ajax мы будем об этом знать.

понедельник, 6 февраля 2012 г.

Пишем безопасное ожидание для браузера

Если вы тестируете веб-приложение которое использует тяжелые и долгие ajax-запросы у вас может возникнуть ситуация когда, браузеру необходимо ждать завершения запроса.

Использование метода Thread.sleep() не безопасно. Зачем нам останавливать всю программу если мы можем просто попросить наш браузер подождать?

Лезть в исходный код Selenium мы не будем. Напишем собственный класс реализующий  интерфейс WebDriver.

public final class MyDriver implements WebDriver {


//реализуем все методы WebDriver
//и добавим свой метод

public void sleep(long timeout) {
try {
new WebDriverWait(this, timeout)
.until(new Predicate<WebDriver>() {
public boolean apply(WebDriver arg0) {
return false;
}
});
} catch (Exception e) {
}
}

}

Собственно на этом все. Теперь когда в вашем тест-кейсе будет требоваться ожидание-просто вызовите метод драйвера sleep();