自动化Playwright专题汇总

2023-10-27


序言

  • Playwright是一个强大的Python库,仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作。
  • Playwright提供的自动化技术是绿色的、功能强大、可靠且快速,支持Linux、Mac及Windows操作系统。
  • 支持各种编程语言,例如Node.js、Python、Java和.NET。主要使用的是Playwright for Python。支持两种通信方式:同步和异步async。
  • Playwright for Python:https://playwright.dev/python/docs/intro
    ​ https://playwright.dev/python/docs/api/class-playwright

一、特性

1.测试和自动化框架

  • 实现网络浏览器的自动化交互。
  • 文档内容非常详细,覆盖面广。

2.支持所有主流浏览器

  • 支持所有主流浏览器:例如Google Chrome、Firefox、使用Chromium内核的Microsoft Edge和使用WebKit内核的Safari,不支持IE11
  • 跨平台:Windows、Linux 和macOS。
  • 跨浏览器的网络自动化,相同的代码可以在所有支撑的浏览器上有效地执行。
  • 可用于模拟移动端WEB应用的测试,不支持在真机上测试。
  • 支持无头模式(默认)和有头模式:

3.快速可靠的执行

  • 自动等待API。浏览器交互遵循[auto-wait for elements],提高了可靠性并简化测试编写。
  • 免超时自动化。Playwright接收浏览器信号,如网络请求、页面导航和页面加载事件,以消除睡眠超时需求。
  • 使用浏览器上下文进行隔离并行化。为多个并行化的隔离执行环境重用一个浏览器实例browser contexts。
  • 弹性元素选择器。Playwright可以依靠面向用户的字符串,如文本内容和可访问性标签来select elements。

4.强大的自动化功能

  • 多域、多页面、多框架。Playwright是一个流程外的自动化驱动,它不受页面内JavaScript执行范围的限制,可以自动处理多页面等场景。
  • 强大的网络控制。Playwright引入上下文范围内的网络拦截来存根和模拟网络请求。
  • 覆盖所有场景的能力。支持file downloads、uploads、input events、video、screenshot。

5.自动化工具对比在这里插入图片描述

二、安装

	pip install playwright==版本号
	playwright install # 安装支持的浏览器:cr:chromium, ff:firefox, wk 和 webkit
	playwright install chromium # 安装指定的chromium浏览器

安装时会自动下载浏览器依赖,windows系统在%USERPROFILE%\AppData\Local\ms-playwright 路径下。

1.命令行工具

命令行窗口使用如下语法格式进行脚本录制:

	python -m playwright codegen [options] [url]

options参数:

  • -o, --output <file name> :保存生成脚本

  • --target <language> :生成的脚本语言,可以设置javascript, test, python, python-async和csharp,默认为python。

  • -b, --browser <browserType> :要使用的浏览器,可以选择cr, chromium, ff, firefox, wk和webkit,默认chromium。

  • --channel <channel>:chromium版本,比如chrome, chrome-beta, msedge-dev等,

  • --color-scheme <scheme>:模拟器的颜色主题,可选择light 或者 dark样式。

  • --device <deviceName> :模拟的设备,比如iPhone 11。

  • --save-storage <filename> :保存上下文状态,用于保存cookies 和localStorage,可用它来实现重用。例如playwright codegen --save-storage=auth.json

  • --load-storage <filename> :加载--save-storage 保存的数据,重用认证数据。

  • --proxy-server <proxy> :指定代理服务器

  • --timezone <time zone> : 指定时区

  • --geolocation <coordinates> :指定地理位置坐标

  • --lang <language> :指定语言/地区,比如中国大陆:zh-CN

  • --timeout <timeout> :超时时间,定位毫秒,默认10000ms

  • --user-agent <ua string> :用户代理

  • --viewport-size <size> :浏览器窗口大小

  • -h, --help :查看帮助信息
    样例:
    python -m playwright codegen -o D:\my.py -b chromium --viewport-size 1200,900 https://www.baidu.com/

三、模块构成模块构成

四、关键内容点

1.元素选择器selector

  • Playwright 可以使用 CSS 选择器、XPath 选择器、HTML 属性(如,data-test-id甚至文本内容)来搜索元素。可以使用分隔符>>组合使用相同或不同引擎的选择器。

