当前位置: 首页 > article >正文

一文掌握DrissionPage的详细使用

文章目录

    • 1. 什么是DrissionPage?
    • 2. 安装 DrissionPage
    • 3. 基本使用
      • 3.1 初始化浏览器
      • 3.2 打开网页
      • 3.3 查找元素
      • 3.4 操作元素
      • 3.5 获取元素属性
      • 3.6 执行 JavaScript
      • 3.7 页面对象(Page Object)
      • 3.8 元素定位方式
      • 3.9 常用操作方法
      • 3.10 断言
    • 4. 高级功能
      • 4.1 处理弹窗
      • 4.2 切换 Frame
      • 4.3 等待元素
      • 4.4 截图
      • 4.5 数据驱动测试
    • 5. 实战示例
      • 5.1 自动登录
      • 5.2 数据抓取
      • 5.3 编写测试用例
    • 6. 最佳实践
      • 6.1 ​页面对象设计原则
      • 6.2 元素定位优化:
      • 6.3 ​异常处理:
      • 6.4 ​环境配置:
    • 7. 总结

1. 什么是DrissionPage?

DrissionPage 是一个基于 Python 的网页自动化工具,主要用于网页数据的抓取、自动化操作和测试。它结合了 Selenium 和 Requests 的优点,提供了更简洁、高效的 API,适用于各种网页自动化任务。

2. 安装 DrissionPage

在开始使用 DrissionPage 之前,需要先安装它。可以通过 pip 进行安装:pip install DrissionPage。然后创建项目目录并初始化配置文件:

mkdir drission_project
cd drission_project
drission init

初始化后会生成以下文件:

  • config.ini:配置文件(存放浏览器驱动路径、测试环境等)
  • pages/:页面对象目录
  • tests/:测试用例目录
  • utils/:工具类目录

3. 基本使用

3.1 初始化浏览器

DrissionPage 支持多种浏览器,包括 Chrome、Firefox 等。初始化浏览器的代码如下:

from DrissionPage import WebPage# 初始化 Chrome 浏览器
page = WebPage('chrome')

3.2 打开网页

使用 get() 方法可以打开指定的网页:

page.get('https://www.example.com')

3.3 查找元素

DrissionPage 提供了多种查找元素的方法,常用的有 ele() 和 eles():

  • ele():查找单个元素。
  • eles():查找多个元素。
# 查找单个元素
element = page.ele('#element-id')# 查找多个元素
elements = page.eles('.class-name')

3.4 操作元素

找到元素后,可以对其进行各种操作,如点击、输入文本等:

# 点击元素
element.click()# 输入文本
element.input('Hello, DrissionPage!')

3.5 获取元素属性

可以通过 attr() 方法获取元素的属性:

# 获取元素的 href 属性
href = element.attr('href')

3.6 执行 JavaScript

DrissionPage 允许直接执行 JavaScript 代码:

# 执行 JavaScript
page.run_js('alert("Hello, DrissionPage!");')

3.7 页面对象(Page Object)

每个 Web 页面对应一个 Python 类,封装页面元素和操作方法。

# pages/login_page.py
from drissionpage import Pageclass LoginPage(Page):def __init__(self, driver):super().__init__(driver)self.username_input = self.by_id("username")  # 定位元素self.password_input = self.by_id("password")self.login_button = self.by_id("login-btn")def login(self, username, password):self.username_input.send_keys(username)self.password_input.send_keys(password)self.login_button.click()

3.8 元素定位方式

支持多种定位策略:

