我正在尝试使量角器为非角度站点工作,我在尝试读取嵌套webelement的属性时遇到了麻烦,但它一直在返回错误。不知道为什么。有什么想法吗?
html看起来像这样 1
测试脚本:
browser.driver.findElements(by.css('.row')).then(function(elem){
elem[1].findElements(by.css('.col-4.col-12-sm')).then(function (elems) {
console.log(elems.length);
for(i=0; i<=elems.length; i++){
elems[i].findElement(by.tagName('a')).getAttribute("data-post-id").then(function(attr){
console.log(attr);
});
}
});
});
错误:
Failed: Cannot read property 'findElement' of undefined
Stack:
TypeError: Cannot read property 'findElement' of undefined
at /Users/skabir/Documents/protractor-room5/test/homepage.js:17:29
at ManagedPromise.invokeCallback_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1366:14)
at TaskQueue.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2970:14)
at TaskQueue.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2953:27)
at asyncRun (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2813:27)
at /usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:676:7
at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: Run it("displaying first element") in control flow
at Object.<anonymous> (/usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:86:14)
From asynchronous test:
Error
at Suite.<anonymous> (/Users/skabir/Documents/protractor-room5/test/homepage.js:12:5)
at Object.<anonymous> (/Users/skabir/Documents/protractor-room5/test/homepage.js:1:1)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
答案 0 :(得分:0)
试试这个:
let cols = $$('.row').get(1).$$('.col-4.col-12-sm')
cols.count().then(console.log)
cols.each((col, index)=> {
col.$('a').getAttribute('data-post-id').then(console.log)
})
最好不要调用webdriverJS包装函数,并使用protractorjs api。
答案 1 :(得分:0)
您正在错误地使用for循环。元素的索引来自0 to length-1
。你有从0 to length
运行的循环索引,这就是你可能看到调用未定义元素的原因
作为关于最佳实践的旁注1.你为什么要在承诺中写下承诺。你只是应该链接。你正在创建回调地狱般的场景。 2.使用for-each而不是for循环
可能会像以下一样工作
browser.driver.findElements(by.css('.row')).then(function(elem){
return elem[1].findElements(by.css('.col-4.col-12-sm'))
}).then(function (elems) {
elems.forEach(function(element) {
elems[i].findElement(by.tagName('a')).getAttribute("data-post-id").then(function(attr){
console.log(attr);
});
});
});
还有一个重点......看起来你错误地识别了标签-a。 css .col-4.col-12-sm
不是css .row
的子元素,也可能是您身份不明的原因。在实际开始编码之前确定最佳定位策略始终是非常重要的。你可以这样做,并保持简单。
browser.driver.findElements(by.css('.col-4.col-12-sm a')).then(function(elems){
elems.forEach(function(element) {
element.getAttribute("data-post-id").then(function(attr){
console.log(attr);
});
});
});