Есть ли способ обнаружить, что я нахожусь на странице Selenium Webdriver из Javascript
Я хотел бы подавить инициализацию TinyMCE внутри моих тестов и могу сделать это легко, если Javascript может обнаружить, что я работаю на странице, автоматизированной Selenium.
Итак, есть ли какой-нибудь JS-код, который я могу использовать для обнаружения драйвера Selenium? В качестве альтернативы, как я могу расширить строку userAgent, чтобы включить шаблон, который я могу обнаружить из JS?
Если это действительно имеет значение, я запускаю это через огурец и капибару в Mac OS X.
5 ответов
Насколько я знаю, нет никакого кросс-браузерного метода, который Selenium предоставляет для определения того, что он управляет браузером. В FF вебдрайвер устанавливает 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. Проверка на наличие ошибки во время выполнения обходится слишком дорого, и я не могу быть уверен, что изменение шрифтов или настроек дисплея не приведет к ложным негативам.)
Поскольку в вопросе упоминается Капибара, вот эквивалентный код на Ruby:
profile = Selenium::WebDriver::Firefox::Profile.new
profile['general.useragent.override'] = "my ua string"
driver = Selenium::WebDriver.for :firefox, :profile => profile
Поскольку webbriver автоматизирует обычные браузеры (как iMacros), ваш сайт не может обнаружить его напрямую.
Вы можете легко добавить строку в useragent:
Это легко с драйвером Firefox:
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);
Да, вы можете сделать это, если кто-то использует драйвер Firefox для автоматизации селена, для обнаружения драйвера селена вы должны поместить следующий код на стороне клиента:-
$(document).ready(function() {
try{
if(window.document.documentElement.getAttribute("webdriver"))
alert("Caught in 1st case :- Selenium Webdriver is banned!!!");
}
catch(Exception){}
try{
if(navigator.webdriver)
alert("Caught in 2nd case :- Selenium Webdriver is banned!!!");
}
catch(Exception){}
});
Для браузера Chrome и IE, специфичного для селена, он не работает.
Вот как это сделать с Capybara и Chromedriver:
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome,
args: ['--user-agent="Chrome under Selenium for Capybara"'] )
end
Вы можете попробовать этот ответ, чтобы отключитьnavigator.webdriver
переменная, но обратите внимание, что это больше не из ChromeDriver 79.0.3945.16 и выше.