使用setInterval在nightwatch js中保持滚动

时间:2017-11-13 01:57:50

标签: javascript google-chrome selenium-webdriver nightwatch.js

我有一个nightwatch js脚本,它将在我的网页中滚动 这是我的自定义命令脚本

'use strict'

exports.command = function (param) {
    this.execute(function (param) {
        $(window).scrollTop(param)
    }, [param])
}

然后从我的测试文件中调用滚动脚本。这是我的剧本

module.exports = {
    'Scrolling testing': function (client) {
        client.url('http://localhost:1200/').waitForElementVisible('div.user-item', 5000);
        let i = 50
        setInterval(function () {
            console.log(i)
            client.scrollTo(i)
            i += 50
        }, 500)
    }
};

我只想用setInterval每500毫秒进行一次滚动操作,但浏览器只滚动一次(但控制台日志继续运行)。任何人都可以解决这个问题..

抱歉英语不好:(

1 个答案:

答案 0 :(得分:0)

我会做一些选择来获得你想要的行为,但我不知道哪一个会让你满意:

  1. 使用performSee documentation here
  2. perform命令使您能够执行某些代码,它可以是异步的,因此您可以执行类似示例#1的操作(出于某种原因,如果我将代码置于其下面,则不会被格式化)

    1. 使用executeAsyncSee documentation here)代替execute
    2. execute命令运行同步,因此可能在第一次执行后继续测试然后结束。所以相反,使用executeAsync并在其中移动整个setInterval函数,这样你就不需要自定义命令(imho,我会删除它,因为不做那么多事情)。参见示例#2

      示例#1

      client
          .url('http://localhost:1200/')
          .waitForElementVisible('div.user-item', 5000)
          .perform(function(client, done){
              let i = 50, maxExecutions = 10, intervalTime = 0;
              intervalTime = setInterval(function () {
                  console.log(i);
                  client.scrollTo(i);
                  i += 50;
                  maxExecutions++;
                  if(maxExecutions===10) {
                      clearInterval(intervalTime); //to prevent an infinite loop
                      done();
                  }
              }, 500)
          })
      

      示例#2

      module.exports = {
          'Scrolling testing': function (client) {
              client
                  .url('http://localhost:1200/')
                  .waitForElementVisible('div.user-item', 5000)
                  .executeAsync(function (param, done) {
                      let i = 50, maxExecutions = 10, intervalTime = 0;
                      intervalTime = setInterval(function () {
                          maxExecutions++;
                          console.log(i);//will be logged on browser console
                          $(window).scrollTop(param);
                          i += 50
                          if(maxExecutions===10){
                              clearInterval(intervalTime);
                              done(/*you can send some data here*/)
                          }
                      }, 500)
                  }, [], function(/*the data that you have send*/){
                      //do something
                  })
          }
      };