2017-09-12 19 views
1

私はfirefoxとchromeで分度器を使ってマルチブラウザテストを実装しようとしています。しかし、テストのために、私はダウンロードパスを変更する必要があります。クロームでは動作しますが、firefoxでは、私が見つけた解決策はfirefoxのプロフィールを変更することでした。私はまた、この質問Set firefox profile protractorの答えのようにそれを行う方法を見つけました。エラー:profile.getTemplateDirは関数ではありません

しかし、変更されたプロファイルを持つfirefoxの1つのインスタンスの横にナビゲータの複数のインスタンスを実行しようとすると、私はいつも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 
    }, 
}; 

は、このエラーがトリガーとどのようにそれを解決することですなぜ誰もが知っていますか?セレンのWebドライバーで現在

おかげで

+0

は、私はあなたの問題は、プロファイルが一度作成し、このコードは、Firefoxの1つのインスタンスのために働くの枠組み –

+0

によって再利用されていることだと思いますが、もしエンコードされたプロファイルを送信できるようにするパッチが適用された後に働くだろうものですたとえば、クロムやFirefoxのブラウザの別のインスタンスを追加しようとすると、エラーが発生します。 – aozora

+0

コードが2回目の呼び出しで新しいプロファイルオブジェクトを生成しないためです。あなたはそれをデバッグする必要があります。 –

答えて

0

だから私は、コードのデバッグ、この問題に掘ってきたし、これは制限/バグのようですgetMultiCapabilitiesは、複数のブラウザを返すとき、分度器はのフォークを作成し、プロセスは、テストを実行するには

Fork Process

、あなたはJSON

として作成したプロファイルを送られ、このフォークプロセス

ChildProcess Send

子プロセスのみ

Child Process Jsonify

後でcreateGeckodriver機能は、プロファイルオブジェクトと呼ばれるテキストの形ではなく、Profileオブジェクトの形式でJSONデータを受信することができます。しかし、それは常にプロファイルオブジェクトに

Create GeckoDriver profile

を期待しているcreateGeckodriverのコードように、このコードは、それ自体webdriverをセレンで固定する必要があり、送信されたプロファイルが既に符号化であるかどうか、それは確認する必要があります。また、プロファイルをエンコードするために使用したコードを修正する必要があります。以下は、セレンドライバが

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 
    } 
}; 
+0

同じ問題に実行中 - あなたの調査のおかげで!私はちょうどあなたが使用していた分度器とセレンのwebdriverのバージョンが不思議でした、そしてそれがまだ修正されていれば? – Jack

関連する問題