css 选择器

CSS (Cascading Style Sheets)是一种样式表语言,是所有浏览器内置的,用于描述以HTML或XML编写的文档的外观和样式。
css是默认引擎 - 任何不以引号//开头和结尾的格式的选择器假定为 css 选择器。例如 page.$(‘span > button’)
常见实例:

	#<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" \
	#autocomplete="off">
    #1.标签选择器,元素不唯一
    _elements = page.query_selector_all('input', '武汉')
    #2.id选择器
    page.fill('#kw', '武汉')    或  page.fill('id=kw', '武汉')  
    #3.class选择器
    page.fill('.s_ipt', '武汉') 或  page.fill('class=kw', '武汉')
    #4.属性选择器,格式:[属性="值">],可进行子字符串匹配,如:^= 匹配前缀、$= 匹配后缀、
    #*= 包含某个字符串
    page.fill('[id="kw"]', "武汉")
    page.fill('[class="s_ipt"]', "武汉")
    page.fill('[name="wd"]', "武汉")
    #5组合[标签选择器+属性选择器],格式:标签[属性=值>]
    page.fill('input[name=wd]', '武汉')

CSS_Selectors

Xpath选择器

XPath是XML路径语言,是一种查询语言,使用路径表达式浏览XML文档中的元素和属性。
​ 以引号//开头的格式选择器被假定为xpath选择器。例如 page.$(‘//html/body’)`
XPath标准语法:Xpath=//tagname[@attribute=‘value’]
​ // : 选择当前节点
​ Tagname: 节点标签名(如input、text、button、table、tbody、ul、li等Dom标签元素名)
​ @: 选择属性 Attribute: 节点属性名 Value: 属性值
​ 常见函数:

  • contains(): 是否包含对应的值
  • starts-with(): 是否以某种字符串开始
  • ends-with(): 是否以某种字符串结束
  • last(): 列表/集合类元素的最后一个值
  • text(): 一个节点的文本值
	#<a target="_self" href="http://www.baidu.com">百度一下</a>
	page.click('//a[text()="click here"]')

常见实例:

	#<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100"
	# autocomplete="off">
    #<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">
    page.fill('//*[@id="kw"]','武汉')
    page.fill('//input[@name="wd" and @type="text"]','武汉')  
    # ‘and’ 、 ‘or’ 、‘not’ 连接 和 != 
    #page.fill('//input[@id="kw"]','武汉')
    #page.fill('//input[@name="wd"]','武汉')   
    #page.fill('//input[@class="s_ipt"]','武汉')
    page.click('//input[@id="su"]')

文本选择器

  • 文本选择器按照页面显示出的文本定位元素。
	 #<span class="title-content-title">中国夏粮实现增产丰收</span>
    _text_content = page.query_selector('text="中国夏粮实现增产丰收"').text_content()
    #或_text_content = page.query_selector('"中国夏粮实现增产丰收').text_content()
    assert _text_content == "中国夏粮实现增产丰收"

总结:
​ XPath通过遍历的方式从XML文档中选择节点,CSS Selector是一种匹配模式定位,CSS Selector比 XPath 执行效率高。

2.可操作性

Playwright 在执行某些操作之前会对元素进行一系列可操作性检查,确保操作按预期运行,例如不会单击禁用的按钮。
​ Playwright 会等到所有相关的可操作性检查都通过后才执行操作。如果检查未在指定的范围内通过,操作将失败Timeout,抛出TimeoutError
​ 某些操作(如page.click()支持{force: true}选项)禁用非必要的可操作性检查,例如传递{force: true}click()方法将不会检查目标元素是否实际接收到点击事件。
​ 例如clickfill自动等待元素可见和可操作之类的操作,单击后将:

  • 等待具有给定选择器的元素出现在 DOM 中-[Attached:随附]
  • 等待它变得可见-[visible]:有非空边界框并且没有visibility:hidden
  • 等待它稳定-[stable]:例如等到 css 转换完成
  • 等待它在动作点接收指针事件-[Receives Events]:例如 等到元素变得不被其他元素遮挡
  • 元素已启用-[Enabled]
  • 如果在上述任何检查期间元素分离,重试
	// Playwright waits for #search element to be in the DOM
	page.fill('#search', 'query');
	// Playwright waits for element to stable and accept clicks Events.
	page.click('#search');

