Selenium 一维页面对象结构

Selenium 一维页面对象结构,selenium,selenium-webdriver,webdriver,protractor,qa,Selenium,Selenium Webdriver,Webdriver,Protractor,Qa,我遇到的情况是,标准页面对象设计是一维的。这些页面非常大,包含许多(大部分是唯一的)页面部分 页面对象的现有语料库如下所示: this.pageHeaderLogin = $$('div.header > a.login'); this.pageHeaderSignUp = $$('div.header > a.signup'); this.pageHeaderContact = $$('div.header > a.contact'); this.pageIntroSecti

我遇到的情况是,标准页面对象设计是一维的。这些页面非常大,包含许多(大部分是唯一的)页面部分

页面对象的现有语料库如下所示:

this.pageHeaderLogin = $$('div.header > a.login');
this.pageHeaderSignUp = $$('div.header > a.signup');
this.pageHeaderContact = $$('div.header > a.contact');
this.pageIntroSectionTitle = $$('div.intro > span.title');
this.pageIntroSectionText = $$('div.intro > span.description');
以此类推,有多达50-100个元素,
this
的所有直接子元素

在我看来,更好的结构不是一维的,而是与页面本身的结构类似的划分。因此,我更喜欢使用页面对象,如:

this.pageHeader.login = $$('div.header > a.login');
this.pageHeader.signUp = $$('div.header > a.signup');
...
this.pageIntroSection.title = $$('div.intro > span.title');
等等

不幸的是,有人告诉我这太复杂了。我想提出一个论点,它不仅不复杂,而且实际上更有组织性,但是页面对象的所有示例都太小,无法说明一维结构之外的任何内容


有人能给我指出一个非一维页面对象的好例子吗?我可以用它作为参考来展示这种设计的好处

从理论上讲,Flat总是比嵌套的好,而且只有在嵌套的东西实际上增加了可读性、模块性和可维护性之后。我认为在页面对象中包含子页面对象没有任何错误。当页面对象变得过于复杂并需要拆分为多个部分时,这一点非常有意义

在我们的测试代码库中,我们已经为几个页面对象完成了这项工作。我们已将此类页面对象定义为包-目录,其中包含
index.js
,示例页面对象目录结构:

- po
  -- somepage.po.js
  -- someotherpage.po.js
  -- page.po
    -- index.js
    -- subpage.po.js
其中,
index.js
中有如下内容:

var SubPage = require("./subpage.po"),
var Page = function () {
    this.somefield = element(by.id("myid"));

    this.subPage = new SubPage(this);
}

module.exports = new Page();
注意,我们在这里将
这个
传递给
子页面
构造函数,以便它访问父级的页面对象字段,在某些情况下可能很方便

下面是如何在测试中使用此嵌套页面对象:

var page = requirePO("page");

describe("Some Test", function () {
    it("should do something good", function () {
        page.somefield.click();
        page.subPage.someotherfield.sendKeys("test");
    });
});
requirePO()
是一个用于“导入”页面对象的实用函数,请参阅:


我认为自定义require()函数比此模型更难理解。页面对象的一些示例将“组件对象”作为选项。我突然想到,我可以同样轻松地创建homepageHeaderPageObject、homepageIntroPageObject和homepageFeaturesPageObject等等。但是这需要更多的require()和更多的对象处理。我需要的不是home.intro.text和home.header.login,而是homeintro.text和homeheader.login。你能解释一下为什么平房比较好吗?@KeithTyler我觉得要么你误解了我的观点,要么我解释得不够清楚,如果是这样的话,我很抱歉。实际上,我在一定程度上支持嵌套复杂页面对象的想法。使用本文介绍的方法,您实际上可以使用嵌套页面对象中的字段,而无需在测试中附加要求,例如,请参见示例测试中的
page.subPage.someotherfield
requirePO
只是一个帮助工具,可以使测试中的requires更具可读性,并且有一种从项目中指定位置导入页面对象的单一方法。谢谢