78 votes

Se moquer d'un useragent en javascript?

Je suis à la recherche d'un moyen de modifier par programmation navigator.userAgent à la volée. Dans ma tentative a échoué à obtenir un système automatisé de javascript unité de testeur, j'ai laissé tomber et a tenté de commencer à utiliser fireunit. Immédiatement, j'ai claqué dans l'un des murs de l'aide d'un navigateur pour le test javascript.

Plus précisément, j'ai besoin de changer de navigateur.userAgent pour simuler quelques centaines de userAgent chaînes pour assurer la bonne détection et de la couverture sur une fonction donnée. navigator.userAgent est en lecture seule, alors il me semble coincé! Comment puis-je se moquer de navigateur.userAgent? User Agent Switcher (plugin) peut basculer FF du useragent, mais puis-je le faire dans le javascript?

118voto

Crescent Fresh Points 54070

Essayer:

 navigator.__defineGetter__('userAgent', function(){
    return 'foo' // customized user agent
});

navigator.userAgent; // 'foo'
 

Essayé dans FF2 et FF3.

25voto

maxyfc Points 3478

En ajoutant à du Croissant-Frais de solution, la redéfinition de l' navigator.userAgent de lecture ne semble pas fonctionner dans Safari 5.0.5 (Windows 7 et Mac OS X 10.6.7).

Besoin de créer un nouvel objet qui hérite de la navigator objet et la définition d'un nouveau userAgent getter pour masquer l'origine userAgent getter en navigator:

var __originalNavigator = navigator;
navigator = new Object();
navigator.__proto__ = __originalNavigator;
navigator.__defineGetter__('userAgent', function () { return 'Custom'; });

9voto

Bundyo Points 1627

Utiliser Object.defineProperty devrait ajouter plusieurs autres navigateurs au mélange:

 if (navigator.__defineGetter__) {
    navigator.__defineGetter__("userAgent", function () { 
        return "ua"; 
    });
} else if (Object.defineProperty) { 
    Object.defineProperty(navigator, "userAgent", { 
        get: function () { 
            return "ua";
        }
    });
}
 

Ce code devrait fonctionner (et a été testé) dans Firefox 1.5+ , Chrome 6+ , Opera 10.5+ et IE9 + . Malheureusement, Safari sur n'importe quelle plate-forme ne permet pas de changer l'utilisateurAgent.

2voto

Grant Wagner Points 14085

Je suppose que je devrais prendre une injection de dépendance approche. Au lieu de:

function myFunction() {
    var userAgent = navigator.userAgent;
    // do stuff with userAgent
}

Peut-être faire quelque chose comme:

function myFunction(userAgent) {
    // do stuff with userAgent
}

function getUserAgent() {
    window.userAgentReal = +window.userAgentReal || 0;
    return [ navigator.userAgent ][window.userAgentReal++];
}

function getUserAgentMock() {
    window.nextUserAgentMock = +window.nextUserAgentMock || 0;
    return [
        'test user agent1',
        'test user agent2',
        'test user agent3'
    ][window.nextUserAgentMock++];
}

var userAgent;
while (userAgent = getUserAgent()) {
    myFunction(userAgent);
}

Ensuite, vous pouvez "se moquer de" getUserAgent() en faisant:

function getUserAgentReal() { // formerly not 'Real'
    // ...
}

function getUserAgent() { // formerly 'Mock'
    // ...
}

Cette conception n'est pas encore complètement automatisé (vous devez renommer manuellement les getter pour effectuer vos tests), et il ajoute un tas de complexité à quelque chose d'aussi simple que d'exploitation sur navigator.userAgent, et je ne suis pas sûr de savoir comment vous auriez fait identifier des bugs en myFunction, mais j'ai juste pensé que je jetterais dehors là pour vous donner quelques idées de comment cela peut être traitée.

Peut-être l'idée de "l'injection de dépendance", présenté ici peut en quelque sorte être intégré avec FireUnit.

-3voto

Marius Points 27452

Non, je doute que vous puissiez le faire en javascript. Mais avec User Agent Switcher de Firefox, vous pouvez tester l’agent d’utilisateur que vous voulez, alors pourquoi ne pas l’utiliser?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X