【Playwright+Python】手把手带你写一个自动化测试脚本

玛卡巴卡的卡巴卡玛  金牌会员 | 2024-6-25 19:15:23 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 896|帖子 896|积分 2688


 
 怎样使用署理方式打开网页

 
在 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 的情况下实行。


 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表