2017-09-12 2 views
1

Ich versuche, einen Multi-Browser-Test mit Winkelmesser mit Firefox und Chrome zu implementieren. Aber für den Test muss ich den Download-Pfad ändern. In Chrome funktioniert es, aber in Firefox, die Lösung, die ich gefunden habe beteiligt das Profil von Firefox ändern. Ich habe auch einen Weg gefunden, wie in den Antworten auf diese Frage Set firefox profile protractor zu tun.Fehler: profile.getTemplateDir ist keine Funktion

Aber wenn ich versuche, mehrere Instanz des Navigators neben einer Instanz von Firefox mit geänderten Profil auszuführen, erhalte ich immer einen Fehler als profile.getTemplateDir is not a function. Hier

ist der Code in meiner Winkelmesser Konfigurationsdatei:

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 
    }, 
}; 

Hat jemand weiß, warum dieser Fehler ausgelöst wird und wie es zu lösen?

Dank

+0

Ich denke, das Problem ist, dass das Profil einmal und –

+0

für eine Instanz von Firefox funktioniert, Dieser Code durch den Rahmen wiederverwendet wird erstellt, aber wenn Ich versuche zum Beispiel eine andere Instanz von Chrome oder Firefox hinzuzufügen, dann wird der Fehler ausgelöst – aozora

+0

Ja, weil der Code beim zweiten Aufruf kein neues Profilobjekt erzeugt. Sie müssen das debuggen. –

Antwort

0

So in dieser Frage habe ich das Debuggen des Codes ausgegraben und das scheint derzeit

in Selen web-Treiber Einschränkung/bug zu sein Wenn getMultiCapabilities mehrere Browser zurückgibt, dann Winkelmesser eine Gabel von der schafft Prozess den Test

Fork Process

Dieser gegabelten Prozess ausgeführt wird dann das Profil gesendet Sie als JSON erstellt

ChildProcess Send

Die Child-kann nur JSON-Daten in Form von Text und nicht in Form eines Profile Objekt

Child Process Jsonify

Später createGeckodriver Funktion mit Profilobjekt empfangen aufgerufen wird. Aber wie der Code von createGeckodriver es immer erwartet ein Profilobjekt

Create GeckoDriver profile

Also dieser Code in Selenium repariert werden muss WebDriver selbst und es sollte prüfen, ob das Profil gesendet bereits verschlüsselt ist oder nicht. Auch der Code, den Sie verwendet haben, muss festgelegt werden, um das Profil zu kodieren. Im Folgenden finden Sie, was Treiber funktionieren würde, wenn Selen gepatcht

codiertes Profil ermöglichen das Senden
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

In derselben Ausgabe laufen - vielen Dank für Ihre Untersuchung! Ich habe mich nur gefragt, welche Versionen von Winkelmesser und Selen-Webdriver Sie verwendet haben, und ob es schon repariert wurde? – Jack

Verwandte Themen