🚤 等待
网络环境不稳定,页面 js 运行时间也难以确定,自动化过程中经常遇到需要等待的情况。
如果总是用sleep(),显得不太优雅,等待多了浪费时间,等待不够会导致报错。
因此,程序能够智能等待是非常重要的,DrissionPage 内置了一些等待方法,可以提高程序稳定性和效率。
它们藏在页面对象和元素对象的wait属性里。
等待方法均有timeout参数,可自行设得超时时间,也可以设置超时后返回False还是抛出异常。
✅️️ 页面对象的等待方法
示例:
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('http://DrissionPage.cn')
page.wait.ele_displayed('tag:div')
📌 wait.load_start()
此方法用于等待页面进入加载状态。
我们经常会通过点击元素进入下一个网页,并立刻获取新页面的元素。
但若跳转前的页面拥有和跳转后页面相同定位符的元素,会导致过早获取元素,跳转后失效的问题。
使用此方法,会阻塞程序,等待页面开始加载后再继续,从而避免上述问题。
我们通常只需等待页面加载开始,程序会自动等待加载结束。
get()已内置等待加载开始,后无须跟wait.load_start()。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| timeout | floatNoneTrue | None | 超时时间,为 None或Ture时使用页面timeout设置为数字时等待相应时间 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 等待结束时是否进入加载状态 | 
示例:
ele.click()  # 点击某个元素
page.wait.load_start()  # 等待页面进入加载状态
# 执行在新页面的操作
print(page.title)
📌 wait.doc_loaded()
此方法用于等待页面文档加载完成。
一般来说都无需开发者使用,程序大部分动作都会自动等待加载完成再执行。
- 此功能仅用于等待页面主 document 加载,不能用于等待 js 加载的变化。
- 除非load_mode为None,get()方法已内置等待加载完成,后面无须添加等待。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| timeout | floatNoneTrue | None | 超时时间,为 None或Ture时使用页面timeout设置为数字时等待相应时间 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 等待结束时是否完成加载完成 | 
📌 wait.eles_loaded()
此方法用于等待元素被加载到 DOM,可等待全部或任意一个加载。
有时一个元素的正常出现是下一步操作的前提,用此方法可以防止一些元素加载速度慢于程序动作速度导致的误操作。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| locator | strTuple[str, str]list | 必填 | 要等待的元素,定位符 | 
| timeout | float | None | 超时时间,为 None时使用页面timeout设置 | 
| any_one | bool | False | 是否等待到一个就返回 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 是否等待成功 | 
示例:
ele1.click()  # 点击某个元素
page.wait.eles_loaded('#div1')  # 等待 id 为 div1 的元素加载
ele2.click()  # div1 加载完成后再执行下一步操作
📌 wait.ele_displayed()
此方法用于等待一个元素变成显示状态。
如果当前 DOM 中查找不到指定元素,则会自动等待元素加载,再等待它显示。
元素隐藏是指元素在 DOM 内,但处于隐藏状态(即使在视口内且不被遮挡)。
父元素隐藏时子元素也是隐藏的。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| loc_or_ele | strTuple[str, str]ChromiumElement | 必填 | 要等待的元素,可以是元素或定位符 | 
| timeout | float | None | 超时时间,为 None时使用页面timeout设置 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 是否等待成功 | 
示例:
# 等待 id 为 div1 的元素显示,超时使用页面设置
page.wait.ele_displayed('#div1')
# 等待 id 为 div1 的元素显示,设置超时3秒
page.wait.ele_displayed('#div1', timeout=3)
# 等待已获取到的元素被显示
ele = page.ele('#div1')
page.wait.ele_displayed(ele)
📌 wait.ele_hidden()
此方法用于等待一个元素变成隐藏状态。
如果当前 DOM 中查找不到指定元素,则会自动等待元素加载,再等待它隐藏。
元素隐藏是指元素在 DOM 内,但处于隐藏状态(即使在视口内且不被遮挡)。
父元素隐藏时子元素也是隐藏的。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| loc_or_ele | strTuple[str, str]ChromiumElement | 必填 | 要等待的元素,可以是元素或定位符 | 
| timeout | float | None | 超时时间,为 None时使用页面timeout设置 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 是否等待成功 | 
📌 wait.ele_deleted()
此方法用于等待一个元素被从 DOM 中删除。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| loc_or_ele | strTuple[str, str]ChromiumElement | 必填 | 要等待的元素,可以是元素或定位符 | 
| timeout | float | None | 超时时间,为 None时使用页面timeout设置 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 是否等待成功 | 
📌 wait.download_begin()
此方法用于等待下载开始,详见下载功能章节。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| timeout | float | None | 超时时间,为 None时使用页面timeout设置 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| bool | 是否等待成功 | 
示例:
page('#download_btn').click()  # 点击按钮触发下载
page.wait.download_begin()  # 等待下载开始
📌 wait.upload_paths_inputted()
此方法用于等待自动填写上传文件路径。详见文件上传章节。
参数: 无
返回:None
示例:
# 设置要上传的文件路径
page.set.upload_files('demo.txt')
# 点击触发文件选择框按钮
btn_ele.click()
# 等待路径填入
page.wait.upload_paths_inputted()
📌 wait.new_tab()
此方法用于等待新标签页出现。
| 参数名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
| timeout | float | None | 超时时间,为 None时使用页面timeout设置 | 
| raise_err | bool | None | 等待失败时是否报错,为 None时根据Settings设置 | 
| 返回类型 | 说明 | 
|---|---|
| str | 等待成返回新标签页 id | 
| False | 等待失败返回 False |