• 0
  • 0
分享

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


作者:测试开发技术    

来源:http://www.51testing.com/html/10/n-7795510.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 容器技术是目前热门话题之一,在许多互联网公司已有实际应用,对于测试者来讲需要我们主动迁移测试管理环境适应新变化。本文将介绍如何在CentOS 7 + Docker环境中部署和配置Testlink1.9 + Mantis。本次环境搭建操作系统选用互联网公司主流Linux系统CentOS7,容器环境选择Docker1.12。而Testlink想必测试人员都不算陌生,这是一款开源的web测试管理工具,它不仅提供了测试需求、测试设计、测试执行和测试结果分析的管理过程,而且还能和常见的Bug跟踪工具协同工作。本次我们将介绍Testlink和Mantis缺陷跟踪系统的集成,该工具很好的...
            0 1 3545
            分享
          •   摘要  通过严格的实践来增强系统的性能和可恢复性,并对这些方面进行持续的测试,是预先找到问题的好方法。与测试的其他方面一样,性能实践的质量要比数量重要得多,这里有七个简单的技巧可以帮助你在测试系统的性能和可恢复性时更高效。  软件的性能和可恢复性是用户体验的关键组成部分,但是随着软件行业对开发运维一体化(DevOps)模式的接纳,它开始在性能和可恢复性方面表现出不足。  在软件完全失败之前,性能问题常常被忽略。  然而,我们都知道,性能不会突然下降。由于软件是通过迭代发布的,每次添加更多代码时都要付出性能成本,添加的逻辑循环也可能导致故障,从而影响到整个系统的稳定性。  严重的性能或软件可...
            0 0 1027
            分享
          • 一、什么是时序数据库时序数据库全称为时间序列数据库。时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。时序数据库全的特点包括一是多源性获取,数据分散,非结构化数据比例大;二是数据蕴含信息复杂,关联性强;三是持续采集,具有鲜明的动态时空特性;四是采集、存贮、处理实时性要求高;五是与具体工业领域密切相关。时序数据库采用的技术时序数据库高压缩比存储技术时序数据库的列存储技术时序数据库的时间序列技术时序数据库支持大数据量吞吐处理技术时序数据库的高聚合查询技术本文根据时序数据库的技术特点结合实际业务场景,设计如下测试方法:时序数据库建库...
            0 0 4300
            分享
          • 用工具代替/辅助人工完成软件测试活动的过程,不能为了自动化而自动化自动化测试特点可以对程序的新版本自动执行回归测试可以执行一些手工测试困难或不可能进行的测试可以更好地利用资源测试具有一致性和可重复性自动化一定要有框架自动化测试优势节省时间,提高测试覆盖率和测试精度减少手工测试人为产生的错误提供规范化的过程和一致性自动化测试局限性手工测试比自动测试发现的故障要多,自动化只能发现约15%的bug自动化测试不能提高测试的有效性,只能用于提高测试的效率自动化测试不具有想象力,没人聪明自动化测试不能取代手工测试误区:期望自动化测试发现大量新故障安全性错觉自动化测试的维护开销不适合于自动化测试情景测试频度...
            0 0 1221
            分享
          • 前言:本篇讲堂是紧接【安全测试工具-进阶篇[访问控制漏洞(上)]】的内容。例牌,先说下安全测试工具的更新情况【工具地址:https://gitee.com/samllpig/SafeTool-51testing】服务端增加解析隐藏链接的功能重放窗口修改500响应无法显示的问题正文:漏洞讲解:所属模块: (A5) Broken Access Control [访问控制漏洞]7.1 菜单项: Missing Function Level Access Control [缺少功能级访问控制],本章共3个小节7.1.1 第一节主题: 介绍缺少功能级访问控制内容:这节的主题...
            0 0 52
            分享
      • 51testing软件测试圈微信