it-swarm.com.de

Wie lege ich den Timeout für den Selenium Webdriver fest?

Wenn ich einen Proxy in einem Web-Treiber wie FirefoxDriver verwende, wird die Get-Methode für immer blockiert, wenn der Proxy schlecht ist. Ich habe einige Timeout-Parameter eingestellt, aber das hat nicht geklappt.

Das ist mein Code:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);    
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);

// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")

Der Aufruf von driver.get wird für immer blockiert, aber ich möchte, dass er 30 Sekunden wartet. Wenn die Seite nicht geladen ist, wird eine Ausnahme ausgelöst.

29
福气鱼

Versuche dies:

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
24
Fujiao Liu

Die timeouts()-Methoden sind in einigen Treibern nicht implementiert und im Allgemeinen sehr unzuverlässig.
Ich benutze einen separaten Thread für die Zeitüberschreitungen (die URL für den Zugriff als Threadnamen übergeben):

    Thread t = new Thread(new Runnable()
    {
      public void run()
      {
        driver.get(Thread.currentThread().getName());
      }
    }, url);
    t.start();
    try
    {
      t.join(YOUR_TIMEOUT_HERE_IN_MS);
    }
    catch (InterruptedException e)
    { // ignore
    }
    if (t.isAlive())
    { // Thread still alive, we need to abort
      logger.warning("Timeout on loading page " + url);
      t.interrupt();
    }

Dies scheint die meiste Zeit zu funktionieren, es kann jedoch vorkommen, dass der Treiber wirklich hängen bleibt und alle nachfolgenden Aufrufe des Treibers blockiert werden (ich habe das mit dem Chrome-Treiber unter Windows erlebt). Selbst etwas so harmloses wie ein driver.findElements () - Aufruf kann blockiert werden. Leider habe ich keine Lösungen für blockierte Treiber.

23
user1102631

versuchen

driver.executeScript("window.location.href='http://www.sina.com.cn'")

diese Erklärung wird sofort zurückgegeben.

Anschließend können Sie ein WebDriverWait mit Zeitüberschreitung hinzufügen, um zu überprüfen, ob der Seitentitel oder ein Element in Ordnung ist.

Hoffe das wird dir helfen.

8
JasonYou

Ich hatte das gleiche Problem und dank dieses Forums und einigen anderen fand ich die Antwort . Anfangs dachte ich auch an einen separaten Thread, aber der Code wird dadurch etwas komplizierter. Also habe ich versucht, eine Antwort zu finden, die meinem Prinzip "Eleganz und Schlichtheit" entspricht.

Bitte schauen Sie sich dieses Forum an: https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading

LÖSUNG: Im Code können Sie vor der Zeile mit der 'get'-Methode beispielsweise Folgendes verwenden:

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

Eine Sache ist, dass es timeoutException auslöst, also müssen Sie es in den try-Catch-Block einkapseln oder in eine Methode umbrechen.

Ich habe den Getter für das pageLoadTimeout nicht gefunden, daher weiß ich nicht, was der Standardwert ist, aber wahrscheinlich sehr hoch, da mein Skript viele Stunden eingefroren war und nichts weiter vorankam.

HINWEIS: 'PageLoadTimeout' ist NICHT für den Chrome-Treiber implementiert und verursacht daher eine Ausnahme. Ich habe von Benutzern Kommentare gesehen, dass es Pläne gibt, es zu machen.

5
Lukasz

Hinzufügen 

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

Werde nichts tun Die Seite wird sehr lange blockieren.

2
zhongting

Sie können das Timeout auf dem HTTP-Client so einstellen

int connectionTimeout=5000;
int socketTimeout=15000;
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout));
HttpCommandExecutor executor =
      new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory);
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities);
2
flob

Die Lösung von driver.manage (). Timeouts (). PageLoadTimeout (10, TimeUnit.SECONDS) funktioniert auf den Seiten mit synchronem Laden, aber das Problem auf Seiten, die asynchron laden, wird nicht gelöst die Uhrzeit, wenn wir pageLoadTimeOut setzen.

1
sou

Ich finde, dass die Timeout-Aufrufe in der Realität, insbesondere für den Internet Explorer, nicht zuverlässig genug sind. Folgende Lösungen können jedoch hilfreich sein:

  1. Sie können für den vollständigen Test ein Timeout durchführen, indem Sie @Test (Timeout = 10000) im Junit-Test verwenden, von dem aus Sie den Selenium-Prozess ausführen. Dadurch wird der Haupt-Thread für die Ausführung der anderen Tests freigegeben, anstatt die gesamte Show zu blockieren. Aber auch das funktioniert manchmal nicht.

  2. Durch Zeitüberschreitung haben Sie jedoch nicht die Absicht, den Testfall zu retten, da eine Zeitüberschreitung sogar für eine einzelne Operation die gesamte Testsequenz in einem inkonsistenten Zustand belassen kann. Möglicherweise möchten Sie einfach mit den anderen Testfällen fortfahren, ohne zu blockieren (oder möglicherweise denselben Test erneut versuchen). In einem solchen Fall wäre eine narrensichere Methode das Schreiben eines Pollers, der Prozesse von Webdriver abfragt (z. B. IEDriverServer.exe, Phantomjs.exe), die länger als 10 Minuten ausgeführt werden, und sie abtöten. Ein Beispiel finden Sie unter Prozesse mit langer Bearbeitungszeit automatisch identifizieren (und abbrechen)

0
premganz

Wird in ähnlicher Situation unter dem Code verwendet

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

und eingebetteter driver.get-Code in einem try catch, wodurch das Problem beim Laden von Seiten gelöst wurde, die länger als 1 Minute dauerten.

0
Manjunath24