gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:42:10 24 4
gpt4 key购买 nike

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

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

我的目录结构是这样的

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

我现在面临的问题是我无法在该特定页面的方法主体中初始化页面

例如如果我在 page1 中有一个输入框,我想在 utils/page1methods.js 中定义一个方法来处理这个问题 - 就像

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

然后我想在 page1.js it block 中调用它 - 像这样

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

我尝试过这种方法,但遇到了各种关于 page 未在 page1methods.js 文件中定义的 .js 错误。如果有必要,我可以复制粘贴错误。

我该怎么做才能做到

  • 我能够实现这种模块化。
  • 如果我可以改进这个结构,我的方法应该是什么。

最佳答案

您可以返回一个箭头函数,该函数将返回带有 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)

就是这样。现在所有函数都可以访问页面变量。还有其他方法,例如扩展类、绑定(bind)页面等。但这将是您所看到的最简单的方法。如果需要,您可以将其拆分。

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

这是一个完整的工作示例,

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();
});

关于javascript - 复杂应用程序的页面对象模型结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52298882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com