首页 > 编程语言 >【Playwright+Python】手把手带你写一个自动化测试脚本

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

时间:2024-07-14 20:41:31浏览次数:16  
标签:异步 Playwright Python 手把手 locator playwright expect page proxy

 


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

 

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

1、同步写法:

from playwright.sync_api import sync_playwright
 
proxy = {'server': 'http:/127.0.0.1:8080'}
 
 
def run():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False, proxy=proxy)
        page = browser.new_page()
 
        page.goto('https://www.baidu.com')
 
        title = page.title()
        if "百度" in title:
            print("打开百度成功")
        else:
            print("打开百度失败")
 
        browser.close()
 
 
run()

 

2、异步写法:

from playwright.async_api import async_playwright
import asyncio
 
proxy = {'server': 'http:/127.0.0.1:8080'}
 
 
async def run():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False, proxy=proxy)
        page = await browser.new_page()
 
        await page.goto('https://www.baidu.com')
 
        title = await page.title()
        if "百度" in title:
            print("打开百度成功")
        else:
            print("打开百度失败")
 
        await browser.close()
 
 
asyncio.get_event_loop().run_until_complete(run())

 

同步和异步写法对比


1、同步的优点:

  • 代码结构简单易懂,不需要学习async/await语法
  • 适用于小规模或简单任务
  • 调试和理解同步代码更简单

2、异步的优点:

  • 能更高效地利用系统资源,避免阻塞等待IO
  • 对于长时间操作如网络请求更高效
  • 可以支持并发执行多个任务
  • 对于大规模和复杂系统更有利

3、区别

  • 对于小任务和学习用途,同步代码结构更简单。
  • 对于需要长时间IO等待的任务(如网络请求),使用异步可以更高效。
  • 对于需要支持高并发的系统(如网站),使用异步模型可以支持更多并发连接。
  • 多线程同步会带来锁的问题,而异步避免了锁的使用。
  • 异步的FUTURE模式也更易于扩展性好,支持动态增加回调函数。

4、总结

  • 小任务用同步
  • 长时间IO任务用异步
  • 高并发系统用异步
  • 以后的功能扩展考虑异步更灵活

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

 

写一个自动化测试脚本

 

 

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

import re
from playwright.sync_api import Page, expect, sync_playwright
 
proxy = {'server': 'http://127.0.0.1:8080'}
 
 
def test_baidu():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False, proxy=proxy)
        page = browser.new_page()
        # 跳转到baidu页面
        page.goto("https://www.baidu.com/")
        # 点击输入框
        page.locator("#kw").click()
        # 输入框输入selenium
        page.locator("#kw").fill("selenium")
        # 点击百度一下查询按钮
        page.get_by_role("button", name="百度一下").click()
        # 验证输入框是否输入selenium
        expect(page.locator("#kw")).to_have_value("selenium")
        # 验证页面是否包含文本“大家还在搜”
        expect(page.locator("#content_left")).to_contain_text("大家还在搜")
        # 退出浏览器
        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夹具的使用
示例代码:

import pytest
from playwright.sync_api import Page, expect, sync_playwright
 
 
@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):
    print("before the test runs")
 
    page.goto("https://www.baidu.com/")
    yield
 
    print("after the test runs")
 
 
def test_main_navigation(page: Page):
    page.locator("#kw").fill("万物皆可连 博客园")
    page.get_by_role("button", name="百度一下").click()
    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 的环境下执行。


 

标签:异步,Playwright,Python,手把手,locator,playwright,expect,page,proxy
From: https://www.cnblogs.com/zhuuque23/p/18301976

相关文章

  • Python爬虫教程第二篇:进阶技巧与实战案例
    Python爬虫教程第二篇:进阶技巧与实战案例在上一篇教程中,我们学习了Python爬虫的基础概念、基本流程以及一个简单的入门实践案例。本篇教程将带领大家进一步探索Python爬虫的进阶技巧,并提供一个实战案例,帮助大家提升爬虫技能。一、进阶技巧处理JavaScript渲染的页面在We......
  • 教你创建Python函数信手拈来哦(递归函数)
    Python中函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段函数能提高应用的模块性,和代码的重复利用率Python提供了许多内建函数,比如print()、type()、类型转换函数等等用户也可以自己创建函数,这被叫做用户自定义函数一、定义函数1.创建函数函数使用def关键......
  • python中缺失值处理——在因子选股中的应用
    ​在因子选股当中,如果直接对整个数据库进行操作,对于股价历史数据,经常出现由于股票退市等造成的缺失值,但是在回测时,如果只用有值的股票,会由于维度不匹配而报错。因此,经常需要把整张数据表中的非空数据取出,进行处理,再填回因子矩阵中。由于基本上每次都会用到,所以本人专门写......
  • python 66 个冷知识 0714
    66个有趣的Python冷知识生成随机浮点数random.uniform(a,b)生成区间[a,b]之间的随机浮点数。反向枚举使用reversed()和enumerate()可以反向枚举列表。单元测试装饰器unittest提供了@unittest.skip装饰器用于跳过测试。动态类型Python是动态类型语言......
  • python 基础10 requests
    requests官方文档:https://requests.readthedocs.io/projects/cn/zh-cn/latest/快速上手https://requests.readthedocs.io/projects/cn/zh-cn/latest/user/quickstart.html安装找到目标路径Scriptspipinstallrequests-ihttps://pipy.douban.com/simple发送请求简洁:im......
  • python-关于返回值return
    一.含义        "return"是编程语言中的一个关键字,通常用于函数或方法的结尾,表示将执行结果返回给调用者。        通俗讲就是一个事物反馈给你的东西。就像你一拍桌子,会返回声音和力的反作用力。二.作用1.负责函数返回值,返回一个参数或数据等。2.退出当......
  • 使用 Python 处理 Lumerical 导出的 .txt 文件(完结)
    使用Python处理Lumerical导出的.txt文件引言正文以,隔开的波长与透射率以\t隔开的波长与透射率引言之前在添加链接描述一文中我们已经介绍了如何将Lumerical仿真中的S参数相关数据导出为.txt文件。这里我们来分享如何使用Python对这些......
  • 用python生成词频云图(python实例二十一)
    目录1.认识Python2.环境与工具2.1python环境2.2VisualStudioCode编译3.词频云图3.1代码构思3.2代码实例3.3运行结果4.总结1.认识PythonPython是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语......
  • 【Python】自动化抢票脚本【某麦网】
    1.脚本介绍1.1背景介绍在这个数字化时代,演唱会、体育赛事和各种活动的门票销售往往在线上进行。由于热门活动的高需求和门票的有限供应,抢票成为了一场激烈的竞争。许多粉丝和爱好者经常因为手速不够快或网络延迟而错失购票机会。为了提高抢票的成功率,自动化抢票脚本应运......
  • Python函数(1)--自定义函数与作用域
    函数的定义Python中的函数是一段组织好的、可重复使用的、用来实现单一或相关联功能的代码块。函数能提高应用的模块性,和代码的重复可用性。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被称为用户自定义函数。自定义函数假设,我们现在求一......