https://drissionpage.cn/get_start/before_start



〇、安装

行环境

操作系统:Windows、Linux 和 Mac。

python 版本:3.6 及以上

支持浏览器:Chromium 内核(如 Chrome 和 Edge)

安装

请使用 pip 安装 DrissionPage:

pip install DrissionPage

升级

升级最新稳定版

pip install DrissionPage --upgrade

指定版本升级

pip install DrissionPage==4.0.0b17



一、导入

DrissionPage 提供的功能放在以下几个路径:

  • from DrissionPage import ****:浏览器类、配置类、页面类
  • from DrissionPage.errors import ****:异常
  • from DrissionPage.common import ****:辅助工具
  • from DrissionPage.items import ****:衍生对象,用于类型判断

浏览器类

Chromium

浏览器类用于连接浏览器、管理标签页及其它和浏览器总体有关的操作。

浏览器类相当于总管,它可以作为浏览器入口,使用它产生 Tab 对象去操控每个标签页。

from DrissionPage import Chromium

页面类

ChromiumPage

ChromiumPage是将浏览器对象和第一个标签页对象封装在一起,用于控制浏览器。

ChromiumPage只是简化了操作,使用效果和直接使用Chromium对象基本一致。

唯一区别是,ChromiumPage生成的标签页对象是ChromiumTab,不能切换模式。

from DrissionPage import ChromiumPage

WebPage

WebPageChromiumPage相似,不过其自身及其产生的 Tab 对象可切换模式,既可控制浏览器,也可收发数据包。

from DrissionPage import WebPage

SessionPage

SessionPage用于收发数据包,是对 requests 和 lxml 进行封装实现的。

它把网络连接和结果解析封装成页面。操作逻辑和其它页面一致。

from DrissionPage import SessionPage

配置工具

ChromiumOptions

ChromiumOptions类用于设置浏览器启动参数。

这些参数只有在启动浏览器时有用,接管已存在的浏览器时是不生效的。

from DrissionPage import ChromiumOptions

SessionOptions

SessionOptions类用于设置Session对象启动参数。

用于配置SessionPageWebPage的 s 模式的连接参数。

from DrissionPage import SessionOptions

Settings

Settings用于设置全局运行配置,如找不到元素时是否抛出异常等。

from DrissionPage.common import Settings

辅助工具

Keys

键盘按键类,用于键入 ctrl、alt 等按键。

from DrissionPage.common import Keys

By

与 selenium 一致的By类,便于项目迁移。

from DrissionPage.common import By

其它工具

这些工具都在DrissionPage.common路径中。

  • wait_until:可等待传入的方法结果为真
  • make_session_ele:从 html 文本生成ChromiumElement对象
  • configs_to_here:把配置文件复制到当前路径
  • get_blob:获取指定的 blob 资源
  • tree:用于打印页面对象或元素对象结构
  • from_selenium:用于对接 selenium 代码
  • from_playwright:用于对接 playwright 代码
from DrissionPage.common import wait_until
from DrissionPage.common import make_session_ele
from DrissionPage.common import configs_to_here

异常

异常放在DrissionPage.errors路径。

全部异常详见进阶使用章节。

from DrissionPage.errors import ElementNotFoundError

衍生对象类型

Tab、Element 等被其它对象生成的对象,开发过程中需要类型判断时需要导入这些类型。

可在DrissionPage.items路径导入。

from DrissionPage.items import SessionElement
from DrissionPage.items import ChromiumElement
from DrissionPage.items import ShadowRoot
from DrissionPage.items import NoneElement
from DrissionPage.items import ChromiumTab
from DrissionPage.items import MixTab
from DrissionPage.items import ChromiumFrame



二、准备工作

尝试启动浏览器

默认状态下,程序会自动在系统内查找 Chrome 路径。

执行以下代码,浏览器启动并且访问了项目官网,说明可直接使用,跳过后面的步骤即可。

from DrissionPage import Chromium

tab = Chromium().latest_tab
tab.get('https://DrissionPage.cn')

设置路径

如果上面的步骤提示出错,说明程序没在系统里找到 Chrome 浏览器。

