Console.Log()在代码中收集的实际数据之前执行

时间:2017-11-23 08:22:37

标签: node.js jasmine protractor

我正在尝试使用console.log()方法在控制台上打印值。 我在获得所需的打印值后使用了此方法,但是此方法会打印Searched Accession:___::[object Object]消息。

browser.driver.findElement(by.xpath('//*[@id="dataTable_filter"]/label/input')).sendKeys('17-01717');
browser.sleep(5000);
var accession= element.all(by.xpath('//*[@id="dataTable"]/tbody/tr[1]/td[1]/a')).getText();
expect(accession).toContain('17-01717');
console.log('*****Searched Accession:___::'+accession);

我做错了吗?

1 个答案:

答案 0 :(得分:0)

请转到www.protractortest.org并执行Tutorial,查看Styleguide(尤其是定位策略)和API

虽然我们喜欢在SO上提供帮助,但是很明显你没有花费任何精力研究Protractor。您的代码示例包含许多错误和不良做法:

  • browser.driver.findElement()有点被element()$()
  • 取代
  • 搜索by.css而不是by.xpath - 它更可靠
  • 永远不需要
  • browser.sleep()browser.wait()ExpectedConditions
  • 可以实现
  • 您无法从getText()执行element.all(),因为element.all()会返回一个在数组中解析的Promise

入门奖励,此处您的代码以可能的方式运作

$('#dataTable_filter label input').sendKeys('17-01717');
let accession= $$('#dataTable tbody tr td a').first();
accession.getText().then(function(txt){
    console.log('*****Searched Accession:___::'+txt);
});
expect(accession.getText()).toContain('17-01717');

您实际上不需要console,log(),但如果您要打印从getText()收到的文字,则需要执行then()才能解决承诺第一

承诺

显然你不知道Promises是如何运作的。非常简短:许多JavaScript / Jasmine / Protractor命令返回第一个promise,只有少量命令立即执行。就像你两次运行你的代码一样:

在第一次运行中,Promise - 命令将回答“我保证稍后再做”,执行命令将回答“做它 - 完成!”。

然后在(假想的)第二次运行中,所有Promise - 命令将回答“现在就完成 - 完成”,但执行命令将回答“已经做过,我不再做任何事了”

所以你所有的console.log()都是唯一立即执行的代码行...所有其他行都在第二次运行时执行。