我正在尝试使用带有firefox和chrome的量角器实现多浏览器测试。但是对于测试,我需要更改下载路径。在chrome中,它可以工作,但在firefox中,我发现的解决方案涉及更改firefox的配置文件。我也找到了一种方法,就像这个问题Set firefox profile protractor的答案一样。
但是当我尝试使用修改过的个人资料的一个firefox实例运行多个导航器实例时,我总是收到错误profile.getTemplateDir is not a function
。
以下是我的量角器配置文件中的代码:
var q = require('q');
var FirefoxProfile = require("selenium-webdriver/firefox").Profile
function getProfiles() {
let deferred = q.defer();
let multiCapabilities = [{
browserName: 'chrome'
}]
deferred.resolve(multiCapabilities);
let firefoxProfile = new FirefoxProfile();
firefoxProfile.setPreference("browser.download.folderList", 2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting", false);
firefoxProfile.setPreference("browser.download.dir", '/tmp');
let foxCapabilities = {
browserName: 'firefox',
firefox_profile: firefoxProfile
};
multiCapabilities.push(foxCapabilities);
deferred.resolve(multiCapabilities);
return deferred.promise;
}
exports.config = {
seleniumAddress: "http://localhost:4444/wd/hub",
specs: [
'spec.js'
],
framework: 'jasmine2',
getMultiCapabilities: getProfiles,
jasmineNodeOpts: {
defaultTimeoutInterval: 30000
},
};
有谁知道为什么会触发此错误以及如何解决它?
由于
答案 0 :(得分:1)
所以我已经深入研究了这个问题调试代码,这似乎是目前selenium web-driver中的限制/ bug
当getMultiCapabilities
返回多个浏览器时,量角器会创建一个进程的分支来运行测试
然后将此分叉进程发送给您创建为JSON的配置文件
子进程只能以文本形式接收JSON数据,而不能以Profile
对象的形式接收
使用配置文件对象调用稍后的createGeckodriver
函数。但是作为createGeckodriver
的代码,它总是期待一个配置文件对象
因此,需要在Selenium webdriver本身修复此代码,并检查发送的配置文件是否已编码。您还需要修复已使用的代码以对配置文件进行编码。下面是修补Selenium驱动程序以允许发送编码的配置文件
后的工作原理var firefox = require('selenium-webdriver/firefox');
var q = require('q');
var FirefoxProfile = require("selenium-webdriver/firefox").Profile
var makeFirefoxProfile = function (preferenceMap) {
var deferred = q.defer();
var firefoxProfile = new FirefoxProfile();
for (var key in preferenceMap) {
firefoxProfile.setPreference(key, preferenceMap[key]);
}
firefoxProfile.encode().then(function(encodedProfile){
cap = {
"browserName": "firefox",
marionette: true,
"firefox_profile": encodedProfile,
};
deferred.resolve(cap);
});
return deferred.promise;
};
exports.config = {
seleniumAddress: "http://localhost:4444/wd/hub",
specs: [
'spec.js'
],
framework: 'jasmine',
getMultiCapabilities: function () {
return q.all([
{
browserName: 'chrome'
},
makeFirefoxProfile(
{
"browser.download.folderList": 2,
"browser.download.dir": "/path/to/save/downloads",
"browser.helperApps.neverAsk.saveToDisk": "application/zip"
}
)
]);
},
jasmineNodeOpts: {
defaultTimeoutInterval: 180000
}
};