如何在页面对象模型中对页面进行编码以便更轻松地调试 Protractor 测试?

How to code page in Page Object Model for easier debugging of Protractor tests?

前言

我想使用页面对象模型为端到端测试准备易于维护和调试的代码。

我做什么

当我通过执行以下步骤开始准备 Protractor end 2 end tests, I try to prepare code in Page Object Model 时:

  1. 打开我要在网络浏览器中测试的页面,
  2. 打开 developer tools (F12),
  3. 使用inspect工具熟悉DOM的 页面,查看我想用于页面对象模型的元素的 ID、类 名称和 CSS 选择器,
  4. 以元素依赖于 以前定义的。特别是,我尝试将我的代码分成不同的 类.

让我提供第 4 点中提到的此类代码的简化示例:

class genericPageWithTable {

    get Frame1() {
        return element(by.id('someId'));
        }

    get Table1() {
        return this.Frame1.element(by.tagName('table'));
        }
}

class specificTable extends genericPageWithTable {

    get specificElement {
        return this.Table1.element(by.className('specificElement'));
        }
}

并且我使用以下示例断言编写了简单测试:

expect(specificElement.getText()).toBe('someString');

这就是我的挫败感开始的地方...

测试失败,因为 undefined 没有 getText()...

问题

我不知道哪个元素未定义,我的哪个方法没有返回任何元素。我不知道我是否可以相信我的任何方法。

所以我 运行 protractor --elementExplorer 并尝试验证我是否正确编写了每个定位器... 在 elementExplorer 中它有效,所以我开始添加 browser.wait(EC.visibilityOf(...)) 条件...但现在错误消息向我提供了未定义不包含 'isPresent' 方法的信息。 所以我开始加上asyncawait,但是很多时候还是很难找到undefined返回的地方...

添加断点并尝试调试在很多情况下也让我感到困惑,因为流程在某种程度上是出乎意料的。


问题

你能告诉我吗:

  1. 我应该如何为页面对象模型准备代码,以便更容易维护和调试,从而确定我的方法确实 returns 东西?有没有比在浏览器中使用开发人员工具并根据我在 HTML 中看到的内容进行编码更好的方法?
  2. 确保我的页面对象模型代码正确的更好方法是什么?显然我可以尝试为每个 method/property 编写测试,但我不想混淆那些将阅读测试输出(并从业务角度期望结果)的人?
  1. 在项目中使用开发者工具或实际 HTML 是很好的方法。
  2. 如果您要为每个页面上的 get/perform 所有内容编写方法,您将花费很多时间。我的做法是在编写测​​试时创建方法。