使用 $$ 或 webdriverio 中的元素访问元素

Accessing elements using $$ or elements in webdriverio

我想使用 webdriverio 使用 $$elements 命令访问网络元素。我知道它们 return 网络元素数组,但我很难访问它们,可能是因为我是 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') 也无法理解为什么 returned 元素采用 JSON 对象的形式? 如果有人能指导我正确的方向,那将会有所帮助!

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

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);

在这里查看 runner 的用法 - https://github.com/webdriverio/webdriverio/issues/1043

@ChristianB 的建议实际上奏效了,因为 webdriverio 的独立应用程序是建立在 webdriverjs 之上的,其方法 return 承诺我们需要解决它们 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)
   })