自动化测试框架Pyppeteer的安装和使用

发表于:2021-4-22 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:叶狼    来源:CSDN

  由于 Pyppeteer 采用了 Python 的 async 机制,所以其运行要求的 Python 版本为 3.5 及以上。
  1).极简安装
  使用 pip3 install pyppeteer 命令就能完成 pyppeteer 库的安装,至于 chromium 浏览器,只需要一条 pyppeteer-install 命令就会自动下载对应的最新版本 chromium 浏览器到 pyppeteer 的默认位置。
  window 下 安装完 pyppeteer ,会在 python 安装目录下的 Scripts 目录下 有 pyppeteer-install.exe 和 pyppeteer-install-script.py 两个文件,执行 任意一个都可以安装 chromium 浏览器到 pyppeteer 的默认位置。
  运行 pyppeteer-install.exe :
  如果不运行 pyppeteer-install 命令,在第一次使用 pyppeteer 的时候也会自动下载并安装 chromium 浏览器,效果是一样的。总的来说,pyppeteer 比起 selenium 省去了 driver 配置的环节。
  当然,出于某种原因(需要梯子,或者科学上网),也可能会出现chromium自动安装无法顺利完成的情况,这时可以考虑手动安装:首先,从下列网址中找到自己系统的对应版本,下载chromium压缩包。
  'linux': 'https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/575458/chrome-linux.zip'
  'mac': 'https://storage.googleapis.com/chromium-browser-snapshots/Mac/575458/chrome-mac.zip'
  'win32': 'https://storage.googleapis.com/chromium-browser-snapshots/Win/575458/chrome-win32.zip'
  'win64': 'https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip'
  然后,将压缩包放到pyppeteer的指定目录下解压缩,windows系统的默认目录。
  其他系统下的默认目录可以参照下面:
  Windows: C:\Users\<username>\AppData\Local\pyppeteer
  OS X: /Users/<username>/Library/Application Support/pyppeteer
  Linux: /home/<username>/.local/share/pyppeteer
  or in $XDG_DATA_HOME/pyppeteer if $XDG_DATA_HOME is defined.
  Details see appdirs’s user_data_dir.
  好了,安装完成之后我们命令行下测试下:
  >>> import pyppeteer
  如果没有报错,那么就证明安装成功了。
  2).使用
  Pyppeteer 是一款非常高效的 web 自动化测试工具,由于 Pyppeteer 是基于 asyncio 构建的,它的所有 属性 和方法 几乎都是 coroutine (协程) 对象,因此在构建异步程序的时候非常方便,天生就支持异步运行。
  程序构建的基本思路是新建 一个 browser 浏览器 和 一个 页面 page。
  看下面这段代码,在 main 函数中,先是建立一个浏览器对象,然后打开新的标签页,访问百度主页,对当前页面截图并保存为“example.png”,最后关闭浏览器。前文也提到过,pyppeteer 是基于 asyncio 构建的,所以在使用的时候需要用到 async/await 结构。
  import asyncio
  from pyppeteer import launch

  async def main():
  browser = await launch()
  page = await browser.newPage()
  await page.goto(‘http://baidu.com’)
  await page.screenshot({‘path’: ‘example.png’})
  await browser.close()
  asyncio.get_event_loop().run_until_complete(main())
  运行上面这段代码会发现并没有浏览器弹出运行,这是因为 Pyppeteer 默认使用的是无头浏览器,如果想要浏览器显示,需要在launch 函数中设置参数 “headless =False”,程序运行结束后在同一目录下会出现截取到的网页图片:
  遇到的错误
  1)pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close
  控制访问指定 url 之后 await page.goto(url),会遇到上面的错误,如果这时候使用了 sleep 之类的延时也会出现这个错误或者类似的 time out。 
  这个问题是 puppeteer 的 bug,但是对方已经修复了,而 pyppeteer 迟迟没更新,就只能靠自己了,搜了很多人的文章,例如:https://github.com/miyakogi/pyppeteer/issues/171 ,但是我按照这个并没有成功。也有人增加一个函数,但调用这个参数依然没解决问题。
  async def scroll_page(page):
      cur_dist = 0
      height = await page.evaluate("() => document.body.scrollHeight")
      while True:
          if cur_dist < height:
              await page.evaluate("window.scrollBy(0, 500);")
              await asyncio.sleep(0.1)
              cur_dist += 500
          else:
              break
  可以把 python 第三方库 websockets 版本 7.0 改为 6.0 就可以了,亲测可用。
  pip uninstall websockets #卸载websockets
  pip install websockets6.0
  或者
  pip install websockets6.0 --force-reinstall #指定安装6.0版本
  2)chromium浏览器多开页面卡死问题。
  解决这个问题的方法就是浏览器初始化的时候添加'dumpio':True。
  # 启动 pyppeteer 属于内存中实现交互的模拟器
  browser = await launch({'headless': False, 'args': ['--no-sandbox'], 'dumpio': True})
  3)浏览器窗口很大,内容显示很小。
  需要设置浏览器显示大小,默认就是无法正常显示。可以看到页面左侧右侧都是空白,网站内容并没有完整铺满chrome。
  # Pyppeteer 支持字典 和 关键字传参,Puppeteer 只支持字典传参。
  # 这里使用字典传参
  browser = await launch(
      {
          'headless': False, 
          'dumpio': True, 
          'autoClose': False, 
          'args': [
              '--no-sandbox', 
              '--window-size=1366,850'
          ]
      }
  )
  await page.setViewport({'width': 1366, 'height': 768})
  通过上面设置Windows-size和Viewport大小来实现网页完整显示。
  但是对于那种向下无限加载的长网页这种情况如果浏览器是可见状态会显示不全,针对这种情况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了。
  Pyppeteer 和 Puppeteer 的 不同点:
  · Pyppeteer支持字典和关键字传参,Puppeteer只支持字典传参
  # Puppeteer只支持字典传参
  browser = await launch({'headless': True})

  # Pyppeteer支持字典和关键字传参
  browser = await launch({'headless': True})
  browser = await launch(headless=True)

  · 元素选择器方法名 $变为querySelector
  # Puppeteer使用$符
  Page.$()/Page.$$()/Page.$x()

  # Pyppeteer使用Python风格的函数名
  Page.querySelector()/Page.querySelectorAll()/Page.xpath()
  # 简写方式为:
  Page.J(), Page.JJ(), and Page.Jx()
  · Page.evaluate() 和 Page.querySelectorEval()的参数
  Puppeteer的evaluate()方法使用JavaScript原生函数或JavaScript表达式字符串。Pyppeteer的evaluate()方法只使用JavaScript字符串,该字符串可以是函数也可以是表达式,Pyppeteer会进行自动判断。但有时会判断错误,如果字符串被判断成了函数,并且报错,可以添加选项force_expr=True,强制Pyppeteer作为表达式处理。
  获取页面内容:
  content = await page.evaluate('document.body.textContent', force_expr=True)
  获取元素的内部文字:
  element = await page.querySelector('h1')
  title = await page.evaluate('(element) => element.textContent', element)

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号