Есть ли способ добавить js на все страницы после загрузки через селен?

Я работаю над созданием автоматизированного теста с использованием селена. В настоящее время я хочу выполнить некоторый код js на каждой странице/кадре после его загрузки, чтобы иметь возможность вызывать некоторые функции тестирования в js. Нет необходимости выполнять его сразу после загрузки страницы, я просто хочу быть уверенным, что он будет выполняться на каждой странице.

Чтобы решить эту проблему, я написал свой собственный реализатор WebDriver, который, используя шаблон делегата, добавляет выполнение js после вызова метода «get». Точно так же я добавляю скрипт, выполняющийся во всех методах объекта driver.switchTo(), который изменяет текущий кадр.

Проблема заключается в том, что страница перезагружается после нажатия на некоторые ссылки/выполнения некоторого кода js. Нетрудно понять, что в таком случае мой скрипт не будет выполняться.

Есть ли способ покрыть это поведение с помощью selenium WebDriver?

Любые идеи или хаки великолепны.


person Dmitry    schedule 23.05.2012    source источник


Ответы (3)


Вы можете запустить fiddler в фоновом режиме для проксирования всех HTTP-методов..... В fiddler вы можете добавить пользовательское правило для изменения ответа сервера (путем вставки JS) для каждого конкретного типа HTTP-вызова GET/POST (исключая PNG/ IMG и т. д.)... Я делаю это все время... чтобы воспроизвести сложные для тестирования сценарии.

person PxP    schedule 03.12.2014
comment
Не могли бы вы дать больше пояснений? - person Dakshinamurthy Karra; 11.07.2016

Я бы сделал это на стороне сервера: расширяет все ваши сервлеты с помощью общего сервлета, который добавляет ваш js-код только при запуске Selenium (установите статическую переменную на сервере при запуске Selenium)

person Fabien    schedule 23.05.2012
comment
О_о речь идет о selenium WebDriver, который запускается отдельно от приложения. - person Dmitry; 23.05.2012
comment
При запуске селена вы можете вызвать специальный URL-адрес сервера, который запускает тестовый режим. - person Fabien; 23.05.2012
comment
определенно это возможно, но не так, так как мне не разрешено изменять сервер при создании тестов :(. - person Dmitry; 23.05.2012

Я сделал что-то подобное, используя WebSocket. Создайте сервер WebSocket в приложении. После начального get, execute_script открывается соединение с сервером. Когда браузер переходит на новую страницу, соединение сокета закрывается — вы можете снова выполнить execute_script. Все это немного сложнее, потому что вам нужно проверить наличие iframe, повторить попытку подключения, если оно не работает, и т. д.

Я смог заставить это хорошо работать с Firefox, Chrome. Также должно работать с Edge/IE.

person Dakshinamurthy Karra    schedule 26.08.2016