酱实验室未能执行javascript

时间:2017-07-12 03:17:38

标签: javascript selenium selenium-webdriver webdriver saucelabs

我正在使用Selenium WebdriverJs与Mocha一起通过Travis CI在Sauce Labs上运行测试。我已经解决了我的问题,没有任何项目依赖。请帮忙。

所以,如果我尝试定义一个具有访问URL和向下滚动的属性的附加对象,在测试脚本本身内部,然后使用该对象做东西,那么它工作正常。测试脚本的链接位于https://github.com/Princu7/open-event-webapp/blob/stripped/test/serverTest.js

如果我们这样做:

var eventPage = {                                                                                                                      

  init: function(webdriver) {                                                                                                          
    this.driver = webdriver;                                                                                                           
  },                                                                                                                                   

  visit: function(url) {                                                                                                               
    return this.driver.get(url);                                                                                                       
  },                                                                                                                                   

  scrollDown: function() {                                                                                                             
    function scroll() {                                                                                                                
      window.scrollTo(0, arguments[0]);                                                                                                
    }                                                                                                                                  
    return this.driver.executeScript(scroll, 800);                                                                                     
  }                                                                                                                                    
};     
var driver = // Initialize the selenium webdriver
eventPage.init(driver)
eventPage.visit('http://reddit.com')
eventPage.scrollDown().then(function() {
  console.log("This works fine on Sauce Labs");
});

这在Sauce Labs上运行良好。以下是Travis构建https://travis-ci.org/Princu7/open-event-webapp/builds/252652917的链接以及Sauce Build https://saucelabs.com/beta/tests/4cf734a141fb42548fff1ee623130c44/logs#3的链接

现在,如果我创建一个名为eventPage.js的文件并将包含所有上述函数的文件导入到测试脚本中,那么它就不起作用了。该文件的链接为https://github.com/Princu7/open-event-webapp/blob/stripped2/src/selenium/eventPage.js,测试脚本的链接为https://github.com/Princu7/open-event-webapp/blob/stripped2/test/serverTest.js

module.exports = {                                                                                                                     

  init: function(webdriver) {                                                                                                          
    this.driver = webdriver;                                                                                                           
  },                                                                                                                                   

  visit: function(url) {                                                                                                               
    return this.driver.get(url);                                                                                                       
  },                                                                                                                                   

  scrollDown: function() {                                                                                                             
    function scroll() {                                                                                                                
      window.scrollTo(0, arguments[0]);                                                                                                
    }                                                                                                                                  
    return this.driver.executeScript(scroll, 800);                                                                                     
  }                                                                                                                                    
};  

然后将其导入我的测试脚本

var eventPage = src('path of the above file');
var driver = // Initialize the selenium driver
eventPage.init(driver) 
eventPage.visit('http://reddit.com');
eventPage.scrollDown().then(function() {
  console.log("This given an error");
});

这会给Sauce Labs带来错误。以下是Travis CI https://travis-ci.org/Princu7/open-event-webapp/builds/252655787和Sauce Labs Link https://saucelabs.com/beta/tests/5d240513c5e74e639b9abb320316592d/logs#3上失败构建的链接。只是为了确认,这两种方法都在我的本地机器上运行。请帮忙。我花了这么多时间在这上面。谢谢!!祝你有愉快的一天!

1 个答案:

答案 0 :(得分:2)

模块被缓存,导入的模块是类原型。因此,您需要创建一个新实例以避免冲突:

var EventPage = require('./EventPage.js');

var eventPage = Object.create(EventPage);
eventPage.init(driver) 
eventPage.visit('http://reddit.com');
eventPage.scrollDown().then(function() {
  console.log("This given an error");
});

修改

这个问题与伊斯坦布尔有关。应用程序在scroll函数中注入一个全局变量来跟踪执行,但该变量保持未声明,因为它在浏览器中而不是在节点中执行。

解决此问题的一种方法是使用脚本作为字符串调用executeScript

return this.driver.executeScript("window.scrollTo(0, arguments[0]);", 800);