推荐一款新的自动化测试框架:DrissionPage!
今天给大家推荐一款基于Python的网页自动化工具:DrissionPage。这款工具既能控制浏览器,也能收发数据包,甚至能把两者合而为一,简单来说:集合了WEB浏览器自动化的便利性和 requests 的高效率。
一、DrissionPage产生背景
实现网页自动化,会有两类形式:
- 直接向服务器发送请求数据包,获取需要的数据
- 模拟真实用户操作行为,控制浏览器跟网页进行交互
前者轻量级,速度快,例如requests 库。但requests面对需要登录的网站时,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,开发效率不高。
而后者直接使用浏览器,模拟用户行为,如Selenium库,可以很大程度上绕过这些坑,但浏览器运行效率不高。
因此,DrissionPag设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
为什么叫DrissionPag
Selenium框架用于操作浏览器的对象叫 Driver,requests 用于管理请求连接的对象叫 Session,因此Drission 就是它们两者的合体。在旧版本中,是通过对 selenium 和 requests 的重新封装实现的。
但从 3.0 版开始,作者另起炉灶,用 chromium 协议自行实现了 selenium 全部功能,从而摆脱了对 selenium 的依赖,功能更多更强,运行效率更高,开发更灵活。
二、DrissionPage亮点特色
本库采用全自研的内核,对比 selenium,有以下优点:
- 无 webdriver 特征,不会被网站识别,无需为不同版本的浏览器下载不同的驱动
- 运行速度更快,可以跨 iframe 查找元素,无需切入切出,iframe 看作普通元素,获取后可直接在其中查找元素,逻辑更清晰
- 可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换
- 内置等待和自动重试功能。使不稳定的网络变得易于控制,程序更稳定,编写更省心
- 允许反复使用已经打开的浏览器。无须每次运行从头启动浏览器,调试超方便
- 极简的语法规则。集成大量常用功能,定位元素更加容易,功能更强大稳定
- 使用 POM 模式封装,可直接用于测试,便于扩展
- 等等。。。
三、安装搭建
说了这么多,相信很多人已经跃跃欲试了,怎么快速搭建这套框架,先要准备一些基础环境。
环境准备
- 操作系统:Windows、Linux 或 Mac。
- python 版本:3.6 及以上
- 支持浏览器:Chromium 内核(如 Chrome 和 Edge)
项目地址:
https://gitee.com/g1879/DrissionPage
使用 pip 安装 DrissionPage:
pip install DrissionPage
另外在开始之前,我们先进行一些简单设置。如果只使用收发数据包功能,无须任何准备工作。
如果要控制浏览器,须设置浏览器路径。程序默认设置控制 Chrome,所以以下用 Chrome 作为演示。如果要使用 Edge 或其它 Chromium 内核浏览器,设置方法是一样的。
设置浏览器路径:
from DrissionPage.easy_set import set_paths
set_paths(browser_path=r'这里修改为您的Chrome浏览器exe文件路径')
这段代码会记录 Chrome 浏览器路径到配置文件。由于路径设置只要运行一次即可,不要写到正式程序里。一般建议新建一个临时 py 文件,并输入以下代码,填入您电脑里的 Chrome 浏览器 exe 文件路径,然后执行。
四、实战一下
1、尝试启动浏览器:
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://www.baidu.com')
执行以下代码,如果正常启动了浏览器并且访问了百度,说明可直接使用,跳过后面的步骤即可。
执行代码前,如果已有打开的 Chrome 浏览器,请关闭。
2、与selenium框架代码对比

#案例一:用显性等待方式查找第一个文本包含 some text 的元素。
# 使用 selenium:
element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]')))
# 使用 DrissionPage:
element = page('some text')
#案例二:跳转到第一个标签页
# 使用 selenium:
driver.switch_to.window(driver.window_handles[0])
# 使用 DrissionPage:
page.to_tab(0)
# 案例三:拖拽一个元素
# 使用 selenium:
ActionChains(driver).drag_and_drop(ele1, ele2).perform()
# 使用 DrissionPage:
ele1.drag_to(ele2)
以上代码实现一模一样的功能,但DrissionPage代码明显更简洁优雅。
3、与requests框架代码对比

