【问题标题】:Protractor execute non-test action in the end of the test scenario量角器在测试场景结束时执行非测试动作
【发布时间】:2021-03-24 17:06:52
【问题描述】:

我正在编写我的第一个 Protractor 测试场景,我正在探索神秘的 promise 世界。但我真的无法理解一件事。这是我的测试的样子:

let stuff = "Some data I pick up from a CSV file"

describe("Foo", function () {

  browser.waitForAngularEnabled(false) // maybe not a relevant piece of information to share but how knows

  for (let i of testdata) {
    it("Bar", function () {
      browser.driver.manage().window().maximize();
      browser.get(browser.baseUrl)
      doStuff1()
      let usefulCalculatedData = doStuff2(stuff)
      doStuff3()
      storeThisStuffInACSVFile(usefulCalculatedData);
    })
  }

})

function doStuff2(stuff){
  var today = new Date()
  let usefulCalculatedData = today.getFullYear().toString()
  + today.getMonth() + 1
  + today.getDate()
  + today.getHours()
  + stuff
  doActualStuff(usefulCalculatedData)
  return usefulCalculatedData
}

我希望在it 的末尾运行步骤“storeThisStuffInACSVFile”。但实际上,它是在测试开始时运行的!这意味着doStuff2() 的某些部分被调用...顺便说一句,所有测试都执行得很好。我真的很困惑,因为我不知道如何强制执行我想要的顺序。

提前感谢您的帮助。

【问题讨论】:

  • 看看如何处理promise,这是你的问题
  • 如果我正确理解你的问题,没有人可以帮助你只给出你发布的代码。那么根本问题在doActualStuff doStuff1doStuff3

标签: javascript typescript asynchronous protractor automated-tests


【解决方案1】:

我找到了一个结合 async/await 和 Promise 的解决方案。我不知道它是否非常标准,但是……它有效……

let stuff = "Some data I pick up from a CSV file"

describe("Foo", function () {

  browser.waitForAngularEnabled(false) // maybe not a relevant piece of information to share but how knows

  for (let i of testdata) {
    it("Bar", function () {
      browser.driver.manage().window().maximize();
      browser.get(browser.baseUrl)
      doStuff1()
      let usefulCalculatedData = doStuff2(stuff)
      // EDITED HERE
      doStuff3().then(function()
        {storeThisStuffInACSVFile(usefulCalculatedData);
      });
    })
  }

})

function doStuff2(stuff){
  var today = new Date()
  let usefulCalculatedData = today.getFullYear().toString()
  + today.getMonth() + 1
  + today.getDate()
  + today.getHours()
  + stuff
  doActualStuff(usefulCalculatedData)
  return usefulCalculatedData
}

// EDITED HERE
async function doStuff3(){
  var whateverOutput = await whatever()
  return Promis.resolve(usefulCalculatedData !== null)
}

【讨论】:

    【解决方案2】:

    利用等待的力量:

    let stuff = "Some data I pick up from a CSV file"
    
    describe("Foo", function () {
    
      browser.waitForAngularEnabled(false) // maybe not a relevant piece of information to share but how knows
    
      for (let i of testdata) {
        it("Bar", async function () {
          await browser.driver.manage().window().maximize();
          await browser.get(browser.baseUrl)
          doStuff1()
          let usefulCalculatedData = doStuff2(stuff)
          doStuff3()
          storeThisStuffInACSVFile(usefulCalculatedData);
        })
      }
    
    })
    
    function doStuff2(stuff){
      var today = new Date()
      let usefulCalculatedData = today.getFullYear().toString()
      + today.getMonth() + 1
      + today.getDate()
      + today.getHours()
      + stuff
      doActualStuff(usefulCalculatedData)
      return usefulCalculatedData
    }
    

    确保在配置文件中禁用 selenium 承诺:

    exports.config = {
     
      ...
      SELENIUM_PROMISE_MANAGER: false,
      ...
     
    };
    

    现在您不必进行承诺链接,而是使用等待,在量角器中每个 proser 函数都是一个承诺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多