我想使用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')
})
})
在上面的代码中,我可以在控制台中看到数组res
,但forEach
循环似乎无法正常工作。我想对click, setValue and keys('Enter')
中存在的每个元素执行this.$$('textarea[name="message_text"]')
也无法理解为什么返回的元素是JSON对象的形式?
如果有人能指导我正确的方向,那将有所帮助!
答案 0 :(得分:2)
使用'客户'而不是这个'选择元素。
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
答案 1 :(得分:0)
@ ChristianB的建议实际上是有效的,因为webdriverio的独立应用程序是建立在webdriverjs之上的,其方法返回promises我们需要正确解决它们。我能够使用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)
})