Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从无序列表中选择一个值-错误";elementIdAttribute不是一个函数;_Javascript_Selenium_Nightwatch.js - Fatal编程技术网

Javascript 从无序列表中选择一个值-错误";elementIdAttribute不是一个函数;

Javascript 从无序列表中选择一个值-错误";elementIdAttribute不是一个函数;,javascript,selenium,nightwatch.js,Javascript,Selenium,Nightwatch.js,我无法从下拉列表中访问值。该列表是使用Bootstrap的dropdown.js创建的 我在“Nightwatch”中创建了一个自定义命令,其中包含两个输入参数:下拉按钮的“locator”和要在列表中找到的值。 应该从下拉列表中选择输出值 问题:下拉菜单打开,但尝试从中访问值时会产生错误: TypeError:this.elementIdAttribute不是函数 我已经阅读了所有关于堆栈溢出的文章,基于它们,语法是正确的。我没有主意了 注释下是下拉元素的路径,并更改li:nth child(

我无法从下拉列表中访问值。该列表是使用Bootstrap的
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);
        })         
};