可用以下其中一种方法设置,设置会持久化记录到默认配置文件,之后程序会使用该设置启动。

python的自动化测试工具drissionpage基本操作_git

如图所示,红框中就是要获取的路径。

此法不限于 Windows,有界面的 Linux 也可使用。

方法一

新建一个临时 py 文件,并输入以下代码,填入您电脑里的 Chrome 浏览器可执行文件路径,然后运行。

from DrissionPage import ChromiumOptions

path = r'D:\Chrome\Chrome.exe'  # 请改为你电脑内Chrome可执行文件路径
ChromiumOptions().set_browser_path(path).save()

这段代码会把浏览器路径记录到配置文件,今后启动浏览器皆使用该路径。

如果是想临时切换浏览器路径以尝试运行和操作是否正常,可以去掉.save(),以如下方式结合前面的代码。

from DrissionPage import Chromium, ChromiumOptions

path = r'D:\Chrome\Chrome.exe'  # 请改为你电脑内Chrome可执行文件路径
co = ChromiumOptions().set_browser_path(path)
tab = Chromium(co).latest_tab
tab.get('https://DrissionPage.cn')

方法二

在命令行输入以下命令(路径改成自己电脑里的):

dp -p "D:\Chrome\chrome.exe"

重试控制浏览器

现在,请重新执行第1️⃣步的代码,如果正确访问了项目官网,说明已经设置完成。

from DrissionPage import Chromium

tab = Chromium().latest_tab
tab.get('https://DrissionPage.cn')



三、上手实例

3.1操控浏览器

现在,我们通过一些例子,来直观感受一下 DrissionPage 的工作方式。

本示例演示使用ChromiumPage控制浏览器登录 gitee 网站。

页面分析

网址:https://gitee.com/login

打开网址,按F12,我们可以看到页面 html 如下:

python的自动化测试工具drissionpage基本操作_git_02

用户名输入框id'user_login',密码输入框id'user_password',登录按钮value'登 录'

我们可以用这三个属性定位这三个元素,然后对其输入数据和点击。

示例代码

您可以把以下代码复制到编辑器,把账号和密码改为您自己的,可直接执行看到运行结果。

from DrissionPage import Chromium

# 启动或接管浏览器,并创建标签页对象
tab = Chromium().latest_tab
# 跳转到登录页面
tab.get('https://gitee.com/login')

# 定位到账号文本框,获取文本框元素
ele = tab.ele('#user_login')
# 输入对文本框输入账号
ele.input('您的账号')
# 定位到密码文本框并输入密码
tab.ele('#user_password').input('您的密码')
# 点击登录按钮
tab.ele('@value=登 录').click()

示例详解

我们逐行解读代码:

from DrissionPage import Chromium

↑ 首先,我们导入用于控制浏览器的类Chromium

tab = Chromium().latest_tab

↑ 接下来,我们创建一个Chromium对象,用于连接浏览器,并用latest_tab获取一个标签页对象。

tab.get('https://gitee.com/login')

↑ get()方法用于访问参数中的网址。它会等待页面完全加载,再继续执行后面的代码。 您也可以修改等待策略,如等待 DOM 加载而不等待资源下载,就停止加载,这将在后面的章节说明。

ele = tab.ele('#user_login')

↑ ele()方法用于查找元素,它返回一个ChromiumElement对象,用于操作元素。

'#user_login'是定位符文本,#意思是按id属性查找元素。

值得一提的是,ele()内置了等待,如果元素未加载,它会执行等待,直到元素出现或到达时限。默认超时时间 10 秒。

ele.input('您的账号')

↑ input()方法用于对元素输入文本。

tab.ele('#user_password').input('您的密码')

↑ 我们也可以进行链式操作,获取元素后直接输入文本。

tab.ele('@value=登 录').click()

↑ 输入账号密码后,以相同的方法获取按钮元素,并对其执行点击操作。

不同的是,这次通过其value属性作为查找条件。@表示按属性名查找。

到这里,我们已完成了自动登录 gitee 网站的操作。


3.2收发数据包