您可以显式地等待元素出现在 DOM 中或变得可见:

	// Wait for #search to appear in the DOM.
	page.wait_for_selector('#search', { state: 'attached' });
	// Wait for #promo to become visible, for example with `visibility:visible`.
	page.wait_for_selector('#promo');

常见方法操作执行的可操作性检查的完整列表:
在这里插入图片描述在这里插入图片描述

随附的-Attached

  • 当元素连接到 Document 或 ShadowRoot时,它被认为是附加的。

可见的-visible

  • 当元素具有非空边界框并且没有visibility:hidden计算样式时,元素被认为是可见的。像样式大小为零或元素display:none为不可见。

稳定的-stable

  • 当元素在至少两个连续的动画帧中保持相同的边界框时,元素被认为是稳定的。

接收事件-Receives Events]

  • 当元素在动作点是指针事件的命中目标时,被认为接收指针事件。

启用-Enabled

  • 当元素不是<input><textarea>具有disabled属性 或 <button>,<select>时,它被认为是启用的。

可编辑

  • 当元素没有readonly设置属性时,它被认为是可编辑的。

网页加载过程

页面加载需要时间通过网络检索响应正文、解析、执行脚本和触发事件。典型的负载场景会经历以下负载状态:

  • page.url() 设置为新网址
  • 文档内容通过网络加载并解析
  • domcontentloaded 事件被触发
  • 页面执行一些脚本并加载样式表和图像等资源
  • load 事件被触发
  • 页面执行动态加载的脚本
  • networkidle - 至少500ms没有新的网络请求,发送网络ajax等请求
    常见场景(隐式加载处理):
	page.goto('http://example.com');
	// If the page does a client-side redirect to 'http://example.com/login'.
	// Playwright will automatically wait for the login page to load.
	// Playwright waits for the lazy loaded #username and #password inputs 
	# to appear before 		filling the values.
	page.fill('#username', 'John Doe');
	page.fill('#password', '********');
	// Playwright waits for the login button to become enabled and clicks it.
	page.click('text=Login');
	// Clicking the button navigates to the logged-in page and 
	# Playwright automatically waits for that.

加载弹出窗口(显式加载处理)场景:

	const [ popup ] = Promise.all([
  	page.wait_for_event('popup'),
  	page.click('a[target="_blank"]'),  // <-- opens popup
	]);
	popup.wait_for_load_state('load');

常见显式等待加载api:

	page.wait_for_event(event, **kwargs)
	page.wait_for_function(expression, **kwargs)
	page.wait_for_load_state(**kwargs)
	page.wait_for_selector(selector, **kwargs)   #等待元素出现
	page.wait_for_timeout(timeout)
	Page.click(selector, **kwargs)               #no_wait_after:false

五、playwright Robot Framework(RF测试架构)

​ robot framework 管理和编写测试用例,robotframework-browser测试库。

安装: 
	wxPython:https://sourceforge.net/projects/wxpython/files/wxPython/2.8.12.1/ 
	下载exe安装包
	pip install robotframwork
	pip install robotframework-ride  #安装图形编辑器,基于wxPython
启动:python %Python%\Scripts\ride.py

robotframework-browser api说明文档

六、问题&解决方案

​ 1.初始化Sync的playwright的实例 with 写法:

	from playwright.sync_api import sync_playwright
	with sync_playwright() as p:
   		 for browser_type in [p.chromium, p.firefox, p.webkit]:
        	browser = browser_type.launch()
       		 ...

初始化一个全局的playwright的实例,供后续使用:

	p = sync_playwright().start()

代码实现如下:
在这里插入图片描述
在这里插入图片描述

七、技术网站

RPA 之家:https://www.rpazj.com/
程序员福利网: https://www.coderfuli.com/#/home
开源中国社区:https://www.oschina.net/
开源 软件:https://gitee.com/explore/new-tech
w3schools英文官网: https://www.w3schools.com/
w3cschool官网(中文):https://www.w3cschool.cn/dict/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动化Playwright专题汇总 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