经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
【Playwright+Python】手把手带你写一个自动化测试脚本
来源:cnblogs  作者:万物皆可连  时间:2024/6/26 8:53:40  对本文有异议
?

 

 如何使用代理方式打开网页

 

 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下:

1、同步写法:

  1. 1 from playwright.sync_api import sync_playwright
  2. 2
  3. 3 proxy = {'server': 'http:/127.0.0.1:8080'}
  4. 4
  5. 5
  6. 6 def run():
  7. 7     with sync_playwright() as p:
  8. 8         browser = p.chromium.launch(headless=False, proxy=proxy)
  9. 9         page = browser.new_page()
  10. 10
  11. 11         page.goto('https://www.baidu.com')
  12. 12
  13. 13         title = page.title()
  14. 14         if "百度" in title:
  15. 15             print("打开百度成功")
  16. 16         else:
  17. 17             print("打开百度失败")
  18. 18
  19. 19         browser.close()
  20. 20
  21. 21
  22. 22 run()

 

2、异步写法:

  1. 1 from playwright.async_api import async_playwright
  2. 2 import asyncio
  3. 3
  4. 4 proxy = {'server': 'http:/127.0.0.1:8080'}
  5. 5
  6. 6
  7. 7 async def run():
  8. 8 async with async_playwright() as p:
  9. 9 browser = await p.chromium.launch(headless=False, proxy=proxy)
  10. 10 page = await browser.new_page()
  11. 11
  12. 12 await page.goto('https://www.baidu.com')
  13. 13
  14. 14 title = await page.title()
  15. 15 if "百度" in title:
  16. 16 print("打开百度成功")
  17. 17 else:
  18. 18 print("打开百度失败")
  19. 19
  20. 20 await browser.close()
  21. 21
  22. 22
  23. 23 asyncio.get_event_loop().run_until_complete(run())

 

同步和异步写法对比

1、同步的优点:

  • 代码结构简单易懂,不需要学习async/await语法

  • 适用于小规模或简单任务

  • 调试和理解同步代码更简单

2、异步的优点:

  • 能更高效地利用系统资源,避免阻塞等待IO

  • 对于长时间操作如网络请求更高效

  • 可以支持并发执行多个任务

  • 对于大规模和复杂系统更有利

3、区别

  • 对于小任务和学习用途,同步代码结构更简单。

  • 对于需要长时间IO等待的任务(如网络请求),使用异步可以更高效。

  • 对于需要支持高并发的系统(如网站),使用异步模型可以支持更多并发连接。

  • 多线程同步会带来锁的问题,而异步避免了锁的使用。

  • 异步的FUTURE模式也更易于扩展性好,支持动态增加回调函数。

4、总结

  • 小任务用同步

  • 长时间IO任务用异步

  • 高并发系统用异步

  • 以后的功能扩展考虑异步更灵活

一般来说对于现代化系统,异步编程模型将是主流趋势。但同步在某些场景也同样易用。选择时要根据具体需求来权衡。

 

写一个自动化测试脚本

1、示例脚本

算是个入门的例子,关于每句话的意思,看我注释即可,示例代码如下:

  1. 1 import re
  2. 2 from playwright.sync_api import Page, expect, sync_playwright
  3. 3
  4. 4 proxy = {'server': 'http://127.0.0.1:8080'}
  5. 5
  6. 6
  7. 7 def test_baidu():
  8. 8 with sync_playwright() as p:
  9. 9 browser = p.chromium.launch(headless=False, proxy=proxy)
  10. 10 page = browser.new_page()
  11. 11 # 跳转到baidu页面
  12. 12 page.goto("https://www.baidu.com/")
  13. 13 # 点击输入框
  14. 14 page.locator("#kw").click()
  15. 15 # 输入框输入selenium
  16. 16 page.locator("#kw").fill("selenium")
  17. 17 # 点击百度一下查询按钮
  18. 18 page.get_by_role("button", name="百度一下").click()
  19. 19 # 验证输入框是否输入selenium
  20. 20 expect(page.locator("#kw")).to_have_value("selenium")
  21. 21 # 验证页面是否包含文本“大家还在搜”
  22. 22 expect(page.locator("#content_left")).to_contain_text("大家还在搜")
  23. 23 # 退出浏览器
  24. 24 browser.close()

 

注意测试类和测试方法都要用test_ 前缀命名

 

2、基本操作

这是 Playwright 常用操作列表,请注意,还有许多其他操作,请务必查看定位器 API 部分以了解更多相关信息。

操作描述
locator.check() 选中输入复选框
locator.click() 点击元素
locator.uncheck() 取消选中输入复选框
locator.hover() 将鼠标悬停在元素上
locator.fill() 填写表单字段,输入文本
locator.focus() 聚焦元素
locator.press() 按下单个键
locator.set_input_files() 选择要上传的文件
locator.select_option() 从下拉菜单中选择选项

3、断言操作

断言描述
expect(locator).to_be_checked() 复选框处于选中状态
expect(locator).to_be_enabled() 控件已启用
expect(locator).to_be_visible() 元素可见
expect(locator).to_contain_text() 元素包含文本
expect(locator).to_have_attribute() 元素具有属性
expect(locator).to_have_count() 元素列表已给出长度
expect(locator).to_have_text() 元素匹配文本
expect(locator).to_have_value() 输入元素具有值
expect(page).to_have_title() 页面有标题
expect(page).to_have_url() 页面有 URL

 

4、fixtures夹具的使用

示例代码:

  1. 1 import pytest
  2. 2 from playwright.sync_api import Page, expect, sync_playwright
  3. 3
  4. 4
  5. 5 @pytest.fixture(scope="function", autouse=True)
  6. 6 def before_each_after_each(page: Page):
  7. 7 print("before the test runs")
  8. 8
  9. 9 page.goto("https://www.baidu.com/")
  10. 10 yield
  11. 11
  12. 12 print("after the test runs")
  13. 13
  14. 14
  15. 15 def test_main_navigation(page: Page):
  16. 16 page.locator("#kw").fill("万物皆可连 博客园")
  17. 17 page.get_by_role("button", name="百度一下").click()
  18. 18 expect(page.locator("#content_left")).to_contain_text("万物皆可连 - 博客园")

 

代码解释:

  • 定义了一个名为 before_each_after_each 的 fixture(夹具),它的作用域是每个测试函数,并且设置为自动应用于每个测试函数。

  • 在这个 fixture 中:打印 "before the test runs",表示测试运行前执行的操作。使用 page.goto("https://www.baidu.com/") 打开百度首页。

  • yield 关键字在这个 fixture 运行期间挂起,等待测试函数执行。测试函数将在 fixture 的环境下执行。

?

 

原文链接:https://www.cnblogs.com/zhuuque23/p/18267852

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号