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

news2024/10/6 5:58:54

 

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

 

在 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 的环境下执行。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1862655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18.枚举

学习知识:枚举类型、相关的使用方法 Main.java: public class Main {public static void main(String[] args) {myenum[] colorlist myenum.values();//获取枚举中所有对象的引用数组for (myenum one : colorlist){System.out.println(one.toString(…

fork 是一个创建新进程的系统调用

在计算机科学中,fork 是一个创建新进程的系统调用。具体来说,fork 调用会创建一个与当前进程几乎完全相同的副本,包括父进程的内存布局、环境变量、打开的文件描述符等。这个新的进程被称为子进程,而原始进程被称为父进程。 以下…

汇聚荣做拼多多电商怎么运营?

在探讨如何有效运营拼多多电商平台时,我们需要首先明确一个核心问题:如何在竞争激烈的市场中突出重围,吸引并留住消费者。接下来,我们将从五个方面深入剖析这一核心内容,确保每一步都精准有效,以白话文的形…

ATFX汇市:加拿大5月CPI数据来袭,USDCAD逼近关键点位

ATFX汇市:今日20:30,加拿大统计局将公布5月未季调CPI年率,前值为2.7%,预期值2.6%,预期将下降0.1个百分点;同一时间公布的还有加拿大5月核心CPI年率,前值为1.6%,低于2%的温和通胀标准…

【Chapter7】虚拟存储系统,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc]零、前言一、外存资源管理1.1 外存空间划分1.2 外存空间分配1.2.1 空闲块链(慢)1.2.2 空闲块表(UNIX)1.2.3 字位映像图 1.3 进程与外存对应关系 二、虚拟页式存储系统2.1 基本原理2.2 内存页框分配策略2.3 外存块的分配策略2.4 页面调入时机2.5 置换算法2.5.1 最…

Transformer的诞生和崛起

智能问答与文本生成:Transformer模型的超能力 ©作者|wy 来源|神州问学 一、引言 NLP(自然语言处理)作为人工智能领域的一个重要分支,致力于使计算机能够理解和处理人类语言。随着互联网的发展和信息时代的到来,…

docker 容器设置中文环境

1.容器中安装和设置 1.1.进入容器查看已有语言包 locale -a 默认情况下: 1.2 安装中文语言环境 如果没有zh_CN.utf8就安装。 方式1: #直接安装中文语言包 apt-get install -y language-pack-zh-hans 方式2: #安装中文语言环境 apt-g…

系统初始化进程与文件、systemd概述、单元类型、切换运行级别、查看系统默认默认运行、永久切换、常见的系统服务(centos)

init进程 init进程是Linux系统(“/sbin/init”)中的第一个进程,它是所有其他进程的祖先进程。init进程的进程号(PID)始终为1。它负责启动和停止系统中的所有其他进程,以及处理系统的各种系统级任务。 ini…

大模型系列之被我忽视的Assistants API

前言 在这篇文章中,我们提到在GPT4.0 turbo发布时,GPTs和Assistants API的出现使得众多创业者一夜无眠。当时看完之后就被我丢到一边,并没有太多关注,随着我们对RAG和Agent的不断深入了解,蓦然回首,越发感…

HarmonyOS Next开发学习手册——通过startAbility拉起文件处理类应用

使用场景 开发者可以通过调用startAbility接口,由系统从已安装的应用中寻找符合要求的应用来实现打开特定文件的意图,例如:浏览器下应用下载PDF文件,可以调用此接口选择文件处理应用打开此PDF文件。开发者需要在请求中设置待打开…

Redis-实战篇-什么是缓存-添加redis缓存

文章目录 1、什么是缓存2、添加商户缓存3、前端接口4、ShopController.java5、ShopServiceImpl.java6、RedisConstants.java7、查看Redis Desktop Manager 1、什么是缓存 缓存就是数据交换的缓冲区(称为Cache),是存贮数据的临时地方&#xff…

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

Linux 异步 I/O 框架 io_uring 前言Linux I/O 系统调用演进io_uring与 Linux AIO 的不同原理及核心数据结构:SQ/CQ/SQE/CQE带来的好处三种工作模式io_uring 系统调用 API 前言 io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架,能显著…

【干货】Jupyter Lab操作文档

Jupyter Lab操作文档1. 使用须知2. 定制化Jupyter设置主题显示代码行数设置语言更多设置 3. 认识Jupyter界面4. 初用Jupyter运行调试格式化查看源码 5. 使用Jupyter Terminal6. 使用Jupyter Markdown7. 上传下载文件(云服务器中的Jupyter Lab)上传文件到…

SAP的RFID

射频识别 (RFID) 避免了条码扫描的局限性,条码扫描需要对每个条码进行视线访问,并且一次只能用于扫描一个项目。 一次扫描一个标签可能会令人厌烦和压力大,这会增加人为错误的机会。相反,RFID 标签不需要直…

入局AI手机 苹果公布Apple Intelligence

日前,苹果WWDC 2024如期召开。在这持续1个小时44分钟的开发者大会上,苹果在前一个小时里更新了iOS、iPadOS、MacOS等操作系统,而且还首次更新了visionOS。余下的时间全部留给了苹果的“AI大礼包”——Apple Intelligence(苹果智能…

全网最强SpringMVC教程 | 万字长文爆肝SpringMVC(一)

SpringMVC_day01 今日内容 理解SpringMVC相关概念完成SpringMVC的入门案例学会使用PostMan工具发送请求和数据掌握SpringMVC如何接收请求、数据和响应结果掌握RESTful风格及其使用完成基于RESTful的案例编写 SpringMVC是隶属于Spring框架的一部分,主要是用来进行We…

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项…

Ollama模型部署工具在Linux平台的部署

1.新建普通用户dmx(可选) [rootnode3 ~]$ useradd dmx2.切换普通用户dmx环境(可选) [dmxnode3 ~]$ su - dmx3.下载ollama-linux-amd64服务 下载ollama-linux-amd64到 ~/server目录,并将ollama-linux-amd64服务重命名为ollamaEED curl -L …

07 - matlab m_map地学绘图工具基础函数 - 绘制等高线

07 - matlab m_map地学绘图工具基础函数 - 绘制等高线 0. 引言1. 关于绘制m_contour2. 关于绘制m_contourf3. 关于绘制m_elev4. 结语 0. 引言 本篇介绍下m_map中添加绘制等高线的一系列函数及其用法,主要函数包括m_elev、m_contour、m_contourf还有一些函数也和绘制…