Есть ли способ определить, что я нахожусь на странице Selenium Webdriver из JavaScript

Я хотел бы подавить инициализацию TinyMCE в своих тестах и ​​могу легко сделать это, если JavaScript может обнаружить что я запускаю внутри страницы, автоматизированной Selenium.

Итак, есть ли код JavaScript, который я могу использовать для обнаружения драйвера Selenium? В качестве альтернативы, как я могу расширить строку userAgent, чтобы включить шаблон, который я могу обнаружить с помощью JavaScript?

Если это действительно важно, я запускаю это через Cucumber и Capybara в Mac OS X.


person Lee Iverson    schedule 01.09.2010    source источник
comment
просто чтобы я понял, вы используете Selenium-RC (Selenium 1.x) или WebDriver (Selenium 2.x)?   -  person pnewhook    schedule 01.09.2010
comment
Это Webdriver через гем selenium-webdriver-0.0.28.   -  person Lee Iverson    schedule 02.09.2010


Ответы (5)


Насколько мне известно, Selenium не предоставляет кросс-браузерного метода для определения того, что он управляет браузером. В Firefox webdriver устанавливает атрибут webdriver для элемента html, но, по-видимому, не в других браузерах. Возможно, когда-нибудь это станет способом определить, что браузер управляется Selenium, но не сейчас. Я только что протестировал его с Firefox и Chrome: атрибут присутствовал в Firefox, но не в Chrome. Так вот что...

Метод для любого браузера, любой ОС, любого средства запуска тестов

Иногда мне нужно сделать что-то вроде того, чего вы пытаетесь достичь. Я запускаю большие наборы тестов с Selenium. Эти наборы работают в нескольких версиях Chrome, Firefox и Internet Explorer, в Linux, Windows и OS X, при этом некоторые тесты выполняются удаленно в Sauce Labs.

Методы, которые я использовал, основаны на executeScript. (Я ссылаюсь на документацию по Java, но этот метод существует для всех платформ, для которых доступен Selenium.) Я использую его для запуска кода на стороне браузера перед запуском теста. Два способа, которыми я использовал этот метод:

  1. Установите переменную на стороне браузера на window, которую проверяет мой код браузера. Так что я мог бы, например, установить window.running_test_suite_for_foobar = true, а затем проверить код. Существует риск конфликта, но если имя переменной используется осторожно, риск минимален.

  2. Другой метод, который я использовал, заключается в разработке моего кода таким образом, чтобы он имел параметры конфигурации или недокументированные методы, которые можно вызывать для правильной настройки для тестовой среды или для полного отключения. Например, у меня есть модуль onbeforeunload, который не позволяет пользователям уйти со страницы с несохраненными изменениями. При тестировании вообще бесполезно включать это.

Selenium может обработать всплывающее окно, но когда вы запускаете тесты удаленно, каждое взаимодействие требует значительных затрат. Затем умножьте на десятки тестов, и вы получите набор тестов, выполнение которого может занять еще несколько минут. Итак, у меня есть метод, который я вызываю, чтобы отключить его.

Проблемы со сменой пользовательского агента

  1. Способы сделать это различаются от браузера к браузеру. Ваш код должен проверить, какой браузер вы хотите запустить, а затем выполнить правильное действие в зависимости от браузера.

  2. Методы, показанные для Firefox и Chrome в других ответах здесь, полностью заменяют строку пользовательского агента (вопреки тому, что говорят некоторые). Чтобы добавить к нему, вам нужно знать, какой будет неизмененная строка. Это меняется от браузера к браузеру и от версии к версии.

    Я думаю, у вас может быть таблица стандартных строк пользовательского агента для изменения. Это не то, что я хотел бы поддерживать. Или вы можете запустить браузер дважды: один раз, чтобы запросить стандартный пользовательский агент, и один раз, чтобы запустить тест с измененным пользовательским агентом.

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

    Если проблема связана с ошибкой в браузере, нет функции для проверки. Проверка наличия ошибки может быть слишком дорогостоящей или невозможной для надежной проверки. Таким образом, код должен проверять строку пользовательского агента. Ваш код может не делать этого, но сторонний код может. (Например, я столкнулся с проблемой, которая происходит с getBoundingClientRect, когда координаты были бы неправильными, как правило, в Internet Explorer, но только в одной версии Chrome. Проверка ошибки во время выполнения слишком затратна, и я могу не будьте уверены, что изменение шрифтов или настроек отображения не приведет к ложным отрицательным результатам.)

person Louis    schedule 01.11.2014

Поскольку в вопросе упоминается Capybara, вот эквивалентный код в Ruby:

profile = Selenium::WebDriver::Firefox::Profile.new
profile['general.useragent.override'] = "my ua string"

driver = Selenium::WebDriver.for :firefox, :profile => profile
person jarib    schedule 07.09.2010
comment
Спасибо, это хорошо вписывается в сценарий Capybara. - person Lee Iverson; 08.09.2010

Да, вы можете сделать это, если кто-то использует драйвер Firefox для автоматизации Selenium, для обнаружения драйвера Selenium вы должны ввести следующий код на стороне клиента:

$(document).ready(function() {
    try{
        if(window.document.documentElement.getAttribute("webdriver"))
            alert("Caught in the first case: Selenium Webdriver is banned!!!");
    }
    catch(Exception)
    {
    }

    try{
       if(navigator.webdriver)
           alert("Caught in the second case: Selenium Webdriver is banned!!!");
    }
    catch(Exception)
    {
    }
});

Для Chrome и Internet Explorer браузер Selenium не работает.

person Onkar_M18    schedule 29.12.2016
comment
как мы можем скрыть переменную navigator.webdriver? - person Matrix; 12.08.2019

Вот как это сделать с помощью Capybara и Chromedriver:

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome,
    args: ['--user-agent="Chrome under Selenium for Capybara"'] )
end
person Rhett Sutphin    schedule 07.07.2013

Вы можете попробовать этот ответ, чтобы отключить переменную navigator.webdriver, но обратите внимание, что она больше не из ChromeDriver 79.0.3945.16 и выше.

person Quinn Wynn    schedule 15.12.2019