2016-11-28 94 views
0

我想使用webdriverio使用$$elements命令来访问web元素。我知道他们返回了一些网页元素,但我面临艰难的时间访问它们,可能是因为我是webdriverio的新手。 我尝试下面的代码:

var webdriverio = require('webdriverio'); 
var options = { 
desiredCapabilities: { 
    browserName: 'firefox',   
}, 
}; 
var client = webdriverio.remote(options); 

client 
     .init() 
     .url(some url) 
     .isExisting(selector).then(function(isExisting)) { 
     if(isExisting) { 
     var bText = this.$$('textarea[name="message_text]') // this code onwards it is not working 
     bText.then(function (res) { 
     console.log(res.length); 
     console.log(res); 
     res.value.forEach(function (elem) { 
       return this.click(elem.ELEMENT) 
       .setValue(elem.ELEMENT,'some text') 
       .keys('Enter') 
      }) 
     }) 

在上面的代码中,我可以看到在控制台中的阵列resforEach循环似乎并没有工作。我想为this.$$('textarea[name="message_text"]')中的每个元素执行click, setValue and keys('Enter')也无法理解为什么返回的元素是JSON对象的形式? 如果任何人都可以引导我在正确的方向,这将有助于!

+1

你尝试和阅读文档?因为他们解释了为什么 – zerohero

+0

我读得非常广泛,但我无法访问forEach循环中的元素 –

+1

您不能像这样在foreach循环中执行任何命令。在独立模式下,所有命令都是异步执行的。您需要确保正确处理由命令返回的所有承诺。使用wdio testrunner可以更轻松地执行命令,因为命令是同步执行的。 – ChristianB

回答

0

@ ChristianB的建议实际工作中,由于webdriverio的独立的应用程序是建立在webdriverjs的顶部,它的方法返回的承诺,我们需要解决这些问题properly.I能做到这一点使用map & Promise.all

var bText = this.$$('textarea[name="message_text]') 
    bText.then(function (res) { 
    console.log(res.length); 
    console.log(res); 
var promises = res.map(function (elem) { 
      return client 
      .elementIdClick(elem.ELEMENT) 
      .setValue(elem.selector,'some text') 
      .keys('Enter') 
     }) 
return Promise.all(promises) 
    }) 
2

使用'client'而不是'this'来选择元素。

var bText = client.$$('textarea[name="message_text]') // this code   onwards it is not working 
    bText.then(function (res) { 
    console.log(res.length); 
    console.log(res); 

参见使用亚军这里 - https://github.com/webdriverio/webdriverio/issues/1043

+0

'this'归因于客户端变量的范围,所以它没有任何区别。真正的问题是,我没有像@ChristianB指出的那样妥善处理承诺。不管怎么说,还是要谢谢你! –