代码之家  ›  专栏  ›  技术社区  ›  demouser123

复杂应用程序的页面对象模型结构

  •  0
  • demouser123  · 技术社区  · 7 年前

    在过去的几个月里,我用puppeter来驱动一些小型项目的自动化。现在我想扩展一个中型/大型复杂应用程序的框架。

    我想使用著名的页面对象模型,在这个模型中,我将定位器、页面方法分隔在不同的文件中,并在相应的页面执行代码中调用它们。

    e2e_tests
        - locators
            - common-locators.js
            - page1locators.js
            - page2locators.js
    
        - constants
            - config.js
    
        - utils
            - base_functions.js
            - page1methods.js
            - page2methods.js
    
        - urls
            - urls.json
    
        - screenshots
    
        - test
            - bootstrap.js
            - page1.js
            - page2.js
    

    我现在面临的问题是我不能 page 在特定页的方法体中初始化。

    例如,如果我在page1中有一个输入框,我想在里面定义一个方法 utils/page1methods.js 能解决这个问题的是

    module.exports = {
        fillFirstInputBox(){
            await page.type(locator, "ABCDEFG");
         }
    }
    

    然后我想把这个叫做 page1.js it 块-像这样的东西

    const firstPage = require('../utils/page1methods.js').
    .
    .
    .
    it('fills first input box', async function (){
       firstPage.fillFirstInputBox();
    });
    

    .js 有关的错误 第页 未在中定义 page1methods.js

    我能做些什么

    • 我能够实现这种模块化。
    1 回复  |  直到 7 年前
        1
  •  2
  •   Md. Abu Taher    7 年前

    您可以返回一个箭头函数,该函数将返回 page 变量。一定要用第一个大括号把整件事包起来,或者手动返回。

    module.exports = (page) => ({ // <-- to have page in scope
        async fillFirstInputBox(){ // <-- make this function async
            await page.type(locator, "ABCDEFG");
         }
    })
    

    然后把变量传上去,

    // make page variable
    const firstPage = require('../utils/page1methods.js')(page)
    

    我们已经走到一半了。这本身并不能解决这个问题。由于异步等待和类问题,模块仍然无法工作。

    const puppeteer = require("puppeteer");
    const extras = require("./dummy"); // call it
    
    puppeteer.launch().then(async browser => {
        const page = await browser.newPage();
        await page.goto("https://www.example.com");
    
        const title = await extras(page).getTitle(); // use it here
        console.log({ title }); // prints { title: 'Example Domain' }
    
        await browser.close();
    });