WebDriver 超时

WebDriver 会话相关联的是各种超时定义,它们控制着 脚本注入文档导航元素检索 的行为。

您会发现 timeouts 对象 在几种不同的上下文中被使用。它可以用作 创建新会话时的配置(通过 capabilities),它会在会话创建后作为匹配的、有效的 capabilities 的一部分返回,并且它用作 Set TimeoutsGet Timeouts 命令的输入和输出。

默认值可以在 创建会话时被覆盖,并且它们将一直有效直到会话关闭。如果您在会话的生命周期中调用 Set Timeouts,则会覆盖默认值,并将在会话生命周期内生效,或者直到再次调用 Set Timeouts

负载

timeouts 对象 是一个 JSON 对象,它要么描述当前会话的超时值,要么用作配置超时时的输入。

implicit

查找元素时,重试 元素定位策略的时间(以毫秒为单位)。默认值为 0,表示只运行一次策略。

pageLoad

等待文档加载完成的时间(以毫秒为单位)。默认情况下,WebDriver 将等待五分钟(或 300,000 毫秒)。

script

使用 Execute ScriptExecute Async Script 注入的脚本将一直运行,直到达到脚本超时时长(也以毫秒为单位)。然后将中断脚本并返回 脚本超时错误。默认值为 30 秒(或 30,000 毫秒)。

当该对象用作 Set Timeouts 命令的输入,或者在 创建新会话时用作 timeouts capability 的一部分时,所有字段都是可选的。这意味着您可以单独配置零个或多个超时时长值,或者一次性配置所有值。

当它由驱动程序返回时,无论是通过 Get Timeouts 还是在 创建会话后的匹配 capabilities 中,所有字段都将存在。

示例

在会话创建时设置超时

您可以通过在启动新的 WebDriver 会话时提供一个 timeouts capabilities 对象来覆盖默认会话超时。

python
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 命令进行设置。这些设置将覆盖会话当前的超时设置,并将在整个会话生命周期内生效,或者直到对同一命令进行后续调用为止。

python
from selenium import webdriver

session = webdriver.Firefox()

session.set_timeouts({"implicit": 4.5})
print(session.get_timeouts)

输出将以秒为单位,因为这是 Python 中的惯用时间单位。

json
{ "implicit": 4.5, "script": 300, "pageLoad": 30000 }