Насколько я знаю, нет никакого кросс-браузерного метода, который Selenium предоставляет для определения того, что он управляет браузером.В FF webdriver устанавливает атрибут webdriver
для элемента html
, но, очевидно, не в других браузерах.Возможно, когда-нибудь это будет способ обнаружить, что браузер управляется Selenium, но не сейчас.Я только что проверил это с FF и Chrome: атрибут присутствовал в FF, но не в Chrome.Итак, вот что ...
Метод для любого браузера, любой ОС, любого тестировщика
Иногда мне нужно сделать что-то вроде того, чего вы пытаетесь достичь.Я запускаю большие тестовые наборы с Selenium.Эти комплекты работают в нескольких версиях Chrome, Firefox и IE, в Linux, Windows и OS X, при этом некоторые тесты выполняются удаленно в Sauce Labs.
Методы, которые я использовал, основаны на executeScript
.(Я ссылаюсь на документ Java, но этот метод существует для всех платформ, для которых доступен Selenium.) Я использую его для запуска кода на стороне браузера до запуска теста.Я использовал этот метод двумя способами:
Установите переменную сторону браузера на window
, которую проверяет код моего браузера.Так, например, я мог бы установить window.running_test_suite_for_foobar = true
, а затем проверить код.Существует риск конфликта, но если имя переменной используется осторожно, риск минимален.
Другой метод, который я использовал, заключается в том, чтобы спроектировать мой код так, чтобы он имел параметры конфигурации или не имел документовметоды, которые можно вызывать, чтобы правильно настроить его для тестовой среды или полностью отключить.Например, у меня есть модуль onbeforeunload
, который запрещает пользователям переходить со страницы с несохраненными изменениями.В тестировании не полезно включать это вообще.Selenium может обрабатывать всплывающее окно, но при удаленном запуске тестов каждый бит взаимодействия имеет значительную стоимость.Затем несколько десятков тестов, и у вас есть набор тестов, который может легко занять еще несколько минут для запуска.Поэтому у меня есть метод, который я вызываю, чтобы отключить его.
Проблемы с изменением пользовательского агента
Способы сделать это отличаютсяиз браузера в браузер.Ваш код должен проверить, какой браузер вы хотите запустить, а затем выполнить правильное действие в зависимости от браузера.
Методы, показанные для FF и Chrome в других ответах здесь полностью заменить строку пользовательского агента (в отличие от того, что говорили некоторые).Чтобы добавить к нему, вы должны знать, какой будет неизмененная строка.Это изменяется от браузера к браузеру и версии к версии.Я полагаю, вы можете изменить таблицу строк пользовательского агента.Это не то, что я хотел бы поддержать.Или вы можете запустить браузер дважды: один раз, чтобы запросить стандартный пользовательский агент, и один раз, чтобы запустить тест с измененным пользовательским агентом.
И вы не можете лениться с использованием правильной строки пользовательского агента.Хотя верно, что код браузера должен выполнять обнаружение функции , а не обнаружение браузера , остаются некоторые случаи , где единственный разумный способ узнать, что код долженобрабатывать особый случай, зная, в какой версии браузера он запущен. Если проблема заключается в ошибке в браузере, функция не можетпроверить.Проверка того, что ошибка происходит, может быть слишком дорогой или невозможной для надежной работы.Таким образом, код должен проверять строку агента пользователя.Ваш код, возможно, не должен делать это, но сторонний код может.(Например, я столкнулся с проблемой, которая возникает с getBoundingClientRect
, когда координаты были бы некорректными, как правило, в IE, но только в одной версии Chrome. Это слишком дорого, чтобы проверить на наличие ошибки во время выполнения, и я могуУбедитесь, что изменение шрифтов или настроек дисплея не приведет к ложным негативам.)