如何以编程方式在 Protractor 中设置下载路径?

How to programmatically set download path in Protractor?

我正在尝试为量角器在 conf.js 中动态设置 Chrome 下载路径。我们的网络服务导出一个文件,我正在编写一个测试,需要知道下载文件的位置以便验证它。现在,我正在努力设置浏览器的下载路径。问题是我团队的其他成员和构建机器也将 运行 此测试并且没有我可以选择的单一下载路径适用于每台开发和构建机器。看了一些资料后,我认为最好的解决方案是从 onPrepare 函数中的 getCapabilities() 函数中获取用户数据目录,然后将其设置为下载目录,如下所示:

onPrepare: function () {
    var jasmineReporters = require('jasmine-reporters');
    jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter( { 
        savePath: 'reports', consolidateAll: true } ));
    var cap = browser.getCapabilities();
    // Set prefsDict using cap.caps_.userDataDir
},
capabilities: {
    'chromeOptions': {
        'prefs': prefsDict
    }
}

这将允许代码是动态的,但 getCapabilities returns 是一个承诺,因此上面的代码将无法运行,因为 conf.js 将在承诺解决之前完成配置对象的构建。在 getCapabilities 上使用 then 函数没有帮助,因为我无法在 then 函数中构造我的配置对象的功能部分。我不能在 onPrepare 函数之外调用 getCapabilities,因为 conf.js 本身没有它的上下文。设置网络路径对于团队的设置也是不可行的。

有没有其他人解决过类似的问题?有没有其他方法以编程方式设置 Chrome 的下载路径?

这可能无法以您希望的方式解决问题,但您可以 运行

protractor conf.js --capabilities.chromeOptions.prefs 'path/to/user/folder'

如果用户足够了解、查找或存储该信息。


编辑:

您可以使用 .execute() 强制 browser.getCapabilities(); 完成,然后再转到下一个语句。

通常由 protractor.promise.controlFlow().execute( myPromise )

调用

不过,我认为 execute() 也是 returns 一个承诺,因此您可能会回到原来的想法。