【问题标题】:How to change the browser date in protractor如何在量角器中更改浏览器日期
【发布时间】:2017-10-11 04:41:16
【问题描述】:

我的用例是我有一个 UI,它阻止操作 B,除非操作 A 在上一个日历月发生(会计生命周期疯狂 - 无关紧要)。

我正在编写一个测试来验证操作 B 是否正常工作,但我无法执行操作 B 是否正常工作,除非我有上个月发生的操作 A。我的量角器设置在真实 API 之上运行,我不会考虑模拟数据(如果我选择模拟 API 响应,这将更容易)。

API 不允许我操作操作 A 的创建/更新日期,因此我测试此场景的选项是操作底层数据库或在测试时将浏览器推送到下个月。假设我想采用浏览器方法,我该如何使用量角器?

【问题讨论】:

    标签: protractor


    【解决方案1】:

    一旦我有了操纵浏览器时间的机制,那么我选择的解决方案是启动一个场景,执行操作 A,将浏览器时间提前到未来一个月,然后执行操作 B。

    这涉及使用量角器 browser.executeScript 在浏览器上下文中运行 JS,并使用 timeshift-js 模块覆盖 JS Date 对象。

    这里是代码

    此代码正在使用:

    • 角度:1.5.10
    • 量角器:5.1.2
    • 黄瓜-js:1.3.3
    • timeshift-js:1.0.1

    我可以这样写场景:

    Feature: Travelling in time
    
      Scenario: Scenario that manipulates time
        When I view some page
        And I check what time it is
        And I do operation A
        And I advance the browser by 1 days
        And I check what time it is
        Then I can do operation B
    
      Scenario: Scenario Double Check that the next scenario gets the correct time
        When I view the list of maintenance requests
        And I check what time it is
    

    这里是步骤实现。这里没有特定于 Cucumber 的内容,因此它应该很容易适应基于 jasmine 或 mocha 的 describe/it 框架:

    const timeShiftLibraryString = fs.readFileSync(`path/to/node_modules/timeshift-js/timeshift.js`, 'utf-8')
    
    module.exports = function () {
    
      this.When(/I advance the browser by (-?[0-9]+) (day|month)s?$/, function (offset, unit) {
        const now = moment()
        const future = moment().add(offset, unit)
        const amountOfMillisecondsToAdvanceBrowser = (future.unix() - now.unix()) * 1000
        const tolerance = 15 * 1000
    
        const advanceTime = function (futureOffsetInMilliseconds, timeShiftLibraryString) {
          // these two lines are only necessary because I dont want Timeshift in my production code, only during test
          const timeshiftLibrary = new Function(timeShiftLibraryString)
          timeshiftLibrary.call(window)
    
          Date = window.TimeShift.Date
          window.TimeShift.setTime(Date.now() + futureOffsetInMilliseconds)
          return Date.now()
        }
    
        return browser.executeScript(advanceTime, amountOfMillisecondsToAdvanceBrowser, timeShiftLibraryString).then((browserTime) => {
          const expectedTime = Date.now() + amountOfMillisecondsToAdvanceBrowser - tolerance
          this.logger.debug(`Time manipulation complete: browserTime = ${moment(browserTime)}`)
          if (browserTime >= expectedTime) {
            return Promise.resolve(browserTime)
          }
    
          return Promise.reject(new Error(`advanceTime did not work: reported browserTime: ${browserTime}. Expected Time: ${expectedTime}`))
        })
      })
    
      this.When(/I check what time it is/, function () {
        const whatTimeIsItInTheBrowser = function () {
          return Date.now()
        }
         return browser.executeScript(whatTimeIsItInTheBrowser).then((browserTime) => {
          console.log(`Browser Time = ${moment(browserTime)}`)
        })
      })
    }
    

    注意事项:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      相关资源
      最近更新 更多