Comment envoyer un http RequestHeader à l'aide de Sélénium 2?
J'ai besoin d'envoyer une requête Http avec un peu modifié les en-têtes. Après plusieurs heures à essayer de trouver une méthode équivalente à celle de Selenium RC Selenium.addCustomRequestHeader
pour le Sélénium 2, j'ai abandonné et utilisé du JavaScript pour mes fins. J'ai attendu ce sera beaucoup plus facile!
Quelqu'un sait-une meilleure méthode?
C'est ce que j'ai fait:
javascript.js
var test = {
"sendHttpHeaders": function(dst, header1Name, header1Val, header2Name, header2Val) {
var http = new XMLHttpRequest();
http.open("GET", dst, "false");
http.setRequestHeader(header1Name,header1Val);
http.setRequestHeader(header2Name,header2Val);
http.send(null);
}
}
MyTest.java
//...
@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();
}
//...
Avis: Pour simplifier ce post, j'ai édité mon code d'origine. J'espère que je n'ai pas introduit des erreurs!
OriginalL'auteur Alberto | 2011-06-25
Vous devez vous connecter pour publier un commentaire.
Malheureusement vous ne pouvez pas modifier les en-têtes avec le Sélénium 2. Cela a été une décision consciente sur les équipes de la partie que nous essayons de créer un navigateur automatisation cadre qui émule ce que l'utilisateur peut faire.
AutomatedTester; qu'en ayant votre outil de test émuler différents états sans avoir à les créer? Par exemple, l'authentification d'une demande par l'envoi d'informations d'identification sur l'en-tête, ou en simulant une origine différente de l'URL de mon équipe de développement est en fait bloqué à cause de l'URL d'origine de détection est une partie importante de nos flux de production et la possibilité de simuler sans avoir un nombre raisonnable d'Url qu'il est, apparemment, pas quelque chose que le Sélénium 2 équipe pensé que j'aimerais faire. Savez-vous comment je pourrais faire une plaider pour le changement de l'équipe de l'esprit?
OriginalL'auteur AutomatedTester
Comme par Alberto de réponse, vous pouvez ajouter ou modifier les en-têtes de à la Firefox profil si vous l'utilisez:
modify_headers
plugin. Je sens la bonne réponse est toujours AutomatedTester réponse.OriginalL'auteur Carl Pritchett
J'ai rencontré le même problème il y a 2 semaines. J'ai essayé l'approche proposée par Carl mais il me semblait un peu trop "frais généraux" à réaliser cette tâche.
À la fin, j'ai utilisé le fiddlerCore bibliothèque, dans le but d'héberger un serveur proxy dans mon code et il suffit d'utiliser la fonction de proxy web driver 2. Il fonctionne très bien et est beaucoup plus intuitive/stable à mon avis. En outre, il fonctionne pour tous les navigateurs et vous ne comptez pas sur des fichiers binaires dont vous avez besoin pour maintenir à l'intérieur de votre référentiel de code.
Voici un exemple réalisé en C# pour Chrome (Firefox et IE sont très similaires)
OriginalL'auteur Mischa