定位方式语法
IDself.by_id(“element_id”)
Nameself.by_name(“name”)
XPathself.by_xpath(“//tag[@id]”)
CSS Selectorself.by_css(“div.class”)
Link Textself.by_link_text(“Link Text”)

3.9 常用操作方法

# 输入文本
self.username_input.send_keys("test_user")# 点击元素
self.login_button.click()# 获取文本
assert self.success_msg.text == "Login Success"# 切换窗口/标签页
self.switch_to.window(handle)# 执行 JavaScript
self.execute_script("window.scrollTo(0, document.body.scrollHeight);")

3.10 断言

集成 unittest 或 pytest 的断言方式:

from drissionpage import assert_# 验证元素是否存在
assert_.is_present(self.username_input)# 验证文本是否匹配
assert_.text_equals(self.login_button, "Login")

4. 高级功能

4.1 处理弹窗

DrissionPage 提供了处理弹窗的功能,可以轻松应对各种弹窗场景:

# 处理弹窗
page.handle_alert(accept=True)

4.2 切换 Frame

如果网页中有 iframe,可以使用 switch_to_frame() 方法切换到指定的 frame:

# 切换到 iframe
page.switch_to_frame('iframe-name')

4.3 等待元素

DrissionPage 提供了等待元素出现或消失的功能:

# 等待元素出现
page.wait_ele('#element-id')# 等待元素消失
page.wait_ele_disappear('#element-id')

4.4 截图

可以轻松地对网页进行截图:

# 截图并保存
page.screenshot('screenshot.png')

4.5 数据驱动测试

结合 CSV 或 Excel 文件实现多组数据测试:

# tests/test_login_dataDriven.py
import csv
from drissionpage import TestCase
from pages.login_page import LoginPageclass LoginTestCase(TestCase):@classmethoddef get_test_data(cls):data = []with open("testdata.csv") as f:reader = csv.DictReader(f)for row in reader:data.append((row["username"], row["password"]))return datadef test_login(self, username, password):self.open("http://example.com/login")login_page = LoginPage(self.driver)login_page.login(username, password)assert_.is_present(login_page.success_msg)

5. 实战示例

5.1 自动登录

以下是一个自动登录的示例:

from DrissionPage import WebPage# 初始化浏览器
page = WebPage('chrome')# 打开登录页面
page.get('https://www.example.com/login')# 输入用户名和密码
page.ele('#username').input('your-username')
page.ele('#password').input('your-password')# 点击登录按钮
page.ele('#login-button').click()# 等待登录成功
page.wait_ele('#welcome-message')# 截图保存
page.screenshot('login_success.png')

5.2 数据抓取

以下是一个简单的数据抓取示例:

from DrissionPage import WebPage# 初始化浏览器
page = WebPage('chrome')# 打开目标网页
page.get('https://www.example.com/data')# 获取所有数据项
data_items = page.eles('.data-item')# 遍历并打印数据
for item in data_items:print(item.text)# 关闭浏览器
page.quit()

若元素定位失败,则检查定位表达式是否正确。或者添加显式等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "username"))
)

5.3 编写测试用例

# tests/test_login.py
from drissionpage import TestCase
from pages.login_page import LoginPageclass LoginTestCase(TestCase):def test_valid_login(self):# 打开登录页面self.open("http://example.com/login")# 创建页面对象login_page = LoginPage(self.driver)# 执行登录操作login_page.login("test_user", "test_password")# 验证结果assert_.is_present(login_page.success_msg)assert_.text_equals(login_page.success_msg, "Login Success")

然后运行测试:drission run tests/test_login.py

6. 最佳实践

6.1 ​页面对象设计原则

  • 每个页面对应一个类,封装页面元素和操作。
  • 方法命名清晰(如 login()、submit_form())。

6.2 元素定位优化:

  • 避免使用易变动的属性(如 class 名称)。
  • 优先使用 ID 或 name,其次使用相对稳定的 XPath 或 CSS Selector。

6.3 ​异常处理:

try:self.login_button.click()
except NoSuchElementException:self.log_error("Login button not found")

6.4 ​环境配置:

使用 config.ini 管理不同环境(开发/生产)的 URL 和驱动路径。

7. 总结

DrissionPage 是一个功能强大且易于使用的网页自动化工具,适用于各种网页自动化任务。希望本文的 DrissionPage 的基本使用方法和一些高级功能能够帮助到你。

相关文章:

一文掌握DrissionPage的详细使用

文章目录 1. 什么是DrissionPage?2. 安装 DrissionPage3. 基本使用3.1 初始化浏览器3.2 打开网页3.3 查找元素3.4 操作元素3.5 获取元素属性3.6 执行 JavaScript3.7 页面对象(Page Object)3.8 元素定位方式3.9 常用操作方法3.10 断言 4. 高级…...

