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


     

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

     

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

    1、同步写法:

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

     

    2、异步写法:

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

     

    同步和异步写法对比

    1、同步的优点:

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

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

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

    2、异步的优点:

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

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

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

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

    3、区别

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

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

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

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

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

    4、总结

    • 小任务用同步

    • 长时间IO任务用异步

    • 高并发系统用异步

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

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

     

    写一个自动化测试脚本

    1、示例脚本

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

    复制代码
     1 import re
     2 from playwright.sync_api import Page, expect, sync_playwright
     3 
     4 proxy = {'server': 'http://127.0.0.1:8080'}
     5 
     6 
     7 def test_baidu():
     8     with sync_playwright() as p:
     9         browser = p.chromium.launch(headless=False, proxy=proxy)
    10         page = browser.new_page()
    11         # 跳转到baidu页面
    12         page.goto("https://www.baidu.com/")
    13         # 点击输入框
    14         page.locator("#kw").click()
    15         # 输入框输入selenium
    16         page.locator("#kw").fill("selenium")
    17         # 点击百度一下查询按钮
    18         page.get_by_role("button", name="百度一下").click()
    19         # 验证输入框是否输入selenium
    20         expect(page.locator("#kw")).to_have_value("selenium")
    21         # 验证页面是否包含文本“大家还在搜”
    22         expect(page.locator("#content_left")).to_contain_text("大家还在搜")
    23         # 退出浏览器
    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 import pytest
     2 from playwright.sync_api import Page, expect, sync_playwright
     3 
     4 
     5 @pytest.fixture(scope="function", autouse=True)
     6 def before_each_after_each(page: Page):
     7     print("before the test runs")
     8 
     9     page.goto("https://www.baidu.com/")
    10     yield
    11 
    12     print("after the test runs")
    13 
    14 
    15 def test_main_navigation(page: Page):
    16     page.locator("#kw").fill("万物皆可连 博客园")
    17     page.get_by_role("button", name="百度一下").click()
    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 的环境下执行。

     

  • 相关阅读:
    荣耀主题设计师邀请有礼
    科技论文网站:中国科技论文在线
    FC-TSGAS-1624 CP451-10 MVI56E-MNETC IC697CMM742
    mysql锁机制
    后端 | 如何卸载 setup.py 安装 python 包 | Python
    C++ Day5
    Thymeleaf模板
    复盘-----vue
    QTableView练习实践00
    K8s自我探索实践心得
  • 原文地址:https://www.cnblogs.com/zhuuque23/p/18267852