web-dev-qa-db-fra.com

Comment définir Selenium Python Délai d'expiration par défaut de WebDriver?

Essayer de trouver un bon moyen de définir un délai maximum pour la latence d'exécution des commandes dans Selenium Python WebDriver. Idéalement, quelque chose comme:

my_driver = get_my_driver()
my_driver.set_timeout(30) # seconds
my_driver.get('http://www.example.com') # stops / throws exception when time is over 30     seconds

travaillerait. J'ai trouvé .implicitly_wait(30), mais je ne sais pas si cela se traduit par le comportement souhaité.

Au cas où cela serait utile, nous utilisons spécifiquement WebDriver pour Firefox.

MODIFIER

Selon la réponse de @ amey, cela pourrait être utile:

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")

Cependant, il n'est pas clair pour moi si l'attente implicite s'applique à la fois à get (qui est la fonctionnalité souhaitée) et à find_element_by_id.

Merci beaucoup!

37
Juan Carlos Coto

En python, la méthode pour créer un délai d'attente pour une page à charger est:

driver.set_page_load_timeout(30)

Pour chromedriver:

driver.implicitly_wait(30)

Cela lancera un TimeoutException chaque fois que le chargement de la page prendra plus de 30 secondes.

81
Juan Carlos Coto

Des informations sur les attentes explicites et implicites peuvent être trouvées ici .

[~ # ~] mise à jour [~ # ~]

En Java je vois cela, basé sur this :

WebDriver.Timeouts pageLoadTimeout(long time,
                                 Java.util.concurrent.TimeUnit unit)

Sets the amount of time to wait for a page load to complete before throwing an error. If the timeout is negative, page loads can be indefinite.

Parameters:
    time - The timeout value.
    unit - The unit of time.

Pas sûr de l'équivalent python.

5
Amey

La meilleure façon est de définir les préférences:

fp = webdriver.FirefoxProfile()
fp.set_preference("http.response.timeout", 5)
fp.set_preference("dom.max_script_run_time", 5)
driver = webdriver.Firefox(firefox_profile=fp)

driver.get("http://www.google.com/")
5
Nima Soroush

Ma solution était d'exécuter un thread asynchrone à côté de l'événement de chargement du navigateur, de le faire fermer le navigateur et de rappeler la fonction de chargement en cas de dépassement de délai.

#Thread
def f():
    loadStatus = true
    print "f started"
    time.sleep(90)
    print "f finished"
    if loadStatus is true:
        print "timeout"
        browser.close()
        call()

#Function to load
def call():
    try:
        threading.Thread(target=f).start()
        browser.get("http://website.com")
        browser.delete_all_cookies()
        loadStatus = false
    except:
        print "Connection Error"
        browser.close()
        call()

Call () est une fonction qui

2
Roni davelman