如何自动测试Chrome打包应用?

时间:2014-01-09 14:24:02

标签: google-chrome-app

对于常规网站,有各种工具可以执行应用程序的自动UI测试,例如: Selenium。但是,我如何为Chrome Packaged Apps执行此操作?我的应用程序大量使用特定于Chrome应用程序的API,因此将其作为常规网页托管以进行测试无法正常工作。

这方面的最佳做法或工具?

2 个答案:

答案 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在您的代码中发布了事件。