Frage an request, forms, selenium, testing, post – Eine POST-Anfrage in Selen stellen, ohne ein Formular auszufüllen?

10

Ich habe eine Anwendung A, die ein Formular verarbeiten soll, das mit der POST-Methode gesendet wurde. Das eigentliche Formular, das die Anfrage initiiert, befindet sich in Anwendung B. Ich teste Anwendung A mit Selen und schreibe gerne einen Testfall für die Bearbeitung von Formularen.

Wie macht man das? Kann man das überhaupt in Selen machen? Anwendung A verfügt nicht über ein Formular, das diese Anforderung initiieren kann.

Beachten Sie, dass die Anforderung POST verwenden muss, ansonsten könnte ich einfach die WebDriver.get (url) -Methode verwenden.

Duplikat vonstackoverflow.com/questions/5660956/… ? rwitzel
@Scott: Ich habe keinen Zugriff auf Anwendung B, in der sich das Formular befindet. Juha Syrjälä
Ich denke, Form-Mocking ist der beste Weg. Sie können dieses Formular auch dynamisch mit JavaScript erstellen neoascetic
Warum füllen Sie das Formular nicht mit Selen aus und senden es ab und stellen sicher, dass Ihnen nach Abschluss der Ausführung die richtigen Daten angezeigt werden. Wenn jedoch Anwendung B ausfällt, schlägt dieser Test immer fehl - mit anderen Worten, ich denke, Sie müssen sich über diese Interaktion lustig machen. Scott
Es scheint, als ob die einzige Möglichkeit besteht, das Formular in der Anwendung zu verspotten, auf die Sie Zugriff haben. Andernfalls ist Selen in diesem Kontext nicht besonders sinnvoll. Scott

Deine Antwort

2   die antwort
4

Ich denke nicht, dass das mit Selen möglich ist. Es gibt keine Möglichkeit, mit einem Webbrowser aus dem Nichts eine POST-Anfrage zu erstellen, und Selenium manipuliert die Webbrowser. Ich würde vorschlagen, dass Sie stattdessen eine HTTP-Bibliothek zum Senden der POST-Anforderung verwenden und diese zusammen mit Ihren Selenium-Tests ausführen. (Welches Sprach- / Test-Framework verwenden Sie?)

Java + JUnit. Ich kann die POST-Anfrage mit anderen Tools stellen, aber wie kann ich Selen dazu bringen, die Antwort zu verarbeiten? Juha Syrjälä
5

Mit Selen können Sie beliebiges Javascript einschließlich ausführenSenden Sie programmgesteuert ein Formular.

Einfachste JS-Ausführung mit Selenium Java:

<code>if (driver instanceof JavascriptExecutor) {
    ((JavascriptExecutor) driver).executeScript("alert('hello world');");
}
</code>

Mit Javascript können Sie eine POST-Anfrage erstellen, die erforderlichen Parameter und HTTP-Header festlegen und diese senden.

<code>var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
    alert(this.responseText);
};

xhr.send('login=test&password=test');
</code>

Wenn Sie den Antworttext auf Selen umstellen müssen, verwenden Sie stattalert(this.responseText) benutzenreturn this.responseText und ordne das Ergebnis vonexecuteScript () auf eine Java-Variable.

Hier ist ein vollständiges Beispiel für Python:

<code>from selenium import webdriver

driver = webdriver.Chrome()

js = '''var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
    alert(this.responseText);
};

xhr.send('login=test&password=test');'''

driver.execute_script(js)
</code>

ANMERKUNG: Wenn Sie Zeichenfolgenargumente an das Javascript übergeben müssen, stellen Sie sicher, dass Sie sie immer mit Escapezeichen versehenjson.dumps(myString) Andernfalls wird Ihr js unterbrochen, wenn die Zeichenfolge einfache oder doppelte Anführungszeichen oder andere schwierige Zeichen enthält.

Verwandte Fragen