2017-02-22 4 views
1

Nach dem Upgrade Selenium WebDriver 3.1.0 gesetzt ich aufWie ImplicitWait in Selenium 3.1.0

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

Warnung 11 'OpenQA.Selenium.ITimeouts.SetScriptTimeout (System.TimeSpan)' empfangen Warnung ist veraltet: ‚Diese Methode wird in einer zukünftigen Version entfernt. Bitte legen Sie stattdessen die AsynchronousJavaScript-Eigenschaft fest.

So habe ich es zu

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

Es mit ChromeDriver fein gearbeitet, aber wenn ich auf dieser Linie FireFoxDriver der Test fehlgeschlagen versucht,

Ergebnis Meldung eine Ausnahme werfen: System. InvalidOperationException: Fehlender "Typ" Parameter (IndexOutOfBounds) Ergebnis StackTrace: at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError (Antwort se Error) bei OpenQA.Selenium.Remote.RemoteWebDriver.Execute (String driverCommandToExecute, Dictionary`2 Parameter) bei OpenQA.Selenium.Remote.RemoteWebDriver.InternalExecute (String driverCommandToExecute, Dictionary'2 Parameter) bei OpenQA. Selenium.Remote.RemoteTimeouts.ExecuteSetTimeout (String timeoutType, timeToWait Span) bei OpenQA.Selenium.Remote.RemoteTimeouts.set_ImplicitWait (Timespan-Wert) bei OpenQA.Selenium.Support.Events.EventFiringWebDriver.EventFiringTimeouts.set_ImplicitWait (Timespan Wert)

Wie löst man das?

Antwort

4

Nachdem in github durch die source code Graben fand ich, dass ImplicitWaitsetget und Methoden verwenden (in der unteren Ebene) ICommandExecutor den Wert einzustellen und zu erhalten. Der einzige FireFoxDriver Konstruktor Hexe diese Variable in der Mutter initialisieren RemoteWebDriver ist

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

, die den Basiskonstruktor löst

public RemoteWebDriver(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities) 

Verfahren CreateExecutor in FirefoxDriver (im Konstruktor aufgerufen, wenn die Basis der Initialisierung) prüft die firefoxOptions Mitglied UseLegacyImplementation und gibt DriverServiceCommandExecutor zurück, wenn es false ist, die das Problem nicht gelöst hat, und FirefoxDriverCommandExecutor wenn true. UseLegacyImplementation ist false standardmäßig, so dass es sollte die Lösung auf true

gesetzt werden, die für mich gearbeitet wurde

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

Ich werde darauf hinweisen, dass diese Lösung nicht für Firefox 48 und höher funktioniert. Mit der Eigenschaft 'UseLegacyImplementation' haben Sie sich für die ältere, nicht mehr gepflegte Firefox-Treiberimplementierung entschieden. Die Automatisierung von Firefox 48 oder höher erfordert die Verwendung von [geckodriver] (https://github.com/mozilla/geckodriver), was der Standard ist. – JimEvans

+0

Wenn Sie 'options.UseLegacyImplementation = true' verwenden, wie Sie behaupten, dann tut es mir leid, aber, nein, Sie verwenden nicht geckodriver. Die 'CreateExecutor'-Methode der' FirefoxDriver'-Klasse verzweigt explizit auf den Wert dieser Eigenschaft und startet nur geckodriver, wenn der Wert 'false' ist. – JimEvans

+0

@JimEvans Ich habe es jetzt bemerkt, danke. – Guy

2

ich das gleiche Problem in meinem Projekt hatte. Eine kurzfristige Lösung wäre jedoch ein Rollback auf die vorherige Version von Webdriver.

Ich hoffe, das hilft!

Verwandte Themen