2014-09-08 11 views
9

in Java selen WebDriver Paket, gibt es eine FluentWait Klasse:Java FluentWait in Python

Jedes FluentWait Beispiel die maximale Menge an Zeit definiert für eine Bedingung zu warten, sowie die Häufigkeit, mit der zu Überprüfen Sie den Zustand. Darüber hinaus kann der Benutzer das Warten auf das Ignorieren bestimmter Ausnahmen während des Wartens konfigurieren, z. B. NoSuchElementExceptions beim Suchen nach einem Element auf der Seite.

Mit anderen Worten, es ist etwas mehr als implicit and explicit wait, gibt Ihnen mehr Kontrolle für das Warten auf ein Element. Es kann sehr praktisch sein und hat auf jeden Fall Anwendungsfälle.

Gibt es etwas ähnliches in python selenium package, oder sollte ich es selbst umsetzen?

(ich habe durch Dokumentation gesucht Waits - nichts da).

Antwort

17

Ich glaube, Sie dies mit Python tun, aber es ist nicht so einfach als FluentWait Klasse verpackt ist. Einiges davon wurde in der von Ihnen bereitgestellten Dokumentation nicht ausführlich behandelt.

Die WebDriverWait Klasse verfügt über optionale Argumente für Timeout, poll_frequency und ignored_exceptions. Du könntest es dort also liefern. Dann verbinden Sie es mit einem erwarteten Zustand für Elemente zu warten scheinen, sein klickbare, etc ... Hier ist ein Beispiel:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import * 

driver = webdriver.Firefox() 
# Load some webpage 
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException]) 
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div"))) 

Natürlich können Sie die Wartezeit/Element in einer Anweisung kombinieren, aber ich dachte diese Weise können Sie kann sehen, wo dies implementiert ist.

5

iChar's Antwort behandelt, wie man WebDriverWait in Python verwendet, um das zu tun, was FluentWait in Java tut. Einige Aspekte der Frage wurden unadressierte links aber:

Mit anderen Worten: [FluentWait] etwas mehr als implizite und explizite

Nr warten Ab Version 2.42.x von Selen, gibt es nur zwei Arten von Warten, die Selenium implementiert: implizit und explizit. FluentWait ist nicht etwas, das zu diesen beiden Arten von Wartezeiten gehört. Es ist nur ein explizites Warten.

Gibt es etwas Ähnliches in Python Selen-Paket, oder sollte ich es selbst implementieren?

Das einzige, was ich daran denken kann, ist aus Python WebDriverWait Umsetzung fehlt, dass FluentWait (und WebDriverWait durch Erweiterung) haben, ist dies:

[FluentWait (und durch Erweiterung, WebDriverWait) ] kann sein Timeout und Abfrageintervall im laufenden Betrieb konfiguriert werden.

[Zitiert von this.]

Die Klasse WebDriverWait in Python ist so konzipiert, dass ihre Konfigurationswerte beim Erstellen ein für alle Mal festgelegt werden. FluentWait ermöglicht die Änderung der Konfiguration nach der Erstellung. So könnte ein einzelnesFluentWait Objekt (oder irgendein WebDriverWait in Java) wiederverwendet werden, um auf unterschiedliche Bedingungen mit unterschiedlichen Abruffrequenzen zu warten. In Python müssten Sie ein neues Objekt WebDriverWait erstellen, um eine andere Abruffrequenz zu verwenden.

So gibt es etwas die Python-Implementierung bietet nicht, aber ich würde nicht als signifikant genug, um eine Implementierung zu gewährleisten.

+0

Dies macht die Dinge viel klarer, danke. Ich denke, ich würde hier ein anderes Bounty brauchen :) – alecxe

+0

Sie könnten nur die Klassenattribute anpassen, wenn Sie die Zeitüberschreitung, Abfragen oder ignorierte Ausnahmen für einen Webdriver ändern müssen warten, wenn Sie die gleiche wiederverwenden möchten. Betrachtet man die Quelle für "WebDriverWait", gibt es nichts, das anzeigt, dass nach dem Initialisieren diese Werte nicht geändert werden können, d. H. "WebDriverWait._timeout". Ich vermute jedoch, dass ich nicht wirklich "on-the-fly" bin. –

+0

@iChar Obwohl Python Sie nicht daran hindert, diesen Variablen neue Werte zuzuweisen, werden sie mit einem Unterstrich versehen, der sie als "privat" markiert und Ihnen sagt, dass diese Variablen Sie nicht ändern können. Wenn ich vorschlagen würde, dass man sie ändern sollte, dann würde ich sehr schlechte Ratschläge geben **. – Louis