对于常规网站,有各种工具可以执行应用程序的自动UI测试,例如: Selenium。但是,我如何为Chrome Packaged Apps执行此操作?我的应用程序大量使用特定于Chrome应用程序的API,因此将其作为常规网页托管以进行测试无法正常工作。
这方面的最佳做法或工具?
答案 0 :(得分:2)
如果您可以获得应用程序窗口句柄,那么Selenium Webdriver仍然可以正常工作。当我在一堆失败的测试结束时调用driver.getAllWindowHandles()
时,我意外地发现了这一点。测试失败是因为他们没有对应用程序窗口句柄的引用,但是 - 意外地 - 最后一次调用返回的两个窗口句柄而不是一个。
在调用driver.getAllWindowHandles()
之后,似乎应用程序窗口句柄似乎永远不会出现,但是如果你继续调用这个函数,最终它的回调将会收到一个包含浏览器[0]和app [1]的窗口句柄数组。窗口把手。我已经通过递归工作了,但没有使用简单的while循环(webdriver异步的东西)。
例如,如果您挖掘webdriver的javascript实现,请尝试从相关的bug report运行以下测试。
describe('A chrome app html page', function() {
var appHandle = "";
var recursionDepth= 0, maxDepth = 100; // edit as necessary.
function getAppWindow(){
browser.driver.getAllWindowHandles().then(function(handles){
if(handles.length == 1){
recursionDepth += 1;
if (recursionDepth == maxDepth) return false;
getAppWindow();
}
if(handles.length == 2){
browser.driver.switchTo().window(handles[1]);
browser.driver.getWindowHandle().then(function(currentHandle){
console.log("handles are" + handles);
console.log("current handle is " + currentHandle);
appHandle = currentHandle;
});
}
});
}
getAppWindow();
it('is on the second window handle', function(){
expect(browser.driver.getWindowHandle()).toEqual(appHandle);
}, 20000);
});
你需要在某处设置--load-and-launch-app = flag,正如Antony所指出的那样。我的量角器配置文件如下所示:
exports.config = {
seleniumAddress: '<address of server>',
capabilities: {
'browserName': 'chrome',
'chromeOptions':{
'args': ['load-and-launch-app=<path to app code directory>']
}
},
specs: ['<path to tests>']
}
答案 1 :(得分:0)
在某些方面,我认为测试Chrome应用程序类似于测试本机应用程序 - 这里使用的典型方法包括在代码中构建额外的挂钩以进行测试,并利用OS提供的自动化工具(可访问性服务,OSX自动化程序等)。 )
这可能有所帮助:chrome支持命令行标记:
<path to chrome> --load-and-launch-app=<path to app code directory>
在启动时,会导致它加载应用程序源代码的解压缩版本(相当于从chrome:// extensions页面点击“load unpacked extension ..”),然后发送chrome.app.runtime .on在您的代码中发布了事件。