7
votes

Comment envoyer une tête de requête HTTP à l'aide de SELENIUM 2?

Je devais envoyer une demande HTTP avec quelques en-têtes modifiés. Après plusieurs heures, essayez de trouver une méthode équivalente à celle de Selenium RC selenium.addcustomRequestheader code> pour selenium 2, j'ai abandonné et utilisé JavaScript à mes besoins. Je m'attendais à ce que cela soit beaucoup plus facile!

Est-ce que quelqu'un connaît une meilleure méthode? P>

C'est ce que j'ai fait: P>

JavaScript.js h3>
// ...

@Test
public void testFirstLogin() throws Exception {
    WebDriver driver = new FirefoxDriver();

    String url = System.getProperty(Constants.URL_PROPERTY_NAME);
    driver.get(url);

    // Using javascript to send http headers
    String scriptResource = this.getClass().getPackage().getName()
        .replace(".", "/") + "/javascript.js";

    String script = getFromResource(scriptResource)
            + "test.sendHttpHeaders(\"" + url + "\", \"" + h1Name
            + "\", \"" + h1Val + "\", \"" + h2Name + "\", \"" + h2Val + "\");";
    LOG.debug("script: " + script);

    ((JavascriptExecutor)driver).executeScript(loginScript);

    // ...
}

// I don't like mixing js with my code. I've written this utility method to get
// the js from the classpath
/**
 * @param src name of a resource that must be available from the classpath
 * @return new string with the contents of the resource
 * @throws IOException if resource not found
 */
public static String getFromResource(String src) throws IOException {
    InputStream is = Thread.currentThread().getContextClassLoader().
            getResourceAsStream(src);
    if (null == is) {
        throw new IOException("Resource " + src + " not found.");
    }
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);

    String line = null;
    int nLines = 0;
    while (null != (line = br.readLine())) {
        pw.println(line);
        nLines ++;
    }
    LOG.info("Resource " + src + " successfully copied into String (" + nLines + " lines copied).");
    return sw.toString();
}

// ...


0 commentaires

4 Réponses :


4
votes

Malheureusement, vous ne pouvez pas changer d'en-têtes avec selenium 2. Cela a été une décision consciente sur la partie des équipes car nous essayons de créer un cadre d'automatisation du navigateur qui émule ce qu'un utilisateur peut faire.


2 commentaires

Merci! Je comprends ... il semble donc que JavaScript soit le moyen approprié (et probablement seulement) de faire cela ... Dans tous les cas, il reste possible dans Firefox à l'aide des plugins (voir par exemple Modifier les en-têtes )


Automatisé; Qu'en est-il d'avoir votre outil de test imiter différents états sans avoir à les créer? Par exemple, authentifier une demande en envoyant les informations d'identification sur l'en-tête ou simulant une URL d'origine différente - Mon équipe de développement est en fait bloquée car la détection d'URL d'origine est une partie importante de notre flux de travail et la possibilité de la simuler sans avoir à avoir un raisonnable Nombre d'URL disponibles est, apparemment, pas quelque chose que l'équipe Selenium 2 pensait que je pourrais vouloir faire. Savez-vous comment je pourrais faire une plaidoyer pour changer l'esprit de l'équipe?



4
votes

Selon la réponse d'Alberto, vous pouvez ajouter des en-têtes Modifier le profil Firefox si vous l'utilisez:

FirefoxDriver createFirefoxDriver() throws URISyntaxException, IOException {
    FirefoxProfile profile = new FirefoxProfile();
    URL url = this.getClass().getResource("/modify_headers-0.7.1.1-fx.xpi");
    File modifyHeaders = modifyHeaders = new File(url.toURI());

    profile.setEnableNativeEvents(false);
    profile.addExtension(modifyHeaders);

    profile.setPreference("modifyheaders.headers.count", 1);
    profile.setPreference("modifyheaders.headers.action0", "Add");
    profile.setPreference("modifyheaders.headers.name0", SOME_HEADER);
    profile.setPreference("modifyheaders.headers.value0", "true");
    profile.setPreference("modifyheaders.headers.enabled0", true);
    profile.setPreference("modifyheaders.config.active", true);
    profile.setPreference("modifyheaders.config.alwaysOn", true);

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setBrowserName("firefox");
    capabilities.setPlatform(org.openqa.selenium.Platform.ANY);
    capabilities.setCapability(FirefoxDriver.PROFILE, profile);
    return new FirefoxDriver(capabilities);
}


1 commentaires

+1 Belle solution de contournement! Malheureusement, applicable uniquement si vous utilisez Firefox, et si vous souhaitez lier le plugin modify_headers . Je sens la bonne réponse est toujours Réponse de l'automatisé .



0
votes

J'ai rencontré le même problème il y a 2 semaines. J'ai essayé l'approche suggérée par Carl, mais cela semblait un peu de "frais généraux" pour réaliser cette tâche.

À la fin, j'ai utilisé la bibliothèque FiddlerCore afin d'héberger un serveur proxy dans mon code et d'utiliser simplement la construction en proxy. Caractéristique du pilote Web 2. Cela fonctionne plutôt bien et est beaucoup plus intuitif / stable à mon avis. En outre, cela fonctionne pour tous les navigateurs et vous ne dépendez pas des fichiers binaires dont vous avez besoin pour entretenir dans votre référentiel de code.

Voici un exemple fabriqué en C # pour chrome (Firefox et IE sont très similaires) xxx


0 commentaires

0
votes

(Cet exemple est effectué à l'aide de Chrome)

Voici comment j'ai corrigé le problème dans mon cas. Espérons que, pourrait être utile pour toute personne ayant une configuration similaire. P>

  1. Ajoutez l'extension de mod modique au navigateur Chrome Li> ol>

    Comment télécharger le module de moût? LIEN P>

       ((Javascript)driver).executeScript(
             "localStorage.setItem('profiles', JSON.stringify([{  title: 'Selenium', hideComment: true, appendMode: '', 
                 headers: [                        
                   {enabled: true, name: 'token-1', value: 'value-1', comment: ''},
                   {enabled: true, name: 'token-2', value: 'value-2', comment: ''}
                 ],                          
                 respHeaders: [],
                 filters: []
              }]));");
    


0 commentaires