错误:profile.getTemplateDir不是函数

时间:2017-09-12 12:02:44

标签: selenium selenium-webdriver protractor

我正在尝试使用带有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
  },
};

有谁知道为什么会触发此错误以及如何解决它?

由于

1 个答案:

答案 0 :(得分:1)

所以我已经深入研究了这个问题调试代码,这似乎是目前selenium web-driver中的限制/ bug

getMultiCapabilities返回多个浏览器时,量角器会创建一个进程的分支来运行测试

Fork Process

然后将此分叉进程发送给您创建为JSON的配置文件

ChildProcess Send

子进程只能以文本形式接收JSON数据,而不能以Profile对象的形式接收

Child Process Jsonify

使用配置文件对象调用稍后的createGeckodriver函数。但是作为createGeckodriver的代码,它总是期待一个配置文件对象

Create GeckoDriver profile

因此,需要在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
    }
};