麻花痒 发表于 2024-7-23 09:46:14

保举一款新的主动化测试框架:DrissionPage

https://img-blog.csdnimg.cn/f06bd9523a19473e8ae3c6c3dfd6a9a8.png
今天给各人保举一款基于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框架代码对比
https://img-blog.csdnimg.cn/f1e8f61e7c154038b89505ab9d6232ac.png
#案例一:用显性等待方式查找第一个文本包含 some text 的元素。
# 使用 selenium:
element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH, '//*')))

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

#案例二:跳转到第一个标签页
# 使用 selenium:
driver.switch_to.window(driver.window_handles)

# 使用 DrissionPage:
page.to_tab(0)

# 案例三:拖拽一个元素
# 使用 selenium:
ActionChains(driver).drag_and_drop(ele1, ele2).perform()

# 使用 DrissionPage:
ele1.drag_to(ele2)
以上代码实现千篇一律的功能,但DrissionPage代码显着更简便优雅。
3、与requests框架代码对比
https://img-blog.csdnimg.cn/179d806e6e884d48ab0c9ec39de96aed.png
# 案例一:获取元素内容
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')
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/
最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋侪们假如必要可以自行免费领取【保证100%免费】
https://img-blog.csdnimg.cn/ed4627a964d644e285a28f9b5dd81dae.png#pic_center
这些资料,对于【软件测试】的朋侪来说应该是最全面最完整的备战堆栈,这个堆栈也伴随上万个测试工程师们走过最艰难的旅程,渴望也能资助到你!
https://img-blog.csdnimg.cn/910c5562579547c58dde1afc6d941f5d.gif


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 保举一款新的主动化测试框架:DrissionPage