跳到主要内容

💖 贴心设计


这里介绍一些本库内置了人性化设计。

✅️️ 无处不在的等待

网络环境不稳定,很多时候程序需要稍微等待一下才能继续运行。等待太少,会导致程序出错,等待太多,又会浪费时间。为了解决这些问题,本库在大量需要等待的部分内置了超时功能,并且可以随时灵活设置,大幅降低程序复杂性。

  • 查找元素内置等待。可以为每次查找元素单独设定等待时间。有些页面会不定期出现提示信息,如果一律等待会太浪费时间,可以独立设置一个很短的超时时间,避免浪费。

  • 等待下拉列表选项。很多下拉列表使用 js 加载,本库选择下拉列表时,会自动等待列表项出现。

  • 等待弹窗。有时预期的 alert 未必立刻出现,本库处理弹窗消息时也可以设置等待。

  • 等待元素状态改变。使用wait.ele()方法可等待元素出现、消失、删除等状态。

  • 等待页面进入加载状态或加载完成。不仅节省时间,还大幅提高程序稳定性。

  • 点击功能也内置等待,如遇元素被遮挡可不断重试点击。

  • 设置页面加载时限及加载策略。有时不需要完整加载页面资源,可根据实际需要设置加载策略。


✅️️ 自动重试连接

在访问网站时,由于网络不稳定可能导致连接异常。本库设置了连接自动重试功能,当网页连接异常,会默认重试 3 次。当然也可以手动设置次数和间隔。

page.get('****', retry=5, interval=3)  # 出错是重试 5 次,每次间隔 3 秒

✅️️ 极简的定位语法

本库制定了一套简洁高效的查找元素语法,支持链式操作,支持相对定位。与 selenium 繁琐的语法相比简直不要太方便。

而且每次查找内置等待,可以独立设置每次查找超时时间。

同是设置了超时等待的查找,对比一下:

# 使用 selenium:
element = WebDriverWait(driver, 10).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]')))

# 使用 DrissionPage:
element = page('some text', timeout=10)

✅️️ 无需切入切出,逻辑清晰

使用过 selenium 的人都知道,selenium 同一时间只能操作一个标签页或<iframe>元素,要操作其它标签页,或<iframe>元素,需要用switch_to() 方法切换,操作后还要切换回来。如果是多级<iframe>,还要逐级切入,相当麻烦。

DrissionPage 则无需这些麻烦的操作,它把每个标签页和<iframe>都看作独立的对象,可以同时并发操作,而且可以直接跨多层<iframe>获取里面的元素,然后直接处理,非常方便。

对比一下,获取 2 层<iframe>内一个 id 为'div1'的元素:

# 使用 selenium
driver.switch_to.frame(0)
driver.switch_to.frame(0)
ele = driver.find_element(By.ID, 'div1')
driver.switch_to.default_content()

# 使用 DrissionPage
ele = page('#div1')

多标签页同时操作,selenium 无此功能:

tab1 = page.get_tab(1)
tab2 = page.get_tab(2)

tab1.get('https://www.baidu.com')
tab2.get('https://www.163.com')

✅️️ 高度集成的便利功能

很多操作方法集成了常用功能,如click()中内置by_js参数,可以直接改用 js 方式点击,而无需写独立的 js 语句。


✅️️ 强大的下载功能

DrissionPage 内置一个下载工具,可实现大文件分块多线程下载文件。并且可以直接读取缓存数据保存图片,而无需控制页面作另存操作。

img = page('tag:img')
img.save('img.png') # 直接保存图片到文件夹

✅️️ 更多便捷的功能

  • 可对整个网页截图,包括视口外的部分

  • 每次运行程序可以反复使用已经打开的浏览器,无需每次从头运行

  • s 模式访问网页时会自动纠正编码,无需手动设置

  • s 模式在连接时会自动根据当前域名自动填写HostReferer属性

  • 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等

  • MixPage可自动下载合适版本的 chromedriver,免去麻烦的配置

  • 支持直接获取afterbefore伪元素的内容

  • 上传文件可直接拦截文件选择框并输入路径,无需依靠 GUI 或查找<input>元素输入