Playwright系列:第5章 Playwright页面对象模型与框架

2023-06-09 16:24:23 浏览数 (1)

页面对象模型(Page Object Model)是一种设计模式,用于表示网页中的对象。在Playwright中,我们可以通过Page对象的Query Selector API 查找页面元素,并用它们创建页面对象模型。

页面对象模型的主要优点是:

• 降低脚本的重复性。避免在测试脚本中多次使用相同的定位策略查找同一元素。

• 当页面元素发生变化时,只需要在页面对象模型中修改,而不需要改变整个测试脚本。这使得测试脚本具有很好的维护性。

• 页面对象可以进一步封装页面操作,简化测试脚本的逻辑。

Python示例

下面以example.com网站为例,演示如何构建页面对象模型。

页面对象模型如下:

代码语言:javascript复制
class Page:
    def __init__(self, page):
        self.page = page
    def header(self):
        return Header(self.page)
class Header:
    def __init__(self, page):
        self.page = page
    def logo(self):
        return self.page.query_selector('.example-logo')

测试脚本使用页面对象模型:

代码语言:javascript复制
from playwright.sync_api import sync_playwright

def run(playwright):
    chromium = playwright.chromium
    browser = chromium.launch()
    page = browser.new_page()
    page.goto("https://www.example.com/")
    # 使用页面对象模型
    page_obj = Page(page)
    header = page_obj.header()
    logo = header.logo()
    print(logo.inner_text())
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

可以看到,测试脚本通过页面对象模型查找到页面元素logo,而不直接使用Query Selector API,这使得测试逻辑更清晰简洁。

Node.js示例

页面对象模型:

js

代码语言:javascript复制
class Page {
    constructor(page) {
        this.page = page
    }
    header() {
        return new Header(this.page)
    }
}


class Header {
    constructor(page) {
        this.page = page
    }
    logo() {
        return this.page.$('.example-logo')
    }
}

测试脚本:

代码语言:javascript复制
const { chromium } = require('playwright');

(async () => {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    await page.goto('https://www.example.com/');
    // 使用页面对象模型
    const pageObj = new Page(page);
    const header = pageObj.header();
    const logo = header.logo();
    console.log(await logo.innerText());
    await browser.close();
})();  

Java示例

页面对象模型:

代码语言:javascript复制
public class Page {
    private final Page page;
        public Page(Page page) {
        this.page = page; 
    }
    public Header header() {
        return new Header(page); 
    }
}
    
public class Header {
    private final Page page;
    public Header(Page page) {
        this.page = page;
    }
    public ElementHandle logo() {
        return page.querySelector(".example-logo");
    }
}

测试脚本:

代码语言:javascript复制
import com.microsoft.playwright.*;

public class Example {
    public static void main(String[] args) {
        Playwright playwright = Playwright.create();
        BrowserType chromium = playwright.chromium();
        Browser browser = chromium.launch();
        Page page = browser.newPage();
        page.navigate("https://www.example.com/");
        // 使用页面对象模型
        Page pageObj = new Page(page); 
        Header header = pageObj.header();
        ElementHandle logo = header.logo();
        String text = logo.innerText();
        System.out.println(text);
        browser.close();
        playwright.close(); 
    }
}

可以看到,三种语言的页面对象模型和测试脚本的基本结构都是相似的。至此我们已经理解了页面对象模型的概念,并掌握了在Playwright的三种语言中构建页面对象模型的方法。我们也简单了解了一些常用的Playwright测试框架。这些概念和工具可以帮助我们编写出更加健壮和可维护的Playwright测试脚本。

Playwright测试框架

除了手工构建页面对象模型,我们也可以选择使用Playwright开源的测试框架。这些框架提供了更高级的API,可以更方便地编写稳定的测试脚本。

部分推荐的Playwright测试框架如下:

• Playwright pytest fixture: 可以用pytest和Playwright一起工作,提供浏览器控制的fixture。

• Playwright Sharp: .NET版Playwright,提供C# API,可以在.NET项目中编写Playwright测试。

• Protractor: 最初是为AngularJS设计的E2E测试框架,现已扩展支持Playwright。

• Nightwatch.js: 一个Node.js的E2E测试解决方案,可以用Playwright作为驱动程序。

• Puppeteer-playwright-jest-preset: 一个Jest preset,可以在Jest中更方便地使用Playwright。

• TestCafe: 一个Node.js的E2E测试框架,支持Playwright作为其中一个驱动程序选项。

• Cypress: 一个流行的E2E测试框架,正在积极开发对Playwright的支持。

Playwright还与许多测试框架进行了深度集成,如Jest、JUnit、TestNG等,可以按需选择。

总结

在这一章,我们分别从Python、Node.js和Java三个语言详细讲解了如何构建页面对象模型。我们也概述了许多流行的Playwright测试框架,以及Playwright与现有框架的深度集成情况。

学习页面对象模型和测试框架的概念与用法,是熟练掌握Playwright并编写稳定测试脚本的重要一步。

0 人点赞