本示例演示用SessionPage已收发数据包的方式采集 gitee 网站数据。

本示例不使用浏览器。

页面分析

网址:https://gitee.com/explore/all

这个示例的目标,要获取所有库的名称和链接,为避免对网站造成压力,我们只采集 3 页。

打开网址,按F12,我们可以看到页面 html 如下:

python的自动化测试工具drissionpage基本操作_标签页_03

从 html 代码中可以看到,所有开源项目的标题都是class属性为'title project-namespace-path'<a>元素。我们可以遍历这些<a>元素,获取它们的信息。

同时,我们观察到,列表页网址是以页数为参数访问的,如第一页 url 为https://gitee.com/explore/all?page=1,页数就是page参数。因此我们可以通过修改这个参数访问不同的页面。

示例代码

以下代码可直接运行并查看结果:

from DrissionPage import SessionPage

# 创建页面对象
page = SessionPage()

# 爬取3页
for i in range(1, 4):
    # 访问某一页的网页
    page.get(f'https://gitee.com/explore/all?page={i}')
    # 获取所有开源库<a>元素列表
    links = page.eles('.title project-namespace-path')
    # 遍历所有<a>元素
    for link in links:
        # 打印链接信息
        print(link.text, link.link)

输出:

小熊派开源社区/BearPi-HM_Nano https://gitee.com/bearpi/bearpi-hm_nano
明月心/PaddleSegSharp https://gitee.com/raoyutian/PaddleSegSharp
RockChin/QChatGPT https://gitee.com/RockChin/QChatGPT
TopIAM/eiam https://gitee.com/topiam/eiam

以下省略。。。

示例详解

我们逐行解读代码:

from DrissionPage import SessionPage

↑ 首先,我们导入用于收发数据包的页面类SessionPage

page = SessionPage()

↑ 接下来,我们创建一个SessionPage对象。

for i in ranage(1, 4):
    page.get(f'https://gitee.com/explore/all?page={i}')

↑ 然后我们循环 3 次,以构造每页的 url,每次都用get()方法访问该页网址。

links = page.eles('.title project-namespace-path')

↑ 访问网址后,我们用页面对象的eles()获取页面中所有class属性为'title project-namespace-path'的元素对象。

eles()方法用于查找多个符合条件的元素,返回由它们组成的list

这里查找的条件是class属性,.表示按class属性查找元素。

for link in links:
        print(link.text, link.link)

↑ 最后,我们遍历获取到的元素列表,获取每个元素的属性并打印出来。

.text获取元素的文本,.link获取元素的hrefsrc属性。


3.3模式切换

这个示例演示标签页对象如何切换控制浏览器和收发数据包两种模式。

通常,切换模式是用来应付登录检查很严格的网站,可以用浏览器处理登录,再转换模式用收发数据包的形式来采集数据。 但是这种场景需要有对应的账号,不便于演示。演示使用浏览器在 gitee 搜索,然后转换到收发数据包的模式来读取数据。 虽然此示例现实使用意义不大,但可以了解其工作模式。

页面分析

网址:https://gitee.com/explore

打开网址,按F12,我们可以看到页面 html 如下:

python的自动化测试工具drissionpage基本操作_Chrome_04

输入框<input>元素id属性为'q',搜索按钮<button>元素文本包含'搜索'文本,可用来作条件查找元素。

输入关键词搜索后,再查看页面 html:

python的自动化测试工具drissionpage基本操作_git_05

通过分析 html 代码,我们可以看出,每个结果的标题都存在id'hits-list'里面,class'item'的元素中。因此,我们可以获取页面中所有这些元素,再遍历获取其信息。

示例代码

您可以直接运行以下代码:

from DrissionPage import Chromium

# 连接浏览器并获取一个MixTab对象
tab = Chromium().latest_tab
# 访问网址
tab.get('https://gitee.com/explore/all')
# 切换到收发数据包模式
tab.change_mode()
# 获取所有行元素
items = tab.ele('.ui relaxed divided items explore-repo__list').eles('.item')
# 遍历获取到的元素
for item in items:
    # 打印元素文本
    print(item('t:h3').text)
    print(item('.project-desc mb-1').text)
    print()

