2017-02-22 56 views
1

升級Selenium WebDriver 3.1.0後,我收到警告對如何設置硒3.1.0 ImplicitWait

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:缺少'type' 參數(IndexOutOfBounds)結果StackTrace:在 OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Responsive SE 錯誤響應)在 OpenQA.Selenium.Remote.RemoteWebDriver.Execute(字符串 driverCommandToExecute,Dictionary`2參數)在 OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute(字符串 driverCommandToExecute,Dictionary'2參數)在 OpenQA。 Selenium.Remote.RemoteTimeouts.ExecuteSetTimeout(字符串 timeoutType,時間跨度timeToWait)在 OpenQA.Selenium.Remote.RemoteTimeouts.set_ImplicitWait(TimeSpan值) 在 OpenQA.Selenium.Support.Events.EventFiringWebDriver.EventFiringTimeouts.set_ImplicitWait(時間跨度 值)

如何解決這個問題?

回答

4

通過source codegithub挖後,我發現,ImplicitWaitsetget方法是使用(在較低的水平)ICommandExecutor設置和獲取價值。唯一FireFoxDriver構造女巫在父初始化這個變量RemoteWebDriver

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

觸發基構造

public RemoteWebDriver(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities) 

FirefoxDriver(初始化基座時稱爲在構造)的方法CreateExecutor檢查firefoxOptions會員UseLegacyImplementation,並返回DriverServiceCommandExecutor,當它false,這並沒有解決問題,而FirefoxDriverCommandExecutortrueUseLegacyImplementationfalse默認情況下,所以應該設置爲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。 'FirefoxDriver'類的'CreateExecutor'方法明確地分支了這個屬性的值,只有當值爲'false'時才啓動geckodriver。 – JimEvans

+0

@JimEvans我現在注意到了,謝謝。 – Guy

2

我有同樣的問題在我的項目。但短期解決方案是回滾到以前版本的webdriver。

我希望這有助於!