断言元素列表遵循 JavaScript 承诺的规则

Asserting list of elements follow a rule with JavaScript promises

我有一组标题看起来像:

<div class='items'>
  * Some | Text *
</div>

<div class='items'>
  * Some more | Text *
</div>

鉴于页面上有许多块遵循这两种模式,我想循环遍历它们并确保它们都包含模式 '* Some [more] | Text *' 其中 [more] 是可选的,* 是任何东西。

我目前有:

yield browser

...Some code...

.elements('.items')
 .then((elementList)=>{
  for(var i = 0; i < elementList.value.length; i++){

   this.elementIdText(elementList.value[i].ELEMENT)
    .then((currElement)=>{
      var str = currElement.value;
      if(str.indexOf("Some | Text") == -1 || str.indexOf("Some more | Text") == -1){
       assert.ok(false, 'invalid string');
      }
    })

  }
 })

然而,断言似乎被忽略了,因为它们在 for 循环中(我猜这会把所有事情搞砸,因为它不是异步的??)

尽管我希望程序在其中一个字符串与所需模式不匹配时立即抛出错误,所以我假设需要一个循环。

有什么好的方法吗?

如果我在 for 循环中放置 console.log 当前行为:

Command: find element
Command: find element
... n times
log: element 1 text
log: element 2 text
... n times

它应该在哪里:

Command
log
Command
log
... n times 

以下方法可能对您有所帮助..

    //assume that i am loding list of elements by driver
    List<String> data=new ArrayList<>();

    data.add("murali");

    data.add("murali [selenium]");

    //for loop to iterate list
    for(int i=0; i<data.size(); i++){

        //using asserting to check data brought by list with actual
        //you can change here as per requirement
        //as know any one in list fails then it throws fail with out checking remaining elements in list
        assert data.get(i)=="murali" || data.get(i)=="murali [selenium]";
    }

我认为您可能需要调整上面的断言命令,因为我只是在那里使用了 equals 但与您的情况不同。

谢谢, 穆拉利

找到了不使用 q promise 库的解决方案!

(替代方法是使用 q 提供的 .all([]).then() 函数)

yield browser

...Some code...

.elements('.items')
 .then((elementList)=>{

  var chain = this; // start a promise chain

  for(var i = 0; i < elementList.value.length; i++){

   // add this whole promise to the chain every iteration
   chain = chain.elementIdText(elementList.value[i].ELEMENT)
            .then((currElement)=>{
              var str = currElement.value;
              if(str.indexOf("Some | Text") == -1 || str.indexOf("Some more | Text") == -1){
               assert.ok(false, 'invalid string');
              }
            })

  }

  // Simply return the chain of promises created
  return chain;
 })

当时的想法是 .then 只是一个承诺,它里面的内容最终会被评估。这意味着在测试完成之前可能不会评估里面的东西。

虽然一个解决方案是添加暂停(也许?),但通过创建一个承诺链,下一个承诺直到前一个承诺才会被评估,结果,测试在所有代码之后结束是 运行.