自动化测试框架搭建思路(推荐一款新的自动化测试框架: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).text4 、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%免费】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库 ,这个仓库也陪伴上万个测试工程师们走过最艰难的路程 ,希望也能帮助到你!
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!