【问题标题】:How to accurately use getText() with Protractor and Page Object Model in Javascript如何在 Javascript 中准确地将 getText() 与 Protractor 和 Page Object Model 一起使用
【发布时间】:2018-08-15 15:50:47
【问题描述】:

我很难从我的页面对象返回值。使用 getText() 返回整个对象,而不仅仅是文本。这是因为 getText() 是一个 Promise,如果我理解正确的话。

如果需要,我有我的代码,但我想要完成的工作类似于这个流行的在线示例。我会使用它,因为它很简单。

var AngularHomepage = function() {
  var nameInput = element(by.model('yourName'));
  var greeting = element(by.binding('yourName'));

  this.get = function() {
    browser.get('http://www.angularjs.org');
  };

  this.setName = function(name) {
    nameInput.sendKeys(name);
  };

  this.getGreetingText = function() {
    return greeting.getText();
  };
};
module.exports = new AngularHomepage();

这是规范文件。我已将其修改为 console.log 返回。

var angularHomepage = require('../pages/AngularPage');
describe('angularjs homepage', function() {
  it('should greet the named user', function() {
    angularHomepage.get();

    angularHomepage.setName('Julie');
    var log = angularHomepage.getGreetingText();
    expect(angularHomepage.getGreetingText()).toEqual('Hello Julie!');
    console.log(log);
  });
});

这是我很困惑的地方。期望和测试通过。但是控制台记录了整个对象,这里添加的时间太长了。这绝对不仅仅是“你好朱莉!”。我很想澄清两件事。

一个。以上是使用 getText() 做出“期望”语句的准确方法吗?我不知道测试如何通过,而 console.log 是整个对象,而不是所需的文本。这仅仅是因为“期望”履行了返回的承诺吗?

b.下面我修改了页面对象中的方法,实现了控制台输出真正“Hello Julie!”的承诺。问题是,我必须在这里使用“expect”,而不是在我的规范中(或者至少,我不知道如何只返回文本)。像这样在 Page Object 方法本身中有一个期望语句有什么问题吗?还是只返回元素文本的简单方法?

  this.getGreetingText = function() {
    greeting.getText().then(function (text) {    
      console.log(text);
      expect(text.toEqual('Hello Julie!'));
  });
    // expect is done, no return needed.
    //return greeting.getText();
  };

从测试人员的角度来看,比较文本似乎更准确,而不是第一个示例在做什么。但是如果第一个例子是可以接受的,并且不建议在页面对象中包含“期望”,那么我想这就是我要做的!

【问题讨论】:

  • 阅读他们的文档。 protractortest.org/#/control-flow。 (1) “所有函数都返回承诺。”您正在控制台记录一个承诺(一个对象)。 (2)“茉莉花的期望也适应于理解承诺。” - 这就是expect 行有效的原因,它可以处理承诺
  • expect(angularHomepage.getGreetingText()).toEqual('Hello Julie!'); 完全可以接受。如果您不喜欢这样做,尽管我会将您的期望移回测试并执行类似angularHomepage.getGreetingText().then(text => { expect(text).toEqual('Hello Julie!'); }); 的操作

标签: javascript selenium protractor pageobjects


【解决方案1】:

我相信你需要做的就是让你的函数异步,然后在你的变量赋值前抛出一个等待。

var log = await angularHomepage.getGreetingText();

这会将文本从承诺中提取出来并将其存储到变量中。

【讨论】:

    【解决方案2】:

    使用 then 语句可用于从 Promise 中提取文本。仅当您想记录文本时才需要这样做,因为期望语句可以处理 .getText()

    angularHomepage.getGreetingText().then(function(text){
        console.log(text);
        expect(text).toBe('Hello Julie');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2012-09-17
      • 2014-10-25
      • 2020-10-12
      • 1970-01-01
      • 2021-05-25
      • 2021-12-30
      相关资源
      最近更新 更多