вторник, 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 мы будем об этом знать.

4 комментария:

  1. Смотрю на pom.xml и думаю какое он отношение имеет к BrowserMob. Нехорошо так. Надо весь стек технологий указывать.

    ОтветитьУдалить
    Ответы
    1. pom.xml нужен для сборщика Maven и разрешения зависимостей. Собственно благодаря нему мы и не подгружаем сами никаких библиотек )
      Мне казалось априори должно быть понятно зачем мы это делаем. А уж человеку который использует selenium и пишет на java и подавно должно быть понятно.

      Удалить
    2. Не, я таки вспомнил в итоге зачем оно (гуглится еще быстрее, но то был спортивный интерес).
      Просто лично я на Java + Selenium уже года три (или четыре?) не пишу и от конфигов в xml отвык порядком :(

      Но в целом было бы круто просто в теги сюда Maven и JSF RichFaces добавить. Да и browsermob на три тега не разносить).
      Просто натурально же отличное место чтобы весь стек под статью выносить - и в статье не мусорит и искать потом удобно (благо тут вроде только технические вещи пишутся).

      Удалить
    3. Об этом я что то не подумал ) сейчас исправим )

      Удалить