# 案例一:获取元素内容
url = 'https://baike.baidu.com/item/python'
# 使用 requests:
from lxml import etree
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
response = requests.get(url, headers = headers)
html = etree.HTML(response.text)
element = html.xpath('//h1')[0]
title = element.text
# 使用 DrissionPage:
page = WebPage('s')
page.get(url)
title = page('tag:h1').text
4、DrissionPage不同模式切换
例如:用浏览器登录网站,然后切换到 requests 读取网页。两者会共享登录信息。
from DrissionPage import WebPage
from time import sleep
# 创建页面对象,默认 d 模式
page = WebPage()
# 访问个人中心页面(未登录,重定向到登录页面)
page.get('https://gitee.com/profile')
# 使用 selenium 输入账号密码登录
page.ele('@id:user_login').input('your_user_name')
page.ele('@id:user_password').input('your_password\n')
sleep(1)
# 切换到 s 模式
page.change_mode()
# 登录后 session 模式的输出
print('登录后title:', page.title, '\n')
五、小结
DrissionPage体验一番后,虽然也发现了一些不足的地方,但整得来讲,很多设计理念还是非常值得借鉴的,更多功能就留给大家去探索了,项目文档地址:
http://g1879.gitee.io/drissionpagedocs/
推荐一款新的自动化测试框架:DrissionPage!的更多相关文章
- 推荐一款新框架PyScript:在 HTML 嵌入 Python 代码!
一.介绍 网页浏览器是目前世界上最普遍,最可携的计算机环境.几乎所有人都可以在计算机或是手机上使用网页浏览器,以没有基础设施障碍的方式访问程序. 在 PyCon US 2022 上,知名 Python ...
- 推荐一款 Python 微服务框架 - Nameko
1. 前言 大家好,我是安果! 考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中 本篇文章 ...
- 对Golang有兴趣的朋友,推荐一款go语言Web框架-dotweb
Go语言,2009年推出,对我个人,2015年下半年,才下定决心正式开始引入使用Go,自此,让我获得了一种全新的开发体验. 在不断的项目过程中,一个开发人员总喜欢堆积一些代码段,由于Go的开源特性,逐 ...
- 推荐一款轻量级PHP数据库框架–Medoo
引用官网的简介: 可以加快开发速度的最轻量级的PHP数据库框架 为什么选择Medoo及其主要功能: 轻量级–单个文件,只有20KB 易用–非常容易学习和使用 功能强大–支持各种常见和复杂的SQL查询 ...
- 推荐一款分布式微服务框架 Surging
surging surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询,压力最小优先作为 ...
- 推荐一款Diffy:Twitter的开源自动化测试工具
1. Diffy是什么 Diffy是一个开源的自动化测试工具,是一种Diff测试技术.它能够自动检测基于Apache Thrift或者基于HTTP的服务.通过同时运行新/老代码,对比运行结果,发现潜在 ...
- 新特性,推荐一款超强接口管理神器 Apifox
去年,在公众号给大家推荐了一款新面市不久的接口测试神器:Apifox,如果还未了解的读者,感兴趣的话可查阅原文:推荐一款技术人必备的接口测试神器:Apifox 为了照顾新进来的读者,且最近一年,Api ...
- 推荐25款实用的 HTML5 前端框架和开发工具【下篇】
快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验. ...
- 【转】推荐10款最热门jQuery UI框架
推荐10款最热门jQuery UI框架 原创 在进行Web开发时,并非所有的库都适合你的项目,但你仍需要收藏一些Web UI设计相关的库或框架,以在你需要的时候,加快你的开发效率.本文为你推荐10款非 ...
- 推荐一款自己的软件作品[豆约翰博客备份专家],新浪博客,QQ空间,CSDN,cnblogs博客备份,导出CHM,PDF(转载)
推荐一款自己的软件作品[豆约翰博客备份专 豆约翰博客备份专家是完全免费,功能强大的博客备份工具,博客电子书(PDF,CHM和TXT)生成工具,博文离线浏览工具,软件界面美观大方,支持多个主流博客网站( ...
随机推荐
- 新零售SaaS架构:多租户系统架构设计
什么是多租户? 多租户是SaaS领域的特有产物,在SaaS服务中,租户是指使用SaaS系统的客户,租户不同于用户,例如,B端SaaS产品,用户可能是某个组织下的员工,但整个企业组织是SaaS系统的租户 ...
- 打印九九乘法表,打印金字塔-java
/** * *** ***** 打印如图金字塔 *=i*2-1 (竖)空格数=列数-1 */ public class Circulate{ public static void main(Strin ...
- EasyCode全自动单表增删改查!
需要IDEA下载EasyCode插件 准备好三个基础Base类 分页封装基础 package com.gton.io; import lombok.AllArgsConstructor; import ...
- Mybatis04:延迟加载、一二级缓存、注解开发
今日内容 mybatis中的延迟加载 延迟加载的概念 立即加载的概念 如果实现延迟加载 Mybatis中的缓存 什么是缓存 为什么使用缓存 什么数据可以使用缓存,什么样的数据不能使用缓存 Mybati ...
- 【Java SE进阶】Day06 线程、同步
一.线程 1.多线程原理 流程图 内存图解说明 创建线程的方式 继承Thread类 实现 Runnable接口 2.继承Thead类 3.实现Runnable接口 实现接口,重写run方法 最终均需要 ...
- 如何使用Abstract类?抽象类的威力
简介: 今天我想谈谈如何使用抽象类,以及抽象类真正的威力.本文将结合具体业务来说明如何使用抽象类. 业务简述: 本人目前只接触过PMS(物业管理系统),公司主要业务的是美国的租房业务.由于美国租房和中 ...
- Blazor组件自做十三: 使用 Video.js 在 Blazor 中播放视频
Video.js 是一个具有大量功能的流行的视频和音频 JavaScript 库,今天我们试试集成到 Blazor . Blazor VideoPlayer 视频播放器 组件 示例 https://b ...
- 事件 jQuery类库、Bootstrap页面框架
目录 jQuery查找标签 基本选择器 组合选择器 层级选择器 属性选择器 基本筛选器 表单筛选器 筛选器方法 链式的本质(jQuery一行代码走天下) 操作标签 class操作 位置操作 文本操作 ...
- React报错之Element type is invalid
总览 产生"Element type is invalid -- expected a string (for built-in components) or a class/functio ...
- 推荐8个提高工作效率的IntelliJ插件
前言 欢迎关注微信公众号「JAVA旭阳」交流和学习 IntelliJ目前已经成为市面上最受欢迎的Java开发工具,这得益于里面非常丰富的插件机制.本文我将分享在日常开发中我经常使用的5个插件,它们可以 ...