Selenium + FirefoxDriver получает доступ к глобальному объекту javascript

Я хочу проверить значение глобального объекта с помощью Selenium. Но пока я не мог сделать это с помощью FirefoxDriver...

Выполнение чего-то вроде driver.ExecuteScript("return 1+2"); возвращает 3, как и ожидалось; запуск driver.ExecuteScript("return myObject"); работает с драйвером Chrome, но дает null в FirefoxDriver.

Следующее работает в Chrome, но вызывает исключение в Firefox:

 //driver is either an instance of FirefoxDriver or ChromeDriver
 driver.Url = "https://www.google.com";
 driver.Navigate();
 //gbar is a global object at google.com
 var result = driver.ExecuteScript("return gbar");
 Assert.NotNull(result);

Исключение:

System.InvalidOperationException : ReferenceError: gbar is not defined (UnexpectedJavaScriptError)
StackTrace: 
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.ExecuteScriptCommand(String script, String commandName, Object[] args)
   at OpenQA.Selenium.Remote.RemoteWebDriver.ExecuteScript(String script, Object[] args)
   at ...

Используя Selenium.Webdriver 2.53.0 и версию Firefox для разработчиков 48.0a2, а также обычный Firefox 46.0.1, работающий на Win10, .Net 4.6.1.


person Akos Lukacs    schedule 26.05.2016    source источник


Ответы (3)


Похоже, что gbar еще не определено, когда вы вызываете ExecuteScript. Я бы попробовал дождаться:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
var result = wait.Until((drv) => drv.ExecuteScript("return window.gbar || null;"));
person Florent B.    schedule 26.05.2016
comment
Спасибо за идею (по крайней мере, теперь я знаю эту функцию Selenium), но не повезло. Когда я изучал селен, браузер проводил минуты на домашней странице Google с подключенным отладчиком. Также пытался получить доступ к объекту через окно, но и с этим не повезло... - person Akos Lukacs; 26.05.2016
comment
Это может быть связано с вашей версией Firefox. Ваш пример отлично работает у меня на Win8.1/Firefox 46. Вы можете хотя бы получить переменную в консоли браузера, запущенного с Selenium? - person Florent B.; 26.05.2016
comment
Что ж, только что проверил обычный Firefox v.46.0.1, результат тот же. Переменная присутствует в консоли открытого FF, но не может быть получена с помощью Selenium. Например, отправка предупреждения («привет») также показывает окно предупреждения в браузере. - person Akos Lukacs; 26.05.2016

У меня такая же проблема с FirefoxDriver при попытке запустить код JQuery.

Ошибка:

ReferenceError: $ не определено (UnexpectedJavaScriptError) firefox selenium

Работайте нормально на ChromeDriver с тем же кодом

person Tran Duy HUng    schedule 07.12.2016

У меня была такая же проблема при попытке внедрить пользовательские функции на работающую веб-страницу для тестирования. Функции были видны в драйвере Chrome, но не в Firefox.

Решение заключалось в том, чтобы внедрить эти функции в область окна. Затем вы можете ссылаться на них без префикса «окно». Будет работать следующее:

driver.executeScript("window.mystuff = 'somestuff'")
driver.executeScript("return mystuff")
person anydoby    schedule 21.05.2019