如何使用protractor-webdriver js链接搜索调用

时间:2016-04-15 18:10:55

标签: selenium-webdriver protractor

我希望我能正确地表达这个问题。基本上我使用定位器来查找一组元素,然后我想找到该组中的特定元素。

我是async-js和protractor-webdriver的新手,但不是js的新手(一般而言),并且熟悉其他webdriver实现。代码可能是展示我尝试做的最佳方式:

var findDatepickerDay = function(month, year, day) {
    var tds = element.all(by.css('.ui-datepicker-calendar tbody td:not(.ui-datepicker-unselectable)'));

    tds.then(function(tds) {
        tds.map(function(td){
            var my= {};
            return td.getAttribute('data-month').then(function (m) {
                my.month = m;
            }).then(function(m) {
                td.getAttribute('data-year').then(function (y) {
                    my.year = y;
                }).then(function() {
                    if (my.month == month && my.year == year) {
                        // console(my); // this returns the anticipated result

                        // a tag contains the day

                        /*td.findElement(by.tagName('a')).then(function(tag) {
                            // findElement is undefined
                        });*/

                        /*td.getDriver().findElement(by.tagName('a')).then(function(tag) {
                            // findElement is undefined
                        });*/
                    }
                });
            });
        });
    });
};

我的主要问题是如何在td中找到元素?

第二个问题:是否有更好的方法。遗憾的是,现在有很多实现在网络上反弹,很难确定哪些方法1)有效,2)是当前的,3)最佳实践。每次遇到问题时,我都会开始研究,发现我需要安装一些新的库(我的软件包列表从3-10开始一夜之间)。

我正在使用:量角器(2.5.1)依赖于selenium-webdriver(2.47.0)

任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

这可能不是一个确切的答案,但希望能指出你正确的方向。我今天早些时候正在使用一张桌子,需要在桌子下抓取所有<tr>(而不是你的<td>)。

var table = element(by.css('#tableID'));
table.all(by.css('tbody tr')).count().then(function (count) {
        expect(count).toEqual(3);
    });

您需要将count()替换为您想要完成的任何内容。

在您的情况下,您需要知道<td>下的元素标记的类型,并将其与上面的内容链接起来。

table.all(by.css('tbody tr td **whatever Element tag**')).then(function() {}

就链接而言,它适用于多个元素,如果需要,您可以在一行中完成。即。

var something = element(by.css('.parent')).element(by.css('.child')).

来源:https://angular.github.io/protractor/#/api?view=ElementFinder.prototype.element

此外,由于您使用的是Protractor,因此建议您使用element而不是findElement - findElement将从webdriver返回原始webelement对象,而{{1} }将返回称为element的webelement的量角器版本。

来源:https://github.com/angular/protractor/issues/1008

答案 1 :(得分:0)

我能够使用一些发布的建议并将过滤移动到选择器中,将其转到下一个阶段。我不确定多属性扇区是否适用于这些库,但我猜他们会这样做。事实证明,在这种情况下我不需要进行链接。

var as = element.all(by.css('.ui-datepicker-calendar tbody td[data-month="'+month+'"][data-year="'+year+'"]:not(.ui-datepicker-unselectable) a'));


as.then(function(as) {
    as.map(function(a) {
        var my = {
            month:month,
            year:year
        };
        return a.getInnerHtml().then(function (d) {
            my.day = d;
            console.log(my)
        });
    });
});

感谢您的帮助。