Javascript 从无序列表中选择一个值-错误";elementIdAttribute不是一个函数;
我无法从下拉列表中访问值。该列表是使用Bootstrap的Javascript 从无序列表中选择一个值-错误";elementIdAttribute不是一个函数;,javascript,selenium,nightwatch.js,Javascript,Selenium,Nightwatch.js,我无法从下拉列表中访问值。该列表是使用Bootstrap的dropdown.js创建的 我在“Nightwatch”中创建了一个自定义命令,其中包含两个输入参数:下拉按钮的“locator”和要在列表中找到的值。 应该从下拉列表中选择输出值 问题:下拉菜单打开,但尝试从中访问值时会产生错误: TypeError:this.elementIdAttribute不是函数 我已经阅读了所有关于堆栈溢出的文章,基于它们,语法是正确的。我没有主意了 注释下是下拉元素的路径,并更改li:nth child(
dropdown.js
创建的
我在“Nightwatch”中创建了一个自定义命令,其中包含两个输入参数:下拉按钮的“locator”和要在列表中找到的值。
应该从下拉列表中选择输出值
问题:下拉菜单打开,但尝试从中访问值时会产生错误:
TypeError:this.elementIdAttribute不是函数
我已经阅读了所有关于堆栈溢出的文章,基于它们,语法是正确的。我没有主意了
注释下是下拉元素的路径,并更改li:nth child(2)
I可以选择列表中的每个元素
下面是代码(用***包装是产生错误的地方):
通过保留此值,错误被删除。因为这个值在整个代码中都会发生变化
exports.command = function(locator, valueToClick) {
var dropdown;
var openDrop = dropdownElementLocator + '.open > div > ul > li'
// preserve the value of this since its scope changes trhoughout the code
browser = this;
browser
.click(locator)
.elements('css selector', openDrop, function(result){
console.log("number of elements = " + result.value.length);
console.log(result);
result.value.forEach(function (element){
console.log(browser.elementIdAttribute(element.ELEMENT, 'a').value);
});
var position = -1;
var i = 0;
result.value.forEach(function(value){
i++;
var loc = openDrop + ':nth-child(' + i + ') > a > span.text'
//this.element('css selector', loc, function(res) {
// console.log('value ' + i + ': ' + res)
//})
})
position = position>-1 ? position : 0;
console.log("final position " + i )
//add ".open > div > ul > li:nth-child(2) > a > span.text"
dropdownElementLocator = dropdownElementLocator + ".open > div > ul > li:nth-child(" + (position+1) + ") > a > span.text";
browser.click(dropdownElementLocator);
})
};
问题:我仍然无法访问下拉列表中的值已解决使用
只需简单说明一下,您可以将
此
传递到forEach()
中,而不是将其分配给变量。如果您这样做array.forEach(()=>{},this)
,它就会工作。然后,您将能够按照自己的方式在循环中使用this.elementIdAttribute
。看这个例子@Ivana,我遇到了同样的问题。我正在尝试从下拉列表中选择一个值,但无法做到这一点。下拉列表具有ul li
标签。我使用的命令与您的命令类似,但当我使用自定义命令使用@dropdowntranvalue
登录页面对象添加选择器时,它不会解析选择器。它正在解析选择器名称。
exports.command = function(locator, valueToClick) {
var dropdown;
var openDrop = dropdownElementLocator + '.open > div > ul > li'
// preserve the value of this since its scope changes trhoughout the code
browser = this;
browser
.click(locator)
.elements('css selector', openDrop, function(result){
console.log("number of elements = " + result.value.length);
console.log(result);
result.value.forEach(function (element){
console.log(browser.elementIdAttribute(element.ELEMENT, 'a').value);
});
var position = -1;
var i = 0;
result.value.forEach(function(value){
i++;
var loc = openDrop + ':nth-child(' + i + ') > a > span.text'
//this.element('css selector', loc, function(res) {
// console.log('value ' + i + ': ' + res)
//})
})
position = position>-1 ? position : 0;
console.log("final position " + i )
//add ".open > div > ul > li:nth-child(2) > a > span.text"
dropdownElementLocator = dropdownElementLocator + ".open > div > ul > li:nth-child(" + (position+1) + ") > a > span.text";
browser.click(dropdownElementLocator);
})
};
exports.command = function(locator, valueToClick) {
var dropdown, position;
//locator sample
//.click('#form > div.panel.panel-primary > div.panel-body > div:nth-child(1) > div > div.btn-group.bootstrap-select.form-control.parsley-validated > button')
//.click('#form > div.panel.panel-primary > div.panel-body > div:nth-child(1) > div > div.btn-group.bootstrap-select.form-control.parsley-validated.open > div > ul > li:nth-child(2) > a > span.text')
// cut " > button" from the end
var dropdownElementLocator = locator.slice(0,locator.length-9);
//var openDrop = '#form > div.panel.panel-primary > div.panel-body > div:nth-child(1) > div > div.btn-group.bootstrap-select.form-control.parsley-validated.open > div > ul li a span.text'
var openDrop = dropdownElementLocator + '.open > div > ul > li'
// preserve the value of this since its scope changes trhoughout the code
browser = this;
browser
.click(locator)
.elements('css selector', openDrop, function(result){
var i = 0;
result.value.forEach(function (jsonWebElement){
var jsonWebElementId = jsonWebElement.ELEMENT;
browser.elementIdText(jsonWebElementId, function(jsonElement){
var text = jsonElement.value;
i++;
console.log("text " + i + " : " + text + " text.indexOf(valueToClick) - " + text.indexOf(valueToClick));
if(text.indexOf(valueToClick) == 0){
position = i;
console.log("position inside loop: " + position);
}
});
});
})
.perform(function(){
position = position>-1 ? position : 1;
console.log("final position " + position )
//add ".open > div > ul > li:nth-child(2) > a > span.text"
dropdownElementLocator = dropdownElementLocator + ".open > div > ul > li:nth-child(" + position + ") > a > span.text";
browser.click(dropdownElementLocator);
})
};