2016-11-28 37 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指出的那樣妥善處理承諾。不管怎麼說,還是要謝謝你! –