python中playwright截屏API的實現(xiàn)
1. 截屏api
Playwright提供了一個截屏的API:page.screenshot。使用該API,只需要指定截圖的圖片的保存路徑及文件名即可。如果僅指定文件名,默認(rèn)保存在當(dāng)前目錄。
參數(shù)解析:
path:保存圖像的文件路徑。截屏類型將從文件擴(kuò)展名中推斷出來。timeout:設(shè)置最長時間(以毫秒為單位)。默認(rèn)為30秒。animations:在設(shè)置為disabled時停止CSS動畫、CSS和Web動畫。默認(rèn)為allow。clip:指定結(jié)果圖像的剪輯的對象。quality:截屏分辨率的質(zhì)量,介于0-100之間。不適用于.png圖像。mask:當(dāng)截取截屏?xí)r,您可以指定應(yīng)該被遮蔽(覆蓋)的定位器。
例如
await page.screenshot({ path:`test-results/${date.toISOString()}.jpeg`,
clip:{
x:0,
y:0,
width:100,
height:100
},
quality:20,
type:'jpeg',
mask:[page.getByTestId("introduction")],
timeout:1000
});
});1.1 截圖操作
一步即可實現(xiàn)最簡單的截圖操作:
page.screenshot(path="screenshot.png")
1.2 全屏幕截圖
設(shè)置full_page=True參數(shù),可以實現(xiàn)screenshot 完整的可滾動頁面的屏幕截圖:
const { chromium }=require('playwright');
(async ()=>{
const browser = await chromium.launch();
const page = await browser.newPage();
// 設(shè)置 fullPage 選項為 true
await page.screenshot({ path:'fullpage.png', fullPage:true});
await browser.close();
})();
1.3 按元素截圖
也可以針對某個區(qū)域的界面元素截圖,方法是先定位到指定的頁面上元素,再完成screenshot操作:
page.locator(".header").screenshot(path="screenshot.png")1.4 截圖數(shù)據(jù)流
除了截圖存入文件,也可以把圖像放入緩沖區(qū),并用于后續(xù)處理
screenshot_bytes = page.screenshot() print(base64.b64encode(screenshot_bytes).decode())
1.5 指定quality
await page.screenshot({ path: ‘screenshot.jpg‘, quality: 50 });1.6 指定viewportSize
await page.setViewportSize({ width: 1280, height: 720 });
await page.screenshot({ path: ‘screenshot.png‘ });1.7 指定deviceScaleFactor
await page.screenshot({ path: ‘screenshot@2x.png‘, deviceScaleFactor: 2 });1.8 指定圖片格式為jpg
await page.screenshot({ path: ‘screenshot.jpg‘, type: ‘jpeg‘ });注意默認(rèn)為.png格式
2. 錄屏
默認(rèn)情況下,視頻錄制處于關(guān)閉off狀態(tài) 如果需要錄制測試過程視頻,只需要打開設(shè)置即可
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
video: 'on-first-retry',
},
});參數(shù)解釋如下:
'off'- 不要錄制視頻。'on'- 為每個測試錄制視頻。'retain-on-failure'- 為每個測試錄制視頻,但從成功的測試運行中刪除所有視頻。'on-first-retry'- 僅在首次重試測試時錄制視頻。
值得注意的是:視頻僅在頁面或瀏覽器上下文關(guān)閉后可用。
context = browser.newContext(record_video_dir="videos/") # 確保調(diào)用 close, videos視頻才會保存 context.close()
2.1 指定viweport大小
視頻大小默認(rèn)為縮小到適合 800x800 的視口大小。視口的視頻放置在輸出視頻的左上角,必要時會縮小以適應(yīng)。可根據(jù)需要設(shè)置視口大小以匹配所需的視頻大小,例如:
import { defineConfig }from'@playwright/test';
exportdefault defineConfig({
use:{
video:{
mode:'on-first-retry',
size:{ width:640, height:480}
}
},
});2.2 指定視頻保存路徑path
保存的視頻文件將出現(xiàn)在指定的文件夾中。
const path = await page.video().path(); console.log(path);
2.3 典型應(yīng)用場景
每個test都保留record video
const config = {
use: {
video: 'on',
},
};停止錄制
const config = {
use: {
video: {
mode: 'off',
},
};
僅錄制failed test
const config = {
use: {
video: 'retain-on-failure',
},
};
僅首次失敗錄制
const config = {
use: {
video: 'on-first-retry',
},
};打開錄制的視頻
錄制的視頻擴(kuò)展名為 .webm,可以使用任何瀏覽器打開它。視頻也附加在報告中,也可以使用瀏覽器選項保存它,方法是右鍵單擊視頻或其下方的鏈接。
小總結(jié)
無論是屏幕錄制,還是屏幕截圖,Playwright都提供了簡潔的方法實現(xiàn),對于截圖,簡單調(diào)用page.screenshot()即可,對于錄屏,則是在配置文件playwright.config.js中打開設(shè)置mode: {video: on}即可。
提到web api自動化測試,已經(jīng)有很多工具可以選擇:如基于命令行的curl,基于UI界面的postman,基于瀏覽器自帶的F12,以及在敏捷團(tuán)隊越來越流行的apifox,都可以很好地完成web api自動化測試。對于playwright來說,提供的api testing能力可以很方便地和ui testing能力結(jié)合,從而實現(xiàn)更復(fù)雜的測試驗證任務(wù)。
1.Web API介紹

Web API,即 Web Application Programming Interface,是一種用于提供 Web 服務(wù)的接口,通過 HTTP 協(xié)議進(jìn)行通信。它允許不同的應(yīng)用程序在網(wǎng)絡(luò)上進(jìn)行數(shù)據(jù)交換和通信,常見的 Web API 有下列4種: RESTful API、SOAP API、 GraphQL API、gRPC API
REST API
REST,即 Representational State Transfer,是一種基于 HTTP 協(xié)議的軟件架構(gòu)風(fēng)格,用于構(gòu)建分布式系統(tǒng)。REST API 是一種符合 REST 原則的 Web API,它使用 HTTP 方法(如 GET、POST、PUT、DELETE)來實現(xiàn)資源的增刪改查操作。
SOAP API
SOAP,即 Simple Object Access Protocol,是一種基于 XML 的通信協(xié)議,用于在分布式系統(tǒng)中進(jìn)行信息交換。SOAP API 使用 XML 格式來定義消息格式和消息協(xié)議,通常使用 HTTP 或 SMTP 協(xié)議來傳輸數(shù)據(jù)。
GraphQL API
GraphQL 是一種用于構(gòu)建 API 的查詢語言,它允許客戶端根據(jù)自身的需求來請求特定的數(shù)據(jù)。GraphQL API 提供了一個靈活的數(shù)據(jù)查詢和獲取方式,客戶端可以通過一個請求來獲取多個資源的數(shù)據(jù),從而減少網(wǎng)絡(luò)傳輸量和提高數(shù)據(jù)獲取效率。
gRPC API
gRPC 是一種高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架,它使用 Protocol Buffers(protobuf)作為接口定義語言(IDL),支持多種編程語言和平臺。gRPC API 提供了一種簡單而強(qiáng)大的方法來定義服務(wù)接口和方法,并在客戶端和服務(wù)器之間進(jìn)行通信。
下列表格總結(jié)了他們的主要特點:
Web API類型 | 主要貢獻(xiàn)者 | 主要特點 |
RESTful API | Roy Fielding | 資源、路徑、請求方法。在互聯(lián)網(wǎng)應(yīng)用廣泛 |
SOAP API | 微軟 | 基于xml,較復(fù)雜。支持事務(wù)處理 |
GraphQL API | 一次請求獲得多個資源。減少數(shù)據(jù)傳輸 | |
gRPC API | 基于http/2,速度更快,性能更高,也更復(fù)雜 |
2.REST API介紹

RESTful API
是符合REST原則的API設(shè)計風(fēng)格,它通過使用HTTP協(xié)議中的各種方法來操作資源,包括GET、POST、PUT、DELETE等。
REST
Representational State Transfer,表述性狀態(tài)傳遞,服務(wù)器將資源狀態(tài)表述傳遞給客戶端。
RESTful API特點
- 資源導(dǎo)向:
RESTful API的核心概念是資源,每個資源都有一個唯一的標(biāo)識符(URI)。客戶端通過HTTP方法對資源進(jìn)行操作,如GET用于獲取資源、POST用于創(chuàng)建資源、PUT用于更新資源、DELETE用于刪除資源等。 - 無狀態(tài)性:
RESTful API是無狀態(tài)的,每個請求都必須包含足夠的信息來處理該請求,而不依賴于服務(wù)器上的會話狀態(tài)。這樣可以使得API的設(shè)計更加簡潔,并且易于擴(kuò)展和維護(hù)。 - 可緩存性:
RESTful API通過利用HTTP協(xié)議中的緩存機(jī)制來提高性能和可擴(kuò)展性。服務(wù)器可以在響應(yīng)中包含緩存控制信息,客戶端可以根據(jù)這些信息來緩存資源,減少不必要的網(wǎng)絡(luò)請求。 - 統(tǒng)一接口:
RESTful API使用統(tǒng)一的接口來訪問資源,即通過HTTP方法對資源進(jìn)行操作。這種統(tǒng)一接口的設(shè)計使得API更易于理解和使用。
下面,重點結(jié)合Playwright說明下REST api如何完成自動化測試。
3. 常見api自動化測試工具
瀏覽器調(diào)試工具
chorome瀏覽器自帶的devtools,對于測試人員和開發(fā)人員,可能都是最需要掌握的調(diào)試工具。典型的測試場景如:模擬慢速網(wǎng)絡(luò)連結(jié)

官網(wǎng)有詳細(xì)介紹:
https://developer.chrome.com/docs/devtools?hl=zh-cn
curl

Curl 是一個基礎(chǔ)的開源命令行工具,用于在服務(wù)器之間傳輸數(shù)據(jù),同時支持創(chuàng)建 HTTP 請求并將其發(fā)送到后端服務(wù)中,同時也支持使用 cURL 命令發(fā)送 HTTP 請求,例如 POST、PUT 和 DELETE。例如:

postman
Postman,有客戶端版本和 web 網(wǎng)頁版。Postman 支持多種協(xié)議和格式,包括 HTTP、HTTPS、GraphQL、REST 等。Postman 的優(yōu)點在于它易于使用,支持多種請求類型和參數(shù)設(shè)置,可以方便地創(chuàng)建和管理 API 測試套件;還支持將測試結(jié)果導(dǎo)出為多種格式,如 JSON、CSV 等;還提供了一些有用的工具,如 Mock Server,可以幫助用戶模擬 API 響應(yīng)以及運行單元測試。

JMeter
JMeter主要用來做性能測試。優(yōu)點是Java編寫,免費開源,無需安裝,做web api測試也是可以的。

soupUI
SoapUI 是專門為 API 測試而開發(fā)的開源工具,可以輕松測試 REST 和 SOAP API。

apifox
Apifox 是一款集 API 文檔、API 調(diào)試、API mock、API 自動化測試為一體的接口一站式協(xié)作平臺,類似于 Postman、Swagger、mock 和 Jmeter 的綜合體。它提供了直觀、易于使用的界面,支持多種 HTTP 請求方法、參數(shù)類型和數(shù)據(jù)格式,還提供了豐富的測試和調(diào)試功能,例如斷言、測試集合、環(huán)境變量等。

下列表格總結(jié)了他們的主要特點:
工具 | 描述 | 主要優(yōu)點 |
瀏覽器調(diào)試工具 | 瀏覽器自帶的開發(fā)者工具,可用于發(fā)送和調(diào)試HTTP請求。 | 無需額外安裝軟件,直接在瀏覽器中調(diào)試,方便快捷。 |
curl | 命令行工具,用于發(fā)送和接收HTTP請求。 | 跨平臺,支持Linux、macOS和Windows等操作系統(tǒng)。靈活,可通過命令行參數(shù)設(shè)置各種請求參數(shù)和選項。 |
Postman | 圖形界面工具,提供了豐富的功能和可視化操作界面。 | 用戶友好,無需編寫代碼,通過可視化界面快速構(gòu)建和發(fā)送請求。支持多種請求類型和測試腳本編寫,功能強(qiáng)大。 |
JMeter | Java編寫的壓力測試工具,也可用于接口測試。 | 功能強(qiáng)大,支持多種協(xié)議和高并發(fā)壓力測試。 |
SoupUI | 支持SOAP協(xié)議和RESTful風(fēng)格的接口測試。 | 提供了豐富的接口測試功能,支持多種協(xié)議和數(shù)據(jù)格式。 |
apifox | API 接口文檔管理工具 | 適合團(tuán)隊協(xié)作,從api定義,開放,測試,文檔,全生命周期管理 |
3.Playwright發(fā)送請求
以上工具在不同維度和層面提供了不同的能力,幫助完成web api測試。就自動化來說,無論是python環(huán)境下的requests庫,還是Java環(huán)境下的REST-assured,選擇Playwright有一個額外的好處,那就是可以和web UI自動化測試無縫連接,包括但不限于如下場景:
- 通過調(diào)用
api獲取token,在后續(xù)自動化測試中復(fù)用,避免從UI層反復(fù)login的痛點 - 利用
api提前創(chuàng)建測試數(shù)據(jù),比通過UI層的交互來創(chuàng)建數(shù)據(jù)更加高效 - 利用
api來清理測試過程中產(chǎn)生的垃圾數(shù)據(jù),為下次自動化測試做好準(zhǔn)備 - 調(diào)用第三方
api準(zhǔn)備測試環(huán)境,包括測試數(shù)據(jù)、服務(wù)、緩存、中間件...
Playwright主要通過APIRequestContext 方法來實現(xiàn)。
簡單來說,掌握api test發(fā)送request請求,包含了4個要素和4方法:
4要素
- url
- method
- headers
- parameter/Payload
request
- get
- post
- delete
- put
CRUD
以下是API測試中基本的CRUD(創(chuàng)建、讀取、更新、刪除)操作:
操作 | HTTP方法 | 描述 |
創(chuàng)建 | POST | 創(chuàng)建一個新的資源。客戶端發(fā)送一個帶有新資源數(shù)據(jù)的POST請求。 |
讀取 | GET | 檢索現(xiàn)有資源或資源列表??蛻舳税l(fā)送一個GET請求到API端點。 |
更新 | PUT 或 PATCH | 修改現(xiàn)有資源??蛻舳税l(fā)送一個帶有更新數(shù)據(jù)的PUT或PATCH請求。PUT請求用新數(shù)據(jù)替換整個資源,而PATCH只更新指定的字段。 |
刪除 | DELETE | 刪除現(xiàn)有資源??蛻舳税l(fā)送一個帶有要刪除資源的唯一標(biāo)識符的DELETE請求。 |
這些操作構(gòu)成了API測試的基礎(chǔ),使測試人員能夠有效地與應(yīng)用程序的資源進(jìn)行交互。
APIRequestContext使用
import { test, expect } from '@playwright/test';
import { request, APIRequestContext } from '@playwright/test';
test('get api get', async () => {
const apiContext: APIRequestContext = await request.newContext();
const response = await apiContext.get('https://reqres.in/api/users?page=2');
const responseCode = await response.status();
console.log(responseCode);
expect(responseCode).toBe(200);
});
test('get api get2', async ({request}) => {
const response = await request.get('https://reqres.in/api/users?page=2');
const responseCode = await response.status();
console.log(responseCode);
expect(responseCode).toBe(200);
});
test('get api post', async () => {
const apiContext: APIRequestContext = await request.newContext();
const response = await apiContext.post('https://reqres.in/api/users?page=2', {
data: {
title: 'Book Title',
author: 'John Doe',
},
headers: {
authorization: `Bearer eyJhbGciOiJIUzcCI6IkpXVCJ9.eyJzd`
}
});
const resBody = await response.body();
const responseCode = await response.status();
console.log(responseCode);
expect(responseCode).toBe(201);
});說明如下:
APIRequestContext生成apiContext實例apiContext.get()方法response.status()斷言返回值為200request方法類似post、get調(diào)用方法類似
4.Playwright處理響應(yīng)
接口斷言寫法,通常3個方面考慮,分別是:返回值、返回數(shù)據(jù)、數(shù)據(jù)類型:
status code
expect(code).toBe(200);
JSON data
expect(res.message).toContain('操作成功');JSON Schema
expect(typeof phoneNumber).toBe('string');
結(jié)論
Web API廣泛用于互聯(lián)網(wǎng)基于前后端分離的項目中,通訊協(xié)議http/https時,一般也稱為REST APICRUD操作,對應(yīng)于數(shù)據(jù)的創(chuàng)建、讀取、更新、刪除操作,操作結(jié)果可以用status code狀態(tài)碼獲取,也可以用json data結(jié)構(gòu),而json schema往往對應(yīng)數(shù)據(jù)類型的校驗,在實際項目中,斷言的內(nèi)容,可以以上3個維度考慮- 靈活運用
UI testing與api testing能力,可以實現(xiàn)更復(fù)雜的自動化驗證需求
到此這篇關(guān)于python中playwright截屏API的實現(xiàn)的文章就介紹到這了,更多相關(guān)playwright截屏API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python文件讀寫,自定義分隔符(custom delimiter)
這篇文章主要介紹了使用Python文件讀寫,自定義分隔符(custom delimiter),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)做人臉識別的示例代碼
這篇文章主要介紹了使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)做人臉識別的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python網(wǎng)絡(luò)編程之socket與socketserver
這篇文章介紹了Python網(wǎng)絡(luò)編程之socket與socketserver,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
Linux下使用python腳本執(zhí)行BCP導(dǎo)入導(dǎo)出方式
這篇文章主要介紹了Linux下使用python腳本執(zhí)行BCP導(dǎo)入導(dǎo)出方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
django下創(chuàng)建多個app并設(shè)置urls方法
在本篇文章里小編給大家分享的是一篇關(guān)于django下創(chuàng)建多個app并設(shè)置urls方法,需要的朋友們可以參考學(xué)習(xí)下。2020-08-08
pytorch?dataset實戰(zhàn)案例之讀取數(shù)據(jù)集的代碼
這篇文章主要介紹了pytorch?dataset實戰(zhàn)案例讀取數(shù)據(jù)集的相關(guān)知識,這段代碼可以作為讀取數(shù)據(jù)集的一個DataSet類的基礎(chǔ)類,可以擴(kuò)充進(jìn)行修改,以后有類似需要可以拿過來修改,本文結(jié)合實例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10

