无法阅读属性' findElement'未定义的

时间:2017-02-28 10:25:13

标签: protractor

我正在尝试使量角器为非角度站点工作,我在尝试读取嵌套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)

2 个答案:

答案 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);
        });
    });
});