Trying to find a good way to set a maximum time limit for command execution latency in Selenium Python WebDriver. Ideally, something like:
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
would work. I have found .implicitly_wait(30), but I’m not sure if it results in the desired behavior.
In case it is useful, we are specifically using the WebDriver for Firefox.
EDIT
As per @amey’s answer, this might be useful:
ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")
However, it is not clear to me whether the implicit wait applies both to get (which is the desired functionality) and to find_element_by_id.
Thanks very much!
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
In python, the method to create a timeout for a page to load is:
Firefox, Chromedriver and undetected_chromedriver:
driver.set_page_load_timeout(30)
Other:
driver.implicitly_wait(30)
This will throw a TimeoutException whenever the page load takes more than 30 seconds.
Method 2
The best way is to set preference:
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/")
Method 3
Information about Explicit and Implicit waits can be found here.
UPDATE
In java I see this, based of 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.
Not sure of the python equivalent.
Method 4
My solution was to run an asynchronous thread alongside the browser load event, and have it close the browser and re-call the load function if there was a timeout.
#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() is a function which just
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0