如何在 Selenium 3.1.0 中设置 ImplicitWait

How to set ImplicitWait in Selenium 3.1.0

升级后 Selenium WebDriver 3.1.0 我在

收到警告
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));

Warning 11 'OpenQA.Selenium.ITimeouts.SetScriptTimeout(System.TimeSpan)' is obsolete: 'This method will be removed in a future version. Please set the AsynchronousJavaScript property instead.'

所以我改成了

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

它在 ChromeDriver 上运行良好,但是当我尝试 FireFoxDriver 时,这条线的测试失败,抛出异常

Result Message: System.InvalidOperationException : Missing 'type' parameter (IndexOutOfBounds) Result 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.InternalExecute(String driverCommandToExecute, Dictionary'2 parameters) at OpenQA.Selenium.Remote.RemoteTimeouts.ExecuteSetTimeout(String timeoutType, TimeSpan timeToWait) at OpenQA.Selenium.Remote.RemoteTimeouts.set_ImplicitWait(TimeSpan value) at OpenQA.Selenium.Support.Events.EventFiringWebDriver.EventFiringTimeouts.set_ImplicitWait(TimeSpan value)

如何解决这个问题?

github 中挖掘 source code 后,我发现 ImplicitWait setget 方法正在使用(在较低级别)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和returnsDriverServiceCommandExecutor 当它 false 时,没有解决问题,而 FirefoxDriverCommandExecutortrue 时。 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));

我在我的项目中遇到了同样的问题。然而,短期解决方案是回滚到以前版本的 webdriver。

希望对您有所帮助!