我希望我能正确地表达这个问题。基本上我使用定位器来查找一组元素,然后我想找到该组中的特定元素。
我是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)
任何帮助表示赞赏。感谢。
答案 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的量角器版本。
答案 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)
});
});
});
感谢您的帮助。