c#抓取网页数据(微软公司支持Python语言的自动化工具介绍及项目实战项目介绍 )
优采云 发布时间: 2022-04-07 00:13c#抓取网页数据(微软公司支持Python语言的自动化工具介绍及项目实战项目介绍
)
工具介绍
Playwright 是微软公司开发的一款非常强大的开源自动化测试工具。它之所以强大,原因如下:
1. 支持所有主流浏览器:Chrome、Firefox、Safari、MS Edge。
2. 支持无头和有头模式。
3. 提供可与 Pytest 结合使用的同步和异步 API。
4. 支持在浏览器端自动录制脚本。
5. Python 语言的自动化工具。
6. 支持的操作系统有 Linux、Mac OS 和 Windows。
7.可以使用docker安装运行环境。
安装环境
1.安装Python,Playwright需要3.7及以上Python,所以至少Python3.7或以上(最好3.7,我试过3.@ >8 存在兼容性问题)。
2.去下载项目代码,主要是local_requirements.txt。
3. 使用 pip3 install playwright==1.8.0a1(最好在此处指定版本)。
4. 使用 pip3 install -r local_requirements.txt 安装所有依赖项。
5. 使用python3 -m playwright install 安装浏览器驱动模块(使用清华镜像)。
这里在命令窗口运行:pip3 -v config list 查看系统中的pip.ini文件,下面是我的。
[全局]
index-url=
#index-url=
#[安装]
#trusted-host=
这里需要把阿里云注释掉,最好白天或者早上安装这个,会更快。其他时候用阿里云的镜像会更快。
6. 检查是否安装成功。如果看到如下界面,则说明安装成功。
脚本录制
Playwright 的脚本录制需要使用命令 codegen。下面详细解释该命令的用法:
该命令需要的参数如下:
o 或 --output 指定保存脚本的文件路径和文件名。
target指定生成脚本的语言:Python、JavaScript、C#等
b指定用于录制的浏览器:如:-b chromium(Chrome浏览器)、-b firefox、-b webkit。
项目实战
项目:在线商店
1、脚本录制
python3 -m playwright codegen -o 'login_b2c.py' --target python -b chromium :8080/b2c/index.html
以上是命令执行后进入的界面。当鼠标在元素上滑动时,会自动提示元素的xpath,并启动隐身浏览模式,便于与本地浏览的页面区分开来。
点击登录链接,会弹出如下图:
输入必要的信息以登录。
登录成功,返回首页,注意红框,这里是断言目标。
关闭浏览器,输出脚本文件:这里可以看到我们的脚本文件就是命令中指定的文件名,右边是脚本文件代码,这里使用的是同步方式。源码如下:
从剧作家导入sync_playwright
def run(剧作家):
浏览器 = playwright.chromium.launch(headless=False)
上下文 = browser.newContext()
#打开新页面
page = context.newPage()
# 转到:8080/b2c/index.html
page.goto(":8080/b2c/index.html")
# 点击文字=/.*登录.*/
page.click("text=/.*login.*/")
# assert page.url == ":8080/b2c/login.html"
#点击输入[name="username"]
page.click("input[name=\"username\"]")
# 填写输入[name="username"]
page.fill("input[name=\"username\"]", "tester")
#按回车
page.press("input[name=\"username\"]", "Enter")
#点击输入[name="password"]
page.click("input[name=\"password\"]")
# 填写输入[name="password"]
page.fill("input[name=\"password\"]", "123456")
#点击输入[name="validcode"]
page.click("input[name=\"validcode\"]")
# 填写输入[name="validcode"]
page.fill("input[name=\"validcode\"]", "1111")
#点击输入[type="button"]
# with page.expect_navigation(url=":8080/b2c/index.html"):
使用 page.expect_navigation():
page.click("input[type=\"button\"]")
page.close()
# ---------
context.close()
browser.close()
以sync_playwright() 为编剧:
运行(剧作家)
在这个录制的脚本中发现了以下问题:
1)Playwright开始搭建浏览器,这里使用chromium,然后使用浏览器实例化一个context对象context,再通过context实例化一个page对象,也就是使用context.newPage()可以实例化多个页面,并且页面之间不共享会话和 cookie。
2)页面可以通过定位器来定位页面上的各种元素,所以要想用好Playwright,就必须好好研究一下页面对象。
3)缺点是 Playwright 在录制过程中不提供断言。虽然有很多内置的断言方法,但只能手动编写。
4)需要参数化。好在Playwright集成了pytest功能,我们要好好利用一下。
2. 集成pytest和Playwright
经过研究,发现Playwright不具备参数化自身的能力。如果要参数化,仍然需要编写代码来赋值。在这里,考虑与 pytest 结合使用。使用pytest的参数化和fixture可以充分实现参数化和关联的效果。
代码说明:
#coding=utf-8
从 playwright.sync_api 导入页面
导入 pytest
#这里构造测试用例需要的数据,第一个是用户名,第二个是密码,第三个是预期结果
data=[['tester','123456','Hello: tester'],['tester1','123456','Hello: tester1'],['tester2','1234567',' 账号错误密码']]
# 使用 pytest.mark.parametrize 导入用户数据
@pytest.mark.parametrize('userdata',data)
#测试函数的第一个参数是指playwright提供的Page,是一个fixture,需要安装
#pytest-playwright
def test_login(page:Page,userdata):
page.goto(":8080/b2c/index.html")
# 点击文字=/.*登录.*/
page.click("text=/.*login.*/")
# assert page.url == ":8080/b2c/login.html"
#点击输入[name="username"]
page.click("input[name=\"username\"]")
# 填写输入[name="username"]
# page.fill("input[name=\"username\"]", "tester")
page.fill("input[name=\"username\"]", userdata[0])
#按回车
page.press("input[name=\"username\"]", "Enter")
#点击输入[name="password"]
page.click("input[name=\"password\"]")
# 填写输入[name="password"]
page.fill("input[name=\"password\"]", userdata[1])
#点击输入[name="validcode"]
page.click("input[name=\"validcode\"]")
# 填写输入[name="validcode"]
page.fill("input[name=\"validcode\"]", "1111")
#点击输入[type="button"]
#因为页面需要转换,这里需要主动等待1秒。这个wait_for_timeout的单位是毫秒
page.wait_for_timeout(1000)
page.click("input[type=\"button\"]")
#页面刷新很慢,这里我设置了3秒等待
page.wait_for_timeout(3000)
# 断言,这里为了简单起见使用了 in 方法。 playwright提供了很多assert断言方法
#你可以阅读官方文档:
在 page.content() 中断言 userdata[2]
#关闭页面
page.close()
如果 __name__ == '__main__':
#使用pytest.main运行测试,--headful是带接口运行,删除,就是无头模式
#这里可以看出playwright的head表示启动浏览器,headless模式表示浏览器没有运行
pytest.main(['-v','login_b2c.py','--headful'])
试运行结果:
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/huminghai/dev/py_pro/demo/login_b2c.py
========================测试会话开始==================== =
平台 darwin -- Python 3.7.1, pytest-6.1.0, py-1.10.0, 插件-0.13.1 -- /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
缓存目录:.pytest_cache
rootdir: /Users/huminghai/dev/py_pro/demo
插件:base-url-1.4.2,sugar-0.9.4,flaky-3.7.0,xdist -2.1.0, cov-2.10.1, asyncio-0.14.0, 编剧-0. 0.11,超时-1.4.2,分叉-1.3.0
正在采集...采集了 3 件物品
login_b2c.py::test_login[chromium-userdata0] 通过 [33%]
login_b2c.py::test_login[chromium-userdata1] 通过 [66%]
login_b2c.py::test_login[chromium-userdata2] 通过 [100%]
========================= 3传入41.42s ============= = ======
进程以退出代码 0 结束
总结
Playwright-python的优势非常突出,在脚本录制上非常方便,元素捕捉非常准确,比webdriver好。最重要的是playwright-python和pytest真的可以为所欲为。
pytest 提供了报表模块和各种有用的插件,而 Playwright-python 提供了界面元素的精确定位和抓取。两者的结合让 UI 自动化测试的未来更加光明。
另外,不要相信Playwright-python所谓的无编码自动化。这是不太可能的。毕竟,无论你如何记录脚本,参数化、关联和断言三件套总是必不可少的。因此,学习 Python 是唯一的方法。良好自动化测试的基础。
请关注+私信回复:“测试”,即可免费获得软件测试学习资料,同时进入群学习交流~~