推荐一款新的自动化测试框架: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 内核浏览器,设置方法是一样的。

设置浏览器路径:

  1. from DrissionPage.easy_set import set_paths

  2. set_paths(browser_path=r'这里修改为您的Chrome浏览器exe文件路径')

这段代码会记录 Chrome 浏览器路径到配置文件。由于路径设置只要运行一次即可,不要写到正式程序里。一般建议新建一个临时 py 文件,并输入以下代码,填入您电脑里的 Chrome 浏览器 exe 文件路径,然后执行。

四、实战一下

1、尝试启动浏览器:

  1. from DrissionPage import ChromiumPage

  2. page = ChromiumPage()

  3. page.get('https://www.baidu.com')

执行以下代码,如果正常启动了浏览器并且访问了百度,说明可直接使用,跳过后面的步骤即可。

执行代码前,如果已有打开的 Chrome 浏览器,请关闭。

2、与selenium框架代码对比

  1. #案例一:用显性等待方式查找第一个文本包含 some text 的元素。

  2. # 使用 selenium:

  3. element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]')))

  4. # 使用 DrissionPage:

  5. element = page('some text')

  6. #案例二:跳转到第一个标签页

  7. # 使用 selenium:

  8. driver.switch_to.window(driver.window_handles[0])

  9. # 使用 DrissionPage:

  10. page.to_tab(0)

  11. # 案例三:拖拽一个元素

  12. # 使用 selenium:

  13. ActionChains(driver).drag_and_drop(ele1, ele2).perform()

  14. # 使用 DrissionPage:

  15. ele1.drag_to(ele2)

以上代码实现一模一样的功能,但DrissionPage代码明显更简洁优雅。

3、与requests框架代码对比

  1. # 案例一:获取元素内容

  2. url = 'https://baike.baidu.com/item/python'

  3. # 使用 requests:

  4. from lxml import etree

  5. 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'}

  6. response = requests.get(url, headers = headers)

  7. html = etree.HTML(response.text)

  8. element = html.xpath('//h1')[0]

  9. title = element.text

  10. # 使用 DrissionPage:

  11. page = WebPage('s')

  12. page.get(url)

  13. title = page('tag:h1').text

4、DrissionPage不同模式切换

例如:用浏览器登录网站,然后切换到 requests 读取网页。两者会共享登录信息。

  1. from DrissionPage import WebPage

  2. from time import sleep

  3. # 创建页面对象,默认 d 模式

  4. page = WebPage()  

  5. # 访问个人中心页面(未登录,重定向到登录页面)

  6. page.get('https://gitee.com/profile')  

  7. # 使用 selenium 输入账号密码登录

  8. page.ele('@id:user_login').input('your_user_name')  

  9. page.ele('@id:user_password').input('your_password\n')

  10. sleep(1)

  11. # 切换到 s 模式

  12. page.change_mode()  

  13. # 登录后 session 模式的输出

  14. print('登录后title:', page.title, '\n')  

五、小结

DrissionPage体验一番后,虽然还是存在一些不足的地方,但整得来讲,很多设计理念还是非常值得借鉴的,更多功能就留给大家去探索了,项目文档地址:

http://g1879.gitee.io/drissionpagedocs/

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值