Ram Pasala
Ram Pasala

Reputation: 5231

Accessing elements using $$ or elements in webdriverio

I want to access web elements using the $$ or elements command using webdriverio. I know they return array of web elements but I am facing tough time accessing them, probably because I am new to webdriverio. I tried the below code:

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')
           })
       })

In the above code, I can see the array res in console but the forEach loop doesn't seem to work. I want to perform click, setValue and keys('Enter') for each of the element present in this.$$('textarea[name="message_text"]') also not able to understand why the returned elements are in a form of JSON objects? If anyone could guide me in right direction that would help!

Upvotes: 0

Views: 3387

Answers (2)

Ram Pasala
Ram Pasala

Reputation: 5231

@ChristianB's suggestion worked actually,since webdriverio's standalone app is built on top of webdriverjs whose methods return promises we need to resolve them properly.I was able to do this using 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)
   })

Upvotes: 0

Gurpreet Singh
Gurpreet Singh

Reputation: 51

Use 'client' instead of 'this' to select the elements.

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

See use of runner here - https://github.com/webdriverio/webdriverio/issues/1043

Upvotes: 2

Related Questions