输出:

dromara/Sa-Token
一个轻量级 Java 权限认证框...

lengleng/pig
基于Spring Boot 3.3...

...

示例详解

我们逐行解读代码:

from DrissionPage import Chromium

↑ 首先,我们导入用于控制浏览器的类Chromium

tab = Chromium().latest_tab

↑ 接下来,们创建一个Chromium对象,用于连接浏览器,并用latest_tab获取一个可切换模式的标签页对象。

tab.get('https://gitee.com/explore')

↑ 然后控制浏览器访问 gitee。

tab.change_mode()

↑ change_mode()方法用于切换工作模式,从当前控制浏览器的模式切换到收发数据包模式。

切换的时候程序会在新模式重新访问当前 url。

items = tab('#hits-list').eles('.item')

↑ 切换后,我们可以用与控制浏览器一致的语法,获取页面元素,这获取页面中所有结果行素,它返回这些元素对象组成的列表。

for item in items:
    print(item('.title').text)
    print(item('.desc').text)
    print()

↑ 最后,我们遍历这些元素,并逐个打印它们包含的文本。



四、基本概念

本节讲解 DrissionPage 的一些基本概念。了解它大概的构成。

如果您觉得有点懵,可直接跳过本节。

网页自动化

网页自动化的形式通常有两种,它们各有优劣:

  • 直接向服务器发送数据包,获取需要的数据
  • 控制浏览器跟网页进行交互

前者轻量级,速度快,便于多线程、分布式部署,如 requests 库。但当数据包构成复杂,甚至加入加密技术时,开发过程烧脑程度直线上升。

鉴于此,DrissionPage 以页面为单位将两者整合,对 Chromium 协议 和 requests 进行了重新封装,实现两种模式的互通,并加入常用的页面和元素控制功能,可大幅降低开发难度和代码量。
用于操作浏览器的对象叫 Driver,requests 用于管理连接的对象叫 Session,Drission 就是它们两者的合体。Page 表示以页面为单位使用。

在旧版本,本库是通过对 selenium 和 requests 的重新封装实现的。
从 3.0 版开始,作者另起炉灶,自行实现了 selenium 全部功能,从而摆脱了对 selenium 的依赖,功能更多更强,运行效率更高,开发更灵活。 4.0 则在 3.0 经验的基础上对整个项目底层进行了重构,逻辑更合理。

如果您想了解旧版,请查阅“旧版使用方法”章节。

基本使用逻辑

无论是控制浏览器,还是收发数据包,其操作逻辑是一致的。

即先创建页面对象,然后从页面对象中获取元素对象,通过对元素对象的读取或操作,实现数据的获取或页面的控制。

因此,最主要的对象就是两种:页面对象,及其生成的元素对象。

主要对象

浏览器和标签页对象

  • Chromium:浏览器对象,用于连接浏览器、管理标签页及其它和浏览器总体有关的操作
  • MixTab:浏览器标签页对象,由Chromium对象产生,一个对象控制一个实际的标签页
  • ChromiumTab:和MixTab一样也是标签页对象,由ChromiumPage对象产生,不可切换收发数据包模式

元素对象

  • ChromiumElement:浏览器元素对象
  • SessionElement:静态元素对象
  • ChromiumFrame<iframe>元素对象,兼有标签页对象和元素特性
  • ShadowRoot:shadow-root 元素对象

Page 对象

  • ChromiumPage:能管理浏览器本身的标签页对象,可用作程序入口
  • WebPage:类似于ChromiumPage,整合浏览器控制和收发数据包于一体的页面对象
  • SessionPage:单纯用于收发数据包的页面对象,可单独使用

称呼

文档里经常用到这几个称呼:

  • MixTabChromiumTab统称为 Tab 对象
  • ChromiumPageWebPageSessionPage统称为 Page 对象
  • Page 对象、Tab 对象和ChromiumFrame统称为页面对象

对象关系图

下图列出本库中要用到的各种对象的生成关系。

