3

推荐一款新的自动化测试框架:DrissionPage! - 狂师

 1 year ago
source link: https://www.cnblogs.com/jinjiangongzuoshi/p/17139003.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

今天给大家推荐一款基于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/

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK