如何在Selenium 3.1.0中设置ImplicitWait

Guy*_*Guy 1 c# selenium selenium-firefoxdriver selenium-webdriver

升级后,Selenium WebDriver 3.1.0我收到了警告

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
Run Code Online (Sandbox Code Playgroud)

警告11'OpenQA.Selenium.ITimeouts.SetScriptTimeout(System.TimeSpan)'已废弃:'此方法将在以后的版本中删除.请改为设置AsynchronousJavaScript属性.

所以我改成了

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
Run Code Online (Sandbox Code Playgroud)

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

结果消息:System.InvalidOperationException:缺少'type'参数(IndexOutOfBounds)结果StackTrace:在OpenQA.Selenium的OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(响应errorResponse).Remote.RemoteWebDriver.Execute(String driverCommandToExecute,Dictionary`2参数)OpenQA.Selenium.Remium.Selenium.Remote.Remote给出的OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute(String driverCommandToExecute,Dictionary'2参数).在OpenQA.Selenium.Remote.RemoteTimeouts.ExecuteSetTimeout(String timeoutType,TimeSpan timeToWait).(TimeSpan值) )在OpenQA.Selenium.Support.Events.EventFiringWebDriver.EventFiringTimeouts.set_ImplicitWait(TimeSpan value)

怎么解决这个?

Guy*_*Guy 7

在挖掘完源代码后,github我发现ImplicitWait set并且get方法正在使用(在较低级别)ICommandExecutor来设置和获取值.FireFoxDriver在父级中初始化此变量的唯一构造函数RemoteWebDriver

public FirefoxDriver(FirefoxDriverService service, FirefoxOptions options, TimeSpan commandTimeout) : base(CreateExecutor(service, options, commandTimeout), ConvertOptionsToCapabilities(options))
Run Code Online (Sandbox Code Playgroud)

哪个触发了基础构造函数

public RemoteWebDriver(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities)
Run Code Online (Sandbox Code Playgroud)

(在初始化基础时在构造函数CreateExecutorFirefoxDriver调用)中的方法检查firefoxOptions成员UseLegacyImplementation并在DriverServiceCommandExecutor何时返回false,这不能解决问题,FirefoxDriverCommandExecutor何时返回true.UseLegacyImplementationfalse默认的,所以应该被设置为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));
Run Code Online (Sandbox Code Playgroud)