大页面对象文件量角器的最佳实践
Best practices in protractor for big pageObject files
在我之前的量角器 JS 项目中(我将使用 TS 完成这个新项目)我为我的所有元素创建了一个 class,为我的函数创建了另一个,如下所示:
specs
|_reportPage
|_lib
|_pageElements.js
|_pageFunctions.js
然后我根据需要导入文件,这样很容易找到信息,因为元素列表很长。
到目前为止,量角器 TS 项目的所有在线示例都是带有几个元素和方法的短 pageObject 文件,但我想知道当页面需要很多元素并且 functions/methods .
例如,假设我们在同一个文件夹下有 5 个规范测试同一个页面,而这个页面充满了字段和表格。
此处的最佳做法是什么?为每个规范创建 1 个页面对象,创建一个包含所有元素和功能的长 class...?
感谢您的宝贵时间!
根据Infern0的回答,我对类做了依赖注入:
class HeaderElements {
foo = element(by.id("foo"));
//List goes on...
}
class HomePageElements {
foo = element(by.id("foo"));
//List goes on...
}
export class MainCommonElementsPage {
headerElements: HeaderElements;
homePageElements: HomePageElements;
constructor() {
this.headerElements = new HeaderElements();
this.homePageElements = new HomePageElements();
}
}
要扩展我的答案,您可以添加附加层作为 服务,它可以在不同页面中执行流程中的多个操作。
代码示例:
export class E2EService {
mainPage: MainPage = new MainPage();
innerPage: InnerPage = new InnerPage();
doSomethingE2E() {
this.mainPage.headerPage.weDoSomething();
this.mainPage.contentPage.weDoSomething()
this.innerPage.somethingComplicated();
}
}
export class MainPage {
public readonly headerPage: HeaderPage;
public readonly contentPage: ContentPage;
}
export class InnerPage {
headerPage: InnerHeaderPage;
contentPage: InnerContentPage;
public somethingComplicated() {
this.headerPage.weDoSomething();
this.contentPage.weDoSomething();
}
}
export class ContentPage {
private readonly elements = {
// elements
};
public weDoSomething() {
// code
}
public getElements() {
return this.elements;
}
}
export class HeaderPage {
private readonly elements = {
btn1: element(by.id('')),
div: element(by.id('')),
h2: element(by.id(''))
};
public weDoSomething() {
// code
}
public getElements() {
return this.elements;
}
}
最佳实践,即使对于大型页面对象也是如此:
每个页面应该只有 1 个页面对象 class。访问该页面所需的所有工具都应位于此处。将您的页面对象视为 API.
不要将 PO 分成不同的部分,尤其是对于大页面。您最终需要修改 PO 以适应内容更改。您愿意更改 1 个文件还是 12 个文件?这也确保您的每个 e2e 测试在您更新 PO 后都将保持功能。
我有一个 PO 处理一个表单很长的页面。该表单有 12 个控件和三个按钮(取消、重置和提交)。我有大约 30 个处理表单的函数。我不喜欢在我的测试中有超过 1-2 个方法,所以如果它变得更复杂,我会添加到 PO。
在我之前的量角器 JS 项目中(我将使用 TS 完成这个新项目)我为我的所有元素创建了一个 class,为我的函数创建了另一个,如下所示:
specs
|_reportPage
|_lib
|_pageElements.js
|_pageFunctions.js
然后我根据需要导入文件,这样很容易找到信息,因为元素列表很长。
到目前为止,量角器 TS 项目的所有在线示例都是带有几个元素和方法的短 pageObject 文件,但我想知道当页面需要很多元素并且 functions/methods .
例如,假设我们在同一个文件夹下有 5 个规范测试同一个页面,而这个页面充满了字段和表格。
此处的最佳做法是什么?为每个规范创建 1 个页面对象,创建一个包含所有元素和功能的长 class...?
感谢您的宝贵时间!
根据Infern0的回答,我对类做了依赖注入:
class HeaderElements {
foo = element(by.id("foo"));
//List goes on...
}
class HomePageElements {
foo = element(by.id("foo"));
//List goes on...
}
export class MainCommonElementsPage {
headerElements: HeaderElements;
homePageElements: HomePageElements;
constructor() {
this.headerElements = new HeaderElements();
this.homePageElements = new HomePageElements();
}
}
要扩展我的答案,您可以添加附加层作为 服务,它可以在不同页面中执行流程中的多个操作。
代码示例:
export class E2EService {
mainPage: MainPage = new MainPage();
innerPage: InnerPage = new InnerPage();
doSomethingE2E() {
this.mainPage.headerPage.weDoSomething();
this.mainPage.contentPage.weDoSomething()
this.innerPage.somethingComplicated();
}
}
export class MainPage {
public readonly headerPage: HeaderPage;
public readonly contentPage: ContentPage;
}
export class InnerPage {
headerPage: InnerHeaderPage;
contentPage: InnerContentPage;
public somethingComplicated() {
this.headerPage.weDoSomething();
this.contentPage.weDoSomething();
}
}
export class ContentPage {
private readonly elements = {
// elements
};
public weDoSomething() {
// code
}
public getElements() {
return this.elements;
}
}
export class HeaderPage {
private readonly elements = {
btn1: element(by.id('')),
div: element(by.id('')),
h2: element(by.id(''))
};
public weDoSomething() {
// code
}
public getElements() {
return this.elements;
}
}
最佳实践,即使对于大型页面对象也是如此:
每个页面应该只有 1 个页面对象 class。访问该页面所需的所有工具都应位于此处。将您的页面对象视为 API.
不要将 PO 分成不同的部分,尤其是对于大页面。您最终需要修改 PO 以适应内容更改。您愿意更改 1 个文件还是 12 个文件?这也确保您的每个 e2e 测试在您更新 PO 后都将保持功能。
我有一个 PO 处理一个表单很长的页面。该表单有 12 个控件和三个按钮(取消、重置和提交)。我有大约 30 个处理表单的函数。我不喜欢在我的测试中有超过 1-2 个方法,所以如果它变得更复杂,我会添加到 PO。