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!
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.
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.
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/")
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