53

我想在量角器测试中输出 div 的文本,到目前为止我有:

console.log(ptor.findElement(protractor.By.id('view-container')).getText());

但这输出

[object Object]

我尝试了“toString()”,结果相同。

有没有办法将文本输出到控制台?

4

7 回答 7

112

getText和大多数其他量角器方法返回承诺。你想把你的console.log声明放在承诺决议中:

使用新的量角器语法:

element(by.id('view-container')).getText().then(function(text) {
  console.log(text);
});
于 2013-11-12T23:25:20.040 回答
33

这已经很老了,但作为量角器的前 n00b,我希望有更多的文档。

你也可以使用:

element(by.id('view-container')).getText().then(console.log);

或者我喜欢为可读性做的是将页面上的所有对象放在它们自己的函数、部分或文件中:

//top declaration of variables
var viewContainer = element(by.id('view-container')).getText();

.... //bunch of code
....

viewContainer.then(console.log);

这将满足您的大部分普通调试需求。

对于一般的承诺,您可以尝试使用protractor.promise.all()

假设您有两件事都是承诺:

var getTime      = element(by.xpath(theTimeXpath)).getText();
var getPageTitle = element(by.xpath(thePageTitle)).getInnerHtml();

protractor.promise.all([getTime, getPageTitle]).then(function(theResultArray){

  var timeText           = result[0];
  var pageTitleInnerHtml = result[1];

   console.log(timeText);           // outputs the actual text
   console.log(pageTitleInnerHtml); //outputs the text of the Inner html
});

当事情开始变得更加复杂时,第二种方法很有用。然而,就我个人而言,我找到了其他解决方法。虽然还不错,但对于其他必须阅读我的代码的开发人员来说,这有点奇怪。

于 2014-12-12T13:22:30.587 回答
6

我想建议对其他答案进行一些小的改进。

简短的回答:我喜欢browser.sleep(0).then(..);在需要推动量角器流动的地方使用。

它通用且易于移动。

tl;博士

因此使用上述内容,您可以轻松地在浏览器(或 ptor)上添加一个功能,例如:

browser.log = function( logger, level, msg ){
     browser.sleep(0).then(function(){ logger[level](msg); });
}

或者更复杂的东西apply- 但这取决于你的记录器。

您显然可以稍微增强一下以拥有像 api 这样的记录器

var logger = browser.getLogger('name');

应该像这样实现(假设log4js)

browser.getLogger = function( name ){
        var logger = require('log4js').getLogger(name);

        function logMe( level ) {
                 return function(msg ){
                      browser.sleep(0).then(function(){ logger[level](msg); });
                 }

        }

        return { info : logMe('info'), ... }
}

基本上,天空是极限。

我确信有一种方法可以使我的代码更短,重点是使用该sleep方法作为基础。

于 2015-11-05T14:44:38.830 回答
2

你总是可以断言你得到的文本是你期望的文本:

expect(element(by.id('view-container')).getText()).toBe('desired-text');

于 2018-01-25T15:54:46.063 回答
0

当用户想要在量角器中记录预期和实际结果时,请始终使用 then 方法实现。

verifyDisplayedText(locator: Locator, expectedText: string) {
const text = this.getText(locator);
try {
text.then(function(value){
if (value.trim() === expectedText) {
verifyLog("VERIFICATION: PASSED. Expected: '" + expectedText + "' Actual: '" + value+"'");
} else {
errorLog("VERIFICATION: FAILED. Expected: '" + expectedText + "' Actual: '" + value+"'");
}
});
expect(text).toBe(expectedText);
}catch (error1) {
errorLog("VERIFICATION: FAILED. Expected: '" + expectedText + "' Actual: '" + text+"'");
throw error1;
}
}
于 2019-11-04T12:14:13.103 回答
0

如果您在 2021 年,您将需要阅读此答案

根据量角器文档,.getText()返回一个承诺。Promise 是一个对象是 javascript。这就是您要记录的内容。

你需要通过解决它来获得承诺的价值

截至 2021 年,处理承诺的最佳方式是使用async/await关键字。这将使 Protractor '冻结'并等待,直到 promise 得到解决,然后再运行下一个命令

it('test case 1', async () => {
  let text = await ptor.findElement(protractor.By.id('view-container')).getText();
  console.log(text);
  // or directly
  console.log(await ptor.findElement(protractor.By.id('view-container')).getText(););
})

.then()也可以使用,但是使用async/await会使您的代码更具可读性和更易于调试。

于 2021-02-09T00:50:30.067 回答
0

你可以试试这个:

const textInfo = element(by.id('view-container'));
console.log('text: ', textInfo.getText());
于 2019-07-05T08:38:10.270 回答