├─ SessionPage
|     └─ SessionElement
|           └─ SessionElement
├─ Chrmoium
|     └─ MixTab
|           ├─ ChromiumElement
|           |    ├─ ChromiumElement
|           |    ├─ ChromiumFrame
|           |    └─ SessionElement
|           ├─ SessionElement
|           |    └─ SessionElement
|           ├─ ChromiumFrame
|           |    ├─ ChromiumElement
|           |    ├─ ChromiumFrame
|           |    └─ SessionElement
|           └─ ShadowRoot
|                ├─ ChromiumElement
|                ├─ ChromiumFrame
|                └─ SessionElement
├─ SessionOptions
└─ ChrmoiumOptions

工作模式

MixTabWebPage既可控制浏览器,也可用数据包方式访问网络数据。 它们有两种工作方式:d 模式和 s 模式。
页面对象可以在这两种模式间切换,两种模式拥有一致的使用方法,但任一时间只能处于其中一种模式。

d 模式

d 模式既表示 Driver,还有 Dynamic 的意思。
d 模式用于控制浏览器,不仅可以读取浏览器获取到的信息,还能对页面进行操作,如点击、填写、开关标签页、改变元素属性、执行 js 脚本等等。
d 模式功能强大,但运行速度受浏览器制约非常缓慢,而且需要占用大量内存。

s 模式

s 模式既表示 Session,还有 speed、silence 的意思。
s 模式的运行速度比 d 模式快几个数量级,但只能基于数据包进行读取或发送,不能对页面进行操作,不能运行 js。
爬取数据时,如网站数据包较为简单,应首选 s 模式。

模式切换

MixTabWebPage对象可以在 d 模式和 s 模式之间切换,这通常用于以下情况:

  • 当登录验证很严格,难以解构,如有验证码的时候,用浏览器处理登录,然后转换成 s 模式爬取数据。既避免了处理烧脑的 js,又能享受 s 模式的速度。
  • 页面数据由 js 产生,且页面结构极其复杂,可以用 d 模式读取页面元素,然后把元素转成 s 模式的元素进行分析。可以极大地提高 d 模式的处理速度。

配置管理

无论 requests 还是浏览器,都通常需要一些配置信息才能正常工作,如长长的user_agent、浏览器 exe 文件路径、浏览器配置等。 这些代码往往是繁琐而重复的,不利于代码的简洁。
因此,DrissionPage 使用配置文件记录常用配置信息,程序会自动读取默认配置文件里的内容。 所以,在示例中,通常看不见配置信息的代码。

这个功能支持用户保存不同的配置文件,按情况调研,也可以支持直接把配置写在代码里面,屏蔽读取配置文件。

Tips

当需要打包程序时,必需把配置写到代码里,或打包后手动复制配置文件到运行路径,否则会报错。详见相关章节。

SessionOptions

用于SessionPageWebPage s 模式的配置对象。

ChromiumOptions

用于用于浏览器的配置对象。

定位符

定位符用于定位页面中的元素,是本库一大特色,能够用非常简明的方式来获取元素,简洁易用。 可读性和易用性高于 xpath 等其它方式,并且兼容 xpath、css selector、selenium 定位符。

以下是一组对比:

定位文本包含'abc'的元素:

# DrissionPage
ele = tab('abc')

# selenium
ele = driver.find_element(By.XPATH, '//*[contains(text(), "abc"]')

定位 class 为'abc'的元素:

# DrissionPage
ele = tab('.abc')

# selenium
ele = driver.find_element(By.CLASS_NAME, 'abc')

定位 ele 元素的兄弟元素:

# DrissionPage
ele1 = ele.next()  # 获取后一个元素
ele1 = ele.prev(index=2)  # 获取前面第二个元素

# selenium
ele1 = ele.find_element(By.XPATH, './/following-sibling::*')  # 获取有i一个元素
ele1 = ele.find_element(By.XPATH, './/preceding-sibling::*[2]')  # 获取前面第二个元素

显然,本库的定位语句更简洁易懂,还有很多灵活好用的方法,详见 “查找元素” 章节。