我正在使用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上失败构建的链接。只是为了确认,这两种方法都在我的本地机器上运行。请帮忙。我花了这么多时间在这上面。谢谢!!祝你有愉快的一天!
答案 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);