WebDriver 超時
與 WebDriver 會話相關聯的是各種超時定義,它們控制著 指令碼注入、文件導航 和 元素檢索 的行為。
您會發現 timeouts 物件 在幾種不同的上下文中被使用。它可以用作 建立新會話時的配置(透過 capabilities),它會在會話建立後作為匹配的、有效的 capabilities 的一部分返回,並且它用作 Set Timeouts 和 Get Timeouts 命令的輸入和輸出。
預設值可以在 建立會話時被覆蓋,並且它們將一直有效直到會話關閉。如果您在會話的生命週期中呼叫 Set Timeouts,則會覆蓋預設值,並將在會話生命週期內生效,或者直到再次呼叫 Set Timeouts。
負載
timeouts 物件 是一個 JSON 物件,它要麼描述當前會話的超時值,要麼用作配置超時時的輸入。
implicit-
查詢元素時,重試 元素定位策略的時間(以毫秒為單位)。預設值為 0,表示只執行一次策略。
pageLoad-
等待文件載入完成的時間(以毫秒為單位)。預設情況下,WebDriver 將等待五分鐘(或 300,000 毫秒)。
script-
使用 Execute Script 或 Execute Async Script 注入的指令碼將一直執行,直到達到指令碼超時時長(也以毫秒為單位)。然後將中斷指令碼並返回 指令碼超時錯誤。預設值為 30 秒(或 30,000 毫秒)。
當該物件用作 Set Timeouts 命令的輸入,或者在 建立新會話時用作 timeouts capability 的一部分時,所有欄位都是可選的。這意味著您可以單獨配置零個或多個超時時長值,或者一次性配置所有值。
當它由驅動程式返回時,無論是透過 Get Timeouts 還是在 建立會話後的匹配 capabilities 中,所有欄位都將存在。
示例
在會話建立時設定超時
您可以透過在啟動新的 WebDriver 會話時提供一個 timeouts capabilities 物件來覆蓋預設會話超時。
import urllib
from selenium import webdriver
def inline(doc):
return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
session = webdriver.Firefox(capabilities={"timeouts": {"implicit": 4500}})
session.get(inline("""
<h1>Example</h1>
<script>
// Inserts <p> below <h1> after 2.5 seconds:
setTimeout(() => {
const delayedElement = document.createElement("p");
const h1 = document.querySelector("h1");
document.body.insertAfter(delayedElement, h1);
}, 2500);
</script>
""")
# This will cause the driver to wait 4.5 seconds
# for #foo to appear in the DOM:
delayed_element = session.find_element_by_tag_name("p")
在執行時設定和獲取超時
超時也可以在執行時使用 Set Timeouts 命令進行設定。這些設定將覆蓋會話當前的超時設定,並將在整個會話生命週期內生效,或者直到對同一命令進行後續呼叫為止。
from selenium import webdriver
session = webdriver.Firefox()
session.set_timeouts({"implicit": 4.5})
print(session.get_timeouts)
輸出將以秒為單位,因為這是 Python 中的慣用時間單位。
{ "implicit": 4.5, "script": 300, "pageLoad": 30000 }