среда, июня 12, 2013

Повторное получение созданной сессии WebDriver при помощи Fiddler

Во время отладки теста на Selenium Webdriver, возникает огромное чувство раздражения, когда тест приходится перезапускать полностью и… ждать… ждать пока откроется браузер, ждать пока он дойдет до нужной страницы и заполнит все поля формы для того, чтобы проверить работает ли минимальное изменение в коде. Конечно же, таки фичи Visual Studio как Intellitrace и Edit & Continue могут решить проблему, но не всегда.

Я предлагаю самое простое решение этой проблемы, и хоть исходный код будет на C#, сам подход можно реализовать для любого языка программирования.

Это подмена ответа на запрос создания новой сессии от сервера Webdriver.

Тем самым Webdriver-клиент будет получать всегда одну и ту же сессию от  Webdriver-сервера, следовательно, работать с уже открытым браузером.

А редактировать код можно в так называемой «песочнице» – отдельным методе, где вызывается только проблемный участок. Этот код из «песочницы» вы потом можете перенести в тест-кейс.

Способ подмены сессии от Webdriver-сервера

В самом начале, давайте запустим Селениум сервер:
start  java  -jar selenium-server-standalone-2.33.0.jar
Сервер запущен на локальной машине, но с localhost’ом Fiddler работает не очень хорошо «из коробки»  и требует предварительной настройки, поэтому, обращаться к серверу мы будет по имени моего компьютера – dz, а стандартным портом будет 4444.
Это обычное консольное приложение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using OpenQA.Selenium.Remote;

namespace FakingDriver
{
    class Program
    {
        static void Main(string[] args)
        {
            GlobalProxySelection.Select = new WebProxy("127.0.0.1", 8888);

            var wdServerUrl = new Uri("http://dz:4444/wd/hub");
            var caps = DesiredCapabilities.Firefox();

            var driver = new RemoteWebDriver(wdServerUrl, caps);

            driver.Navigate().GoToUrl("http://blog.zhariy.com");

        }
    }
}

Единственная необычная строчка тут – это:

GlobalProxySelection.Select = new WebProxy("127.0.0.1", 8888);

Именно она позволяет перенаправить все HTTP запросы в .NET приложении через прокси-сервер (Fiddler).

Теперь время открыть Fiddler и настроить его на фильтрацию запросов только к Селениум-серверу. Для этого на вкладке Filter добавляем в Show only if URL containsdz:4444.
Этот шаг необязателен, но позволит избавиться от лишнего «мусора».



Теперь запускаем наше приложение, и наблюдаем за тем, какие запросы оно делает.
Как и ожидалось, самый первый запрос и был на получение новой сессии.



И воспользуемся магией Autoresponder, и добавим запрос в список.  Тут очень важно не только включить Enable automatic responses, но и галочку Unmatched requests passthrough.



Это все. Теперь строка кода

var driver = new RemoteWebDriver(wdServerUrl, caps);

Всегда будет получать одну и ту же сессию открытого браузера.

Комментариев нет: