使用Jasmine进行Async/Await

3

我正在使用protractor和Jasmine进行测试。

假设我有一个异步的it函数。

it('something', async function(){

   for(var k = 0; k < 5 ; k++){
     (function(jj){

          /...........

          await something == whatever
         ............./

      })(k);
   }

})

我希望在for循环内使用await,但我无法这样做。

此外,我如何在protractor的each函数中使用async/await使代码更清晰?

 it('something', async function(){

   element.locator.each((x)=>{

     await element.locator.sendKeys('something')    
   })

 })

如果有人能帮忙,那就太棒了。现在我的整个测试规范看起来像一个充满了 Promise 和回调的大杂烩。

it('description', async function() {
        common.separator()
        console.log('***************************************')
        console.log('something');
        console.log('***************************************')
        common.separator();
        finished_ispresent = await common.finished.isPresent(); 
        if( finished_ispresent ==  true) {
          console.log('finished is present = ' + finished_ispresent);
          common.separator();
        }

        common.somebutton.click();
        await browser.sleep(1000);
        //array declaration for storing boolean results
        some_array =[];
        some_array1 =[];
        some_array2 =[];
        some_array3 =[];
        some_array4 =[];
        //the outer for loop 
        for(var k = 0; k < 5 ; k++){

                browser.wait(EC.visibilityOf(common.something),2000);
                common.something.click();

                Something_V = await common.something.get(k).getText(); 

                browser.wait(EC.visibilityOf(common.something),5000);
                common.something.click();
                common.datepicker(k);
         }  
});

发生的情况是事情发生得太快,导致什么都不起作用,并返回一堆错误。

先生,我还有一个关于 .each 函数的疑问。在使用异步等待时如何处理每个函数?

it('something', function(){
    element.all.locator.each((element_each)=>{
      console.log(element_each);
    })
});

你如何使用Each处理这个问题?

亲爱的先生,each函数确实返回一个Promise。这是protractor中.each函数的返回描述。https://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.each我想了解如何在for循环内部实现这个功能,请告诉我是否可能。 - undefined
1个回答

2
如果你使用 async/await,则不需要在 each 中使用闭包和嵌套的 await。
假设页面上有5个输入框,我们需要为每个输入框输入一些值,我将展示使用和不使用 async/await 的示例。
 // code non-using await
 let values= ['a', 'b', 'c', 'd', 'e'];

 it('something', function(){

   for(let i=0;i<5;i++) {

      (function(j){ // we have to use javascript closure at here
         element.all(by.css('input')).get(j).sendKeys(values[j])
      })(i);      
   }   
 })

 // code using await
 it('something', async function(){

   // you can use count() to get the total input box, rather than hardcode 5
   // let cnt = await element.all(by.css('input')).count();

   let cnt = 5;

   for(let i=0;i<cnt;i++) {
      await element.all(by.css('input')).get(i).sendKeys(values[i]) 
   }   
 })

当使用async/await时,需要注意以下两点:

1)在conf.js中禁用Protractor的Promise管理(控制流)。

// protractor conf.js
exports.config= {
   SELENIUM_PROMISE_MANAGER: false,
}

2) 任何返回 Promise 的代码行,您需要在其前面添加 await。否则脚本执行顺序会变得混乱。

it('description', async function() {
        common.separator()
        console.log('***************************************')
        console.log('something');
        console.log('***************************************')
        common.separator();
        finished_ispresent = await common.finished.isPresent(); 
        if( finished_ispresent ==  true) {
          console.log('finished is present = ' + finished_ispresent);
          common.separator();
        }

        await common.somebutton.click();
        await browser.sleep(1000);
        //array declaration for storing boolean results
        some_array =[];
        some_array1 =[];
        some_array2 =[];
        some_array3 =[];
        some_array4 =[];
        //the outer for loop 
        for(var k = 0; k < 5 ; k++){

                await  browser.wait(EC.visibilityOf(common.something),2000);
                await  common.something.click();

                Something_V = await common.something.get(k).getText(); 

                await  browser.wait(EC.visibilityOf(common.something),5000);
                await  common.something.click();
                await common.datepicker(k);
         }  
});

在`.each`中使用`await`
it('using await in each()', async function(){

    await browser.get("https://www.npmjs.com/");

    element.all(by.css('nav > ul >li >a')).each(async function(item){
        var txt = await item.getText();
        console.log(txt);
    })
})

使用async/await时,如何等待?我的意思是我在代码中使用browser.sleep。Protractor提供的等待函数对我来说效果不佳。我还使用了pageObject函数,而这个async/await会完全破坏它,并且总是返回元素未找到或过期元素错误。我已经更新了帖子,其中包含我的for循环和等待语句的示例。 - undefined
先生,common.datepicker是一个来自页面对象的函数。它也应该是异步的吗? - undefined
使用async/await时如何处理.each的情况? - undefined
尊敬的先生,我在页面上有一些使用Highcharts的图表。我发现很难在图表上悬停或点击。我已经进行了大量搜索,但没有找到合适的解决方案。是否有解决这个问题的方法? - undefined
尊敬的先生,如果您能查看一下这个帖子就好了:https://stackoverflow.com/questions/52114390/highstocks-and-protractor?noredirect=1#comment91292361_52114390我已经遇到这个问题有一段时间了。我们有没有办法实现这个? - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接