量角器场景的写法

The way to write protractor scenarios

假设 angular 应用程序包含两个页面:联系人(包含 table 以及联系人列表和一个按钮 "add new contact")和新联系人页面(包含表单添加新联系人)。我想写那个场景:

  1. 点击添加按钮
  2. 检查 "new contacts" 页面是否打开
  3. 输入联系人数据
  4. 按添加按钮
  5. 检查新联系人是否在 table

对于这些页面,我的页面对象具有 "click some button"、"input some field" 和所有功能 returns 承诺。

编写测试场景的最佳方式是什么:使用 js 链接,例如

contactPage.clickAddButton()
.then(function () {
    return newContactPage.checkUrl();
})
.then(function () {
    return newContactPage.inputData(data);
})
.then(function () {
    return newContactPage.clickAddButton();
})
.then(function () {
    return checkContact(data);
})
.then(function (succes) {
}, function (error) {
    console.error(error);
});

或者我可以这样写:

contactPage.clickAddButton();
newContactPage.checkUrl();
newContactPage.inputData(data);
newContactPage.clickAddButton();
checkContact(data);

将场景拆分为多个 "it" 功能有意义吗?

没有必要明确解决承诺。 Protractor 有一个 Control Flow 并且开箱即用地处理承诺队列。由于这是一个单一的场景,你可以把它放在一个单一的 it() 中,除非你不重复自己:

contactPage.clickAddButton();
newContactPage.checkUrl();
newContactPage.inputData(data);
newContactPage.clickAddButton();
checkContact(data);

如果坚持使用量角器,则应按 处理。

但是如果你想让承诺链保持明确(远离量角器,与应用程序编码格式一致等),那么它可以像这样重写:

contactPage.clickAddButton()
  .then(newContactPage.checkUrl) // Must resolve `data` for next function
  .then(newContactPage.inputData) 
  .then(newContactPage.clickAddButton) // Must resolve `data` for next function
  .then(checkContact)
  .then(function (success) {
    // Test passes...
  }, function (error) {
    console.error(error);
  });

但是如果你使用量角器,写成 会更简洁。