根据文档,要按名称获取单个属性,您可以在WebElement
上使用.getAttribute()
:
var myElement = element(by.id('myId'));
expect(myElement.getAttribute('myAttr')).toEqual('myValue');
但是如何获得元素的所有属性?
Protractor API中没有关于此用例/功能的信息。
答案 0 :(得分:10)
您可以展开javascript' Element
类型并添加getAttributes()
功能:
Element.prototype.getAttributes = function() {
return (function (node) {
var attrs = {};
for (var i=0;i<node.length;i++) {
attrs[node.item(i).name] = node.item(i).value;
}
return attrs;
})(this.attributes);
};
然后您可以使用与一个属性相同的方法来测试属性的完整性:
var myElement = element(by.id('myId'));
expect(myElement.getAttributes()).toEqual({'attr1': 'value1', 'attr1': 'value1', ... });
答案 1 :(得分:1)
使用executeScript()
执行一个脚本,该脚本形成一个从element.attributes
读取它们的属性列表(内部的js部分取自here):
var elm = element(by.id('runButton')).getWebElement();
browser.executeScript(
'var items = {}; \
for (index = 0; index < arguments[0].attributes.length; ++index) { \
items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value \
}; \
return items;', elm).then(function (attrs) {
console.log(attrs);
});
此处attrs
将包含元素属性的字典/对象,其中键作为属性名称,值作为属性值。
演示(使用angularjs.org tutorial page,获取header
的所有属性):
$ node node_modules/protractor/bin/elementexplorer.js https://docs.angularjs.org/tutorial
Getting page at: https://docs.angularjs.org/tutorial
> var elm = element(by.tagName('header')).getWebElement();
> browser.executeScript('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', elm).then(function (attrs) {
... console.log(attrs);
... });
{ class: 'header header-fixed', 'scroll-y-offset-element': '' }
不是很漂亮和紧凑,但对我有用。很高兴看到更好的替代品。
更新(对上述方法的改进):
如果我定义一个常规函数并将其传递给它,它也会起作用:
function getAllAttributes (arguments) {
var items = {};
for (index = 0; index < arguments[0].attributes.length; ++index) {
items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value;
}
return items;
}
browser.executeScript(getAllAttributes, elm).then(function (attrs) {
console.log(attrs);
});
答案 2 :(得分:1)
如果您需要的属性以数据为前缀,您应该能够使用元素的数据集,这会使执行脚本缩小一点:
browser.executeScript('return arguments[0].dataset;', elm).then(function (attrs) {
console.log(attrs);
});
答案 3 :(得分:1)
您必须使用browser.executeScript()
函数调用而不是protractor API,因为Element.attributes
不在量角器API实现中:
var elem = element(by.id('runButton'));
browser.executeScript("return arguments[0].attributes", elem.getWebElement())
.then(function (attrs) {
console.log(attrs.length); // outputs numbers of attributes.
// access collection of Attr objects
console.log(attrs[0].isId); // outputs `true`
console.log(attrs[0].name); // outputs `id`
console.log(attrs[0].value); // outputs `runButton`
});
请记住,在说属性时,它意味着命名的地图结构,而不是DOM模型上下文中的数组。这意味着您必须使用NamedNodeMap来访问Attr个对象的集合。
它的工作方式与@ alecxe的答案相同,没有迭代部分。