Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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 量角器-找到所有元素和找到的元素的循环长度,然后单击按钮_Javascript_Selenium_Protractor_Mocha.js_Chai - Fatal编程技术网

Javascript 量角器-找到所有元素和找到的元素的循环长度,然后单击按钮

Javascript 量角器-找到所有元素和找到的元素的循环长度,然后单击按钮,javascript,selenium,protractor,mocha.js,chai,Javascript,Selenium,Protractor,Mocha.js,Chai,因此,我一直在试图弄清楚如何根据“查找所有元素”的数量单击按钮x次。这意味着,如果有3个元素是由相同的类名找到的,那么我们将循环3次,然后单击按钮3次 我做过这样的事情: (新更新,选中底部的编辑帖子) 通常元素.all(by.className('btn btn remove btn outlined')).getText()是3,但可以更改为6和随机数,因此我的想法是首先读取HTML中有多少btn btn remove btn outlined元素,然后单击找到的元素的次数。因此,如果找到3

因此,我一直在试图弄清楚如何根据“查找所有元素”的数量单击按钮x次。这意味着,如果有3个元素是由相同的类名找到的,那么我们将循环3次,然后单击按钮3次

我做过这样的事情:

(新更新,选中底部的编辑帖子)

通常
元素.all(by.className('btn btn remove btn outlined')).getText()
是3,但可以更改为6和随机数,因此我的想法是首先读取HTML中有多少
btn btn remove btn outlined
元素,然后单击找到的元素的次数。因此,如果找到3,则单击按钮3次

然而,现在的问题是,它正在寻找有多少元素。它也是循环的,多次以text.length给出,但在循环内部,由于某些原因,它似乎跳过了It函数,我不明白为什么

现在它确实发现元素的长度是3,它似乎循环了那么多次,但它跳过了它的功能(这部分):

我担心我可能做了一些我不知道的错事

我怎样才能找到DOM中有多少给定元素并循环那么多次并单击移除按钮

编辑代码:

it('Click remove button', function (done) {

    element.all(by.className('btn btn-remove btn-outlined')).getText().then(function (text) {
        console.log(text.length) //returns 3
        for (var i = 0; i < 4; i++) {

            console.log(i); //Does print 0 1 2

            it('Click remove button - ' + i + '/' + text.length, function (done) {

                console.log("Remove button"); //Doesnt print

                browser.driver
                    .then(() => browser.executeScript("arguments[0].click();", element.all(by.className('btn btn-remove btn-outlined').first().getWebElement())));
                    .then(() => done());
            });

            it('Wait for fading button to be gone', function (done) {

                console.log("TIme out"); //Doesnt print

                setTimeout(function () {
                    done();
                }, 1000);

            });
        }
    })
    done();
});
it('Click remove button',函数(done){
元素.all(by.className('btn btn remove btn outlined')).getText().then(函数(文本){
console.log(text.length)//返回3
对于(变量i=0;i<4;i++){
console.log(i);//是否打印0 1 2
它('单击删除按钮-'+i+'/'+text.length,函数(完成){
console.log(“删除按钮”);//不打印
浏览器驱动程序
.然后(()=>browser.executeScript(“参数[0]。单击();”,元素.all(by.className('btn btn remove btn outlined')).first().getWebElement());
。然后(()=>done());
});
它('等待淡入淡出按钮消失',功能(完成){
console.log(“超时”);//不打印
setTimeout(函数(){
完成();
}, 1000);
});
}
})
完成();
});

您的
it
inside for循环未执行的原因是在运行时动态生成的
it
,并且测试框架Jasmine,Mocha不尊重它

据我所知,Jasmine需要在执行测试脚本文件之前加载和解析静态
it
,加载和解析阶段后面生成的动态
it
将被忽略。因此,您需要删除动态

试试下面的代码

it('Click remove button', function (done) {

    let allBtns = element.all(by.className('btn btn-remove btn-outlined'));

    allBtns.count()
    .then(function (cnt) {

        console.log('Find buttons:', cnt)

        for (let i = 0; i < cnt; i++) { // important to use let but var here.
            console.log('Remove button - ' + i + '/' + cnt);
            browser.executeScript("arguments[0].click();", allBtns.get(i).getWebElement())
            browser.sleep(1000) // sleep 1s
        }
    })
    .then(()=>{
        done();
    })

});
it('Click remove button',函数(done){
让allBtns=element.all(by.className('btn-btn-remove-btn-outlined');
allBtns.count()
.然后(功能(cnt){
console.log('Find buttons:',cnt)
对于(let i=0;i{
完成();
})
});

您有3个名为
it
的函数,这可能会导致作用域问题。在每个
it
函数中添加一条print语句,以查看调用的内容。我建议选择新的名称。另外,您正在定义
it
函数,但它们在哪里被调用?我认为这实际上是一个Mocha/Chai函数。也许我应该提到它,但我会在每个控制台上打印console.log并查看它的响应@Jortega@Jortega@Jortega我刚刚更新了密码。我通过每个console.log添加了注释。似乎
It
函数从未在循环中启动。噢,天哪!这正是我要找的!我真的很欣赏它!我会将此作为答案,我越来越理解它。看起来你不能像我想的那样嵌套it函数。你可以嵌套
it
,但它们应该是
静态的<代码>静态
这里的意思是当Jasmine在执行任何测试脚本文件之前加载测试脚本文件时,解析后Jasmine将知道给定测试脚本文件中有多少测试脚本文件,只有这些是静态的。在您的代码中,Jasmine无法在加载和解析时计算循环中的
it
,因为只有当Jasmine执行此脚本文件时,您才能知道有多少按钮以及应该增加多少按钮。但是jasmine会忽略他们哦,对了,我在跑摩卡和柴,但我相信是一样的。但我现在确实明白了原因,也明白了如何解决它。我确实有另一个问题,但我目前正在另一个线程上写它,你想让我解决它给你吗?这是相似的,但有点更先进,我想说。如果你有空的话?因为我已经输入了正确答案:)
it('Click remove button', function (done) {

    let allBtns = element.all(by.className('btn btn-remove btn-outlined'));

    allBtns.count()
    .then(function (cnt) {

        console.log('Find buttons:', cnt)

        for (let i = 0; i < cnt; i++) { // important to use let but var here.
            console.log('Remove button - ' + i + '/' + cnt);
            browser.executeScript("arguments[0].click();", allBtns.get(i).getWebElement())
            browser.sleep(1000) // sleep 1s
        }
    })
    .then(()=>{
        done();
    })

});