【问题标题】:Page Object Mode with node, ES7, puppeteer带有节点、ES7、puppeteer 的页面对象模式
【发布时间】:2018-01-11 21:33:52
【问题描述】:

我最近开始使用 Puppeteer 进行 e2e 测试(我对 Selenium Web Driver 有一些经验),但在讨论 POM 模式的文档中找不到任何内容。有没有可用的示例如何在 Puppeteer 的 node/ES7 中正确实现这一点?

假设我有一个测试页面登录功能的简单脚本:

(async () => {
...

     await page.goto(url, {
        timeout: 5000
    });

    await page.waitFor('input[id=userId]');

    await page.type('input[id=userId]', 'John Doe');
    await page.type('input[id=password]', 'password1');
    await page.click('button[type="submit"]');
    await page.waitFor('p.success-msg');
...
}();

通常,我们会有一个用于登录页面的页面对象模型。我将如何为上述页面创建一个基本的 POM 并将其与我的脚本集成?在这种环境下,您将如何在我的测试脚本中调用 POM?我会使用import 吗?我只是在寻找一个基本的“hello world”示例。

【问题讨论】:

    标签: javascript node.js testing puppeteer


    【解决方案1】:

    在最基本的层面上,POM 声明每个页面都有自己的类,其中包含与该页面交互的实用方法。

    为了使用 Puppeteer 实现这一点,我们使用 ES6 类来创建包含相应页面的实用方法的类。

    文件夹结构

    test/
      main.js
      pages/
        - HomePage.js
        - CartPage.js
        - ProductDetailPage.js
    

    HomePage.js

    export default class HomePage {
    
        constructor(page) {
            this.page = page;
        }
    
        async getTitle() {
            return this.page.title();
        }
    }
    

    ma​​in.js

    import HomePage from "pages/HomePage";
    
    const HP_URL = "https://google.com";
    
    (async () => {
    
        await page.goto(HP_URL);
    
        const hp = new HomePage(page);
    
        const title = await hp.getTitle();
    
        console.log(title);
    
    })();
    

    【讨论】:

    • 是的,这是有道理的,但是如何创建class LoginPage {},然后将其与实际的测试脚本集成呢?我会使用 ES6 import 吗?如果您可以使您的示例与我的特定用例更相关,那将非常有帮助。
    • 查看我的编辑以获得更完整的示例——您将导出 LoginPage 并将其导入主测试脚本中
    • 啊,我明白了,这更有意义。所以在 POM 中,每一页都是它自己的类,对吗?但是比如说,一个单页应用程序,比如我的 Angular 应用程序,每个组件都会有自己的 POM,比如 login.component.ts 吗?另外,假设我们有一个包含 30 个组件的复杂应用程序,我会有 30 个 POM 和一个测试脚本吗?
    • 另外,我看到你放置了const title = await hp.getTitle(); 我虽然根据POM所有与页面流相关的功能都应该在页面对象中?
    • 对于单页应用,如果应用很容易拆分成路由和URL,你可以坚持按页来做,否则你会为每个feature创建类(即loginFeature.jsemailFeature.js 等)。关于await hp.getTitle(),变量hp是主页的页面对象,所以任何特定于主页的方法都应该可以通过hp访问
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2017-01-06
    • 2019-04-28
    • 1970-01-01
    • 2019-02-23
    • 2021-04-19
    相关资源
    最近更新 更多