Android平台轻量级RTSP服务模块技术对接说明

一、技术背景 随着内网无纸化办公、电子教室等应用场景对超低延迟音视频传输需求的日益增长,为避免用户或开发者单独部署 RTSP 或 RTMP 服务,大牛直播 SDK 推出了轻量级 RTSP 服务 SDK。该 SDK 能够将本地音视频数据(如摄像头、麦克风等&…...

代码随想录第二十天|二叉树part08--669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

刷题小记: 上期学习了二叉搜索树的插入和删除操作,这次学习如何按区间修剪二叉搜索树。还有两题,关于借助二叉搜索树的有序特性进行转换。 669.修剪二叉搜索树(669.修剪二叉搜索树) 题目分析: 给定一个…...

RoCEv2 高性能传输协议与 Lossless 无损网络

目录 文章目录 目录RoCERoCEv2 v.s. IBRoCEv2 协议栈RoCEv2 需要 Lossless NetworkLossless Network 拥塞控制技术网络拥塞的原因PFC 基于优先级的流量控制PFC Unfairness (带宽分配不公平)的问题PFC HOL(队头拥塞)的问题PFC Dead…...

C语言多人聊天室 ---chat(客户端聊天)

head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...

联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换&#xff0c;新盘最好不要有东西。但是有东西可能也没啥&#xff0c;因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机&#xff0c;电源键进入绿色闪烁状态 2. 断电&#xff0c;推开塑料滑块拉出支架&#xff0c;…...

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章

当艺术与科技相遇&#xff0c;会碰撞出怎样的火花&#xff1f;城电科技推出的光伏太阳花&#xff0c;以其独特的设计与智能化的功能&#xff0c;给出了答案。这款产品不仅具备太阳能发电的实用功能&#xff0c;更是一件充满科技属性的艺术性光伏产品&#xff0c;吸引了广泛关注…...

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

FFmpeg 命令行全解析:高效音视频处理从入门到精通

FFmpeg FFmpeg 是一款开源的多媒体处理工具集,支持音视频编解码、格式转换、流媒体处理等全链路操作。核心功能与工具: 多媒体全链路支持 支持 1000+ 音视频编解码格式(如 H.264、HEVC、AV1)和协议(RTMP、RTSP、HLS),覆盖录制、转码、流化等全流程。提供三大核心工具: …...

kafka数据拉取和发送

文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…...

多智能体框架

多个不同的角色的Agent&#xff0c;共同完成一份复杂的工作。由一个统筹管理的智能体&#xff0c;自主规划多个智能体分别做什么&#xff0c;以及执行的顺序。 agent 应该包含的属性 执行特定任务 根据其角色和目标做出决策 能够使用工具来实现目标 与其他代理沟通和协作 保留…...

C++ 正则表达式分组捕获入门指南

在 C 中&#xff0c;正则表达式&#xff08;regex&#xff09;是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符&#xff0c;还能捕获匹配的子字符串&#xff08;即分组捕获&#xff09;。这篇文章将介绍 C 正则表达式中的分组捕获机制&…...

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误&#xff1a;编程路上的 “绊脚石” 在 C# 编程中&#xff0c;错误大致可分为两类&#xff1a;语法错误和语义错误&#xff08;逻辑错误&#xff09;。语法错误就像是写作文时的错别字和病句&#xff0c;编译器一眼就能识别出来&#xff0c;比如变量名拼写错误、符…...

Jmeter接口并发测试

Apache JMeter 是一款开源的性能测试工具&#xff0c;广泛用于接口并发测试、负载测试和压力测试。以下是使用 JMeter 进行接口并发测试的详细步骤&#xff1a; 一、准备工作 安装 JMeter 下载地址&#xff1a;Apache JMeter 官网 确保已安装 Java 环境&#xff08;JMeter 依…...

MySQL-增删改查

一、Create(创建) &#x1f4d6; 语法&#xff1a; INSERT INTO table_name(value_list); 当我们使用表的时候&#xff0c;就可以使用这个语法来向表中插入元素~ 我们这边创建一个用于示范的表(Student)~ create table student( id int, name varchar(20), chinese int, math…...

开源堡垒机 JumpServer 社区版实战教程:发布机的配置与Website资产配置使用

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;发布机的配置与Website资产配置使用一、功能简述二、应用发布机2.1 版本要求2.2 创建应用发布机2.2.1 通过WinRM的协议进行应用发布机的创建2.2.2 通过OpenSSH的协议进行应用发布机的创建2.2.2.1 下载OpenSSH2.2.2.2…...

【STM32】使用电打火器测试火焰传感器,去掉传感器LED依然亮

项目需求&#xff1a;火焰传感器识别到火焰后&#xff0c;LED灯闪烁&#xff0c;然后熄灭。 现象描述&#xff1a;不需要火焰传感器&#xff0c;当使用电打火器时电路板LED灯也会闪烁。&#xff08;详情看底部视频&#xff09; fire.h #ifndef __FIRE_H #define __FIRE_H …...

代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》

代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra&#xff08;朴素版&#xff09;总结 前言 今天是算法营的第64天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&#xff01;今…...

机器学习数学基础:32.斯皮尔曼等级相关

斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数&#xff08;Spearman’s rank - correlation coefficient&#xff09;&#xff0c;常用 ρ \rho ρ表示&#xff0c;是一种非参数统计量&#xff0c;用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…...

《论区块链技术及应用》审题技巧 - 系统架构设计师

区块链技术及应用论题写作框架 一、考点概述 本论题“区块链技术及应用”主要考察软件测试工程师对区块链技术的理解及其在软件项目中的实际应用能力。论题涵盖了多个关键方面&#xff0c;首先要求考生对区块链技术有全面的认识&#xff0c;包括但不限于其作为分布式记账技术…...

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;四&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&…...

单片机的串口(USART)

Tx - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…...

Modelfile配置说明

参数说明翻译 参数描述值类型示例用法mirostat启用Mirostat采样以控制困惑度。&#xff08;默认&#xff1a;0&#xff0c;0禁用&#xff0c;1Mirostat&#xff0c;2Mirostat 2.0&#xff09;intmirostat 0mirostat_eta影响算法对生成文本反馈的响应速度。较低的学习率将导致调…...

pnpm的基本用法

以下是 pnpm 的核心命令和使用指南&#xff0c;涵盖从安装依赖到项目管理的常见操作&#xff1a; 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包&#xff08;自动添加到 dependencies&#xf…...

动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题

动态规划&#xff08;背包问题&#xff09; 题目链接01背包代码 完全背包问题代码 多重背包问题 I代码 什么时候适用逆序多重背包问题 II&#xff08;超百万级的复杂度&#xff09;代码 关于二进制拆分 题目链接 01背包 代码 #include <iostream> #include <vector&…...

Vue 中动态实现进度条

在 Vue 中动态实现进度条&#xff0c;基本上有两种常见的方法&#xff1a;直接通过 Vue 数据绑定控制样式&#xff0c;或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式&#xff0c;并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...

如何基于PyTorch做二次开发

基于PyTorch进行二次开发以实现可视化工程&#xff0c;可以从以下几个方面入手&#xff1a;模型结构可视化、训练过程监控、特征可视化等。以下是一些推荐的GitHub项目&#xff0c;这些项目可以帮助你快速搭建一个可视化的工程环境&#xff1a; ### 1. **PyTorch CNN Visualiz…...

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…...

算法——后缀平衡树

先回想一下之前讨论的内容。之前我们详细讨论了后缀树&#xff0c;包括它的构建、应用以及相关算法。用户可能是在了解后缀树之后&#xff0c;想要进一步探索相关的数据结构&#xff0c;或者是想比较后缀树和后缀平衡树的异同。 后缀平衡树并不是一个常见的数据结构名称&#…...

姿态矩阵/旋转矩阵/反对称阵

物理意义&#xff0c;端点矢量角速率叉乘本身向量&#xff1b; 负号是动系b看固定系i是相反的&#xff1b; 一个固定 在惯性导航解算中&#xff0c;旋转矢量的叉乘用于描述姿态矩阵的微分方程。你提到的公式中&#xff0c; ω i b b \boldsymbol{\omega}_{ib}^b \times ωibb…...