NightwatchJs在控制台,属性和值中打印元素文本的问题

时间:2015-11-12 10:32:33

标签: javascript selenium nightwatch.js

我在使用夜班测试时从网页上获取数据并将其打印到我的控制台时遇到了一些麻烦。如果有人能指出我正确的方向,我会非常感激。

每当我尝试将数据传送到控制台日志时,它只会返回[object Object]。我是一个相当新的测试自动化,并且通过谷歌搜索能够理解这一点。代码如下(测试网站是google frontpage:

module.exports = {
  tags: ['google'],
  'Demo test Google' : function (client) {
client
  .url('http://google.com')
  .pause(500);
  var msg = "---> : ";

client.expect.element('body').to.be.present;

client.getText("#gbw > div > div > div.gb_7d.gb_R.gb_le.gb_ee > div:nth-child(1) > a", function(result) {
client.expect.element("#gbw > div > div > div.gb_7d.gb_R.gb_le.gb_ee > div:nth-child(1) > a").text.to.equal("Gmail");
console.log(msg.toString()+result);
});

client.getValue("#tsf > div.tsf-p > div.jsb > center > input[type='submit']:nth-child(1)", function(result) {
client.expect.element("#tsf > div.tsf-p > div.jsb > center > input[type='submit']:nth-child(1)").to.have.value.that.equals("Sök på Google");
console.log(msg+result);
});

client.end();
}
};

4 个答案:

答案 0 :(得分:4)

我刚刚遇到过这个问题,我解决这个问题的方法是使用'textContent'来捕获元素之间的字符串。

在这个例子中:

<div data-v-407a767e="" class="alert alert-success alert-styled-left alert-bordered text-center">
"Success! Check your email for the password reset link. "
<br data...>
<a data-v-407a767e="" class="alert-link">Go back to login.</a>
</div>

我使用:

检索字符串
client.getAttribute('selector', 'textContent', function(result){
        console.log("Value: ", result.value);
    });

您可以使用 textContent 属性查看此link

答案 1 :(得分:1)

今天我花了好几个小时在同一件事上摸不着头脑。看来documentation for the getText command具有误导性,即使不是错误的。我这样说是因为它说回报是string,但我看到了对象。

nightwatchjs.org example code

我能够获取元素字符串值的唯一方法是使用(假设为可选)回调参数

没有回调参数,返回的值似乎是 browser对象(即this,用于进行链式命令调用)。如果输出该值,(以及它的大量信息),您将看到对所记录的浏览器命令的引用。

返回值和文档中的这种矛盾似乎在许多命令中重复出现,例如(在我今天的情况下)getText

如果稍后您了解更多解释明显不同的返回类型(取决于是否使用回调参数),请在此处进行分享。我非常好奇。

答案 2 :(得分:0)

文档对此非常不清楚。返回值是一个对象。您可以使用

查看它
self.getText('selectorvalue', function (result) {
   console.log('result: ' + JSON.stringify(result));
});

结果将包含许多属性,最重要的是状态和值属性。

如果result.status为-1,则找不到该元素。否则result.value应该有文本。

self.getText('selectorvalue', function (result) {
    if (result.status !== -1) {
        console.log('text: ' + result.text)
    }
});

如果您只想获取存在的元素文本,并避免在元素不存在的情况下失败测试,​​那么您可以执行以下操作:

this.element('css selector', 'selectorvalue', function (present) {
     if (present.status !== -1) {
         self.getText('selectorvalue', function (result) {
             if (result.status !== -1) {
                 console.log('text: ' + result.text);
             }
         });
     }else{
         //don't try to get the text
     }
});

&#39; this.element&#39;将类似的对象返回给&#39; getText&#39;对于不存在的选择器元素,状态为-1。

当找不到元素时,元素不会使测试失败。

顺便说一句,在命令中你可能想要设置var self = this并使用self代替它。在测试中,您可能正在使用&#39;客户端&#39;或者&#39;浏览器&#39;而不是这个&#39;。

通常,您希望元素存在,因此测试应该失败。如果没有,这是一种解决方法。

答案 3 :(得分:0)

一个简单的解决方案是从对象中检索必要的值。 返回的对象具有属性,您只需要访问正确的属性。

在您的示例中,您可以使用以下内容:

my $rs = $schema->resultset('Table')->search(undef,
    { 
        '+select' => [
            { substr => [ 'docnum', 1, 2 ], -as => 'docnum1' },
            { substr => [ 'docnum', -2 ],   -as => 'docnum3' },
        ],
        order_by => [ { -desc => 'docnum1' }, { -desc => 'docnum3' } ],
    }
);