2017-02-22 4 views
1

После обновления Selenium WebDriver 3.1.0 я получил предупреждение оКак установить ImplicitWait в Selenium 3.1.0

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30)); 

Предупреждение 11 'OpenQA.Selenium.ITimeouts.SetScriptTimeout (System.TimeSpan)' является устаревшим: «Этот метод будут удалены в будущей версии. Вместо этого установите вместо этого свойство AsynchronousJavaScript. '

Так что я изменил его на

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30); 

Он работал хорошо с ChromeDriver, но когда я попытался FireFoxDriver тест не на этой линии, бросая исключение

Результат Сообщение: Система. InvalidOperationException: Отсутствует «тип» параметр (IndexOutOfBounds) Результат StackTrace: at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError (Respon) се errorResponse) при OpenQA.Selenium.Remote.RemoteWebDriver.Execute (String driverCommandToExecute, параметры Dictionary`2) при OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute (String driverCommandToExecute, параметры Dictionary'2) при OpenQA. Selenium.Remote.RemoteTimeouts.ExecuteSetTimeout (String timeoutType, TimeSpan timeToWait) при OpenQA.Selenium.Remote.RemoteTimeouts.set_ImplicitWait (значение TimeSpan) на OpenQA.Selenium.Support.Events.EventFiringWebDriver.EventFiringTimeouts.set_ImplicitWait ( значение TimeSpan)

Как это решить?

ответ

4

После рыть через source code в github я обнаружил, что ImplicitWaitset и get методы используют (в нижнем уровне) ICommandExecutor, чтобы установить и получить значение. Только FireFoxDriver конструктор ведьмы инициализировать эту переменную в родительском RemoteWebDriver является

public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options, TimeSpan commandTimeout) : base(CreateExecutor(service, options, commandTimeout), ConvertOptionsToCapabilities(options)) 

Что вызывает базовый конструктор

public RemoteWebDriver(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities) 

метод CreateExecutor в FirefoxDriver (называемом в конструкторе при инициализации базы) проверяет firefoxOptions член UseLegacyImplementation и возвращает DriverServiceCommandExecutor, когда он false, что не помогло решить проблему, и FirefoxDriverCommandExecutor, когда true. UseLegacyImplementation является false по умолчанию, поэтому он должен быть установлен в true

решение, которое работало для меня было

FirefoxOptions firefoxOptions = new FirefoxOptions 
{ 
    Profile = fxProfile, // I'm using FirefoxProfile as well 
    UseLegacyImplementation = true 
}; 

IWebDriver driver = new FirefoxDriver(FirefoxDriverService.CreateDefaultService(), firefoxOptions, TimeSpan.FromSeconds(30)); 
+1

Я укажу, что это решение не будет работать для Firefox 48 и выше. Установив свойство 'UseLegacyImplementation', вы решили использовать более старую, более не поддерживаемую версию драйвера Firefox. Для автоматизации Firefox 48 или выше требуется использование [geckodriver] (https://github.com/mozilla/geckodriver), который является значением по умолчанию. – JimEvans

+0

Если вы используете 'options.UseLegacyImplementation = true', как вы утверждаете, то мне жаль, но нет, вы не используете geckodriver. Метод 'CreateExecutor' класса' FirefoxDriver' явно ветвится на значение этого свойства, только запускает geckodriver, если значение 'false'. – JimEvans

+0

@JimEvans Я заметил это сейчас, спасибо. – Guy

2

У меня была такая же проблема в моем проекте. Однако краткосрочным решением было бы вернуться к предыдущей версии webdriver.

Надеюсь, это поможет!

Смежные вопросы