c#抓取网页数据(微软公司支持Python语言的自动化工具介绍及项目实战项目介绍 )

优采云 发布时间: 2022-04-07 00:13

  c#抓取网页数据(微软公司支持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 是唯一的方法。良好自动化测试的基础。

  请关注+私信回复:“测试”,即可免费获得软件测试学习资料,同时进入群学习交流~~

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线