尝试找到一种好方法来设置 Selenium Python WebDriver 中命令执行延迟的最大时间限制。 理想情况下,类似:
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
会起作用的。 我已经找到了
.implicitly_wait(30)
,但我不确定它是否会产生所需的行为。
如果它有用,我们专门使用 Firefox 的 WebDriver。
编辑
根据@amey的回答,这可能有用:
ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")
但是,我不清楚隐式等待是否同时适用于
get
(这是所需的功能)和 find_element_by_id
。
非常感谢!
在Python中,为页面加载创建超时的方法是:
Firefox、Chromedriver 和 unDetected_chromedriver:
driver.set_page_load_timeout(30)
其他:
driver.implicitly_wait(30)
每当页面加载时间超过 30 秒时,就会抛出
TimeoutException
。
最好的方法是设置偏好:
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/")
有关显式和隐式等待的信息可以在此处找到。
更新
在java中我看到了这个,基于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.
不确定 python 的等效项。
我的解决方案是在浏览器加载事件旁边运行一个异步线程,并让它关闭浏览器并在超时时重新调用加载函数。
#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() 是一个函数,它只是
要使用Python在Selenium中设置默认超时,可以使用隐式等待方法。隐式等待告诉 Selenium 在尝试查找不能立即可用的元素时等待指定的时间。
from selenium import webdriver
# Initialize the driver
driver = webdriver.Chrome()
# Set the default timeout
driver.implicitly_wait(10) # Wait for up to 10 seconds
# Open a webpage
driver.get("https://example.com")
# Find an element (Selenium will wait up to 10 seconds if the element is not immediately found)
element = driver.find_element_by_id("example-id")
# Close the driver
driver.quit()