So behandeln Sie AJAX-Anrufe in Selenium Webdriver

Inhaltsverzeichnis:

Anonim

Was ist Ajax?

AJAX steht für Asynchronous JavaScript & XML und ermöglicht es der Webseite, kleine Datenmengen vom Server abzurufen, ohne die gesamte Seite neu zu laden.

Ajax ist eine Technik zum Erstellen schneller und dynamischer Webseiten. Diese Technik ist asynchron und verwendet eine Kombination aus Javascript und XML.

Die Teile einer Webseite werden aktualisiert, ohne dass die gesamte Seite neu geladen werden muss.

Einige der bekanntesten Anwendungen, die die AJAX-Technik verwenden, sind Google Mail, Google Maps, Facebook, Youtube usw.

In diesem Tutorial lernen Sie:

  • Was ist Ajax?
  • Wie funktioniert Ajax?
  • Umgang mit Ajax-Anrufen mit Selenium Webdriver
  • Herausforderungen beim Umgang mit Ajax Call in Selenium Webdriver

Wie funktioniert Ajax?

Wenn Sie beispielsweise auf die Schaltfläche "Senden" klicken, sendet JavaScript eine Anfrage an den Server, interpretiert das Ergebnis und aktualisiert den aktuellen Bildschirm, ohne die Webseite neu zu laden.

  • Ein Ajax-Aufruf ist eine vom Browser initiierte asynchrone Anforderung, die nicht direkt zu einem Seitenübergang führt. Wenn Sie eine Ajax-Anfrage auslösen, kann der Benutzer weiterhin an der Anwendung arbeiten, während die Anfrage auf eine Antwort wartet.
  • AJAX sendet HTTP-Anforderungen vom Client an den Server und verarbeitet dann die Antwort des Servers, ohne die gesamte Seite neu zu laden. Wenn Sie also einen AJAX-Anruf tätigen, sind Sie sich nicht sicher, wie lange der Server benötigt, um Ihnen eine Antwort zu senden .

Wenn Sie aus Sicht eines Testers den Inhalt oder das anzuzeigende Element überprüfen, müssen Sie warten, bis Sie die Antwort erhalten. Während des AJAX-Aufrufs werden die Daten im XML-Format gespeichert und vom Server abgerufen.

Umgang mit Ajax-Anrufen mit Selenium Webdriver

Die größte Herausforderung bei der Bearbeitung von Ajax-Anrufen besteht darin, die Ladezeit für die Webseite zu kennen. Da das Laden der Webseite nur einen Bruchteil von Sekunden dauert, ist es für den Tester schwierig, eine solche Anwendung mit einem Automatisierungstool zu testen. Dafür muss Selenium Webdriver bei diesem Ajax-Aufruf die Wartemethode verwenden.

Durch Ausführen dieses Wartebefehls unterbricht Selen die Ausführung des aktuellen Testfalls und wartet auf den erwarteten oder neuen Wert. Wenn der neue Wert oder das neue Feld angezeigt wird, werden die angehaltenen Testfälle von Selenium Webdriver ausgeführt.

Im Folgenden sind die Wartemethoden aufgeführt, die Selenium Webdriver verwenden kann

  1. Thread.Sleep ()
  • Thread.Sleep () ist keine gute Wahl, da der aktuelle Thread für die angegebene Zeit angehalten wird.
  • In AJAX können Sie sich nie über die genaue Wartezeit sicher sein. Ihr Test schlägt also fehl, wenn das Element nicht innerhalb der Wartezeit angezeigt wird. Darüber hinaus erhöht sich der Overhead, da durch Aufrufen von Thread.sleep (t) der aktuelle Thread von der laufenden Warteschlange in die Warteschlange verschoben wird.
  • Nach Erreichen der Zeit 't' wird der aktuelle Thread von der Warteschlange in die Warteschlange "Bereit" verschoben. Anschließend dauert es einige Zeit, bis er von der CPU ausgewählt und ausgeführt wird.
  1. Implizites Warten ()
  • Diese Methode weist den Webtreiber an, zu warten, wenn das Element nicht sofort verfügbar ist. Diese Wartezeit gilt jedoch für die gesamte Zeit, in der der Browser geöffnet ist. Daher kann jede Suche nach den Elementen auf der Seite die Zeit in Anspruch nehmen, auf die das implizite Warten eingestellt ist.
  1. Explizites Warten ()
  • Explizites Warten wird verwendet, um die Testausführung einzufrieren, bis eine bestimmte Bedingung erfüllt ist oder die maximale Zeit abgelaufen ist.
  1. WebdriverWait
  • Es kann für alle Bedingungen verwendet werden. Dies kann mit WebDriverWait in Kombination mit ExpectedCondition erreicht werden
  • Der beste Weg, dynamisch auf ein Element zu warten, besteht darin, jede Sekunde nach der Bedingung zu suchen und mit dem nächsten Befehl im Skript fortzufahren, sobald die Bedingung erfüllt ist.

Das Problem bei all diesen Wartezeiten ist jedoch, dass Sie die Timeout-Einheit erwähnen müssen. Was ist, wenn das Element innerhalb der Zeit immer noch nicht vorhanden ist? Es gibt also noch eine Wartezeit namens Fluent Wait.

  1. Fließend warten
  • Dies ist eine Implementierung der Wait-Schnittstelle mit Timeout und Abfrageintervall. Jede FluentWait-Instanz bestimmt die maximale Wartezeit auf eine Bedingung sowie die Häufigkeit, mit der die Bedingung überprüft wird.

Herausforderungen beim Umgang mit Ajax Call in Selenium Webdriver

  • Die Verwendung des Befehls "Pause" zur Verarbeitung von Ajax-Aufrufen ist nicht vollständig zuverlässig. Eine lange Pausenzeit macht den Test unannehmbar langsam und verlängert die Testzeit. Stattdessen ist "waitforcondition" beim Testen von Ajax-Anwendungen hilfreicher.
  • Es ist schwierig, das mit bestimmten Ajax-Anwendungen verbundene Risiko zu bewerten
  • Angesichts der uneingeschränkten Freiheit der Entwickler, die Ajax-Anwendung zu ändern, ist der Testprozess schwierig
  • Das Erstellen einer automatisierten Testanforderung kann für Testtools schwierig sein, da eine solche AJAX-Anwendung häufig unterschiedliche Codierungs- oder Serialisierungstechniken verwendet, um POST-Daten zu senden.

Ein Beispiel für Ajax HANDLING

import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedConditions;import org.openqa.selenium.support.ui.WebDriverWait;import org.testng.Assert;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;öffentliche Klasse Ajaxdemo {private String URL = "http://demo.guru99.com/test/ajax.html";WebDriver-Treiber;WebDriverWait wait;@Vor dem Unterrichtpublic void setUp () {System.setProperty ("webdriver.chrome.driver", ". \\ chromedriver.exe");// Chrome-Instanz erstellenTreiber = neuer ChromeDriver ();driver.manage (). window (). maxim ();driver.navigate (). to (URL);}}@Prüfungpublic void test_AjaxExample () {By container = By.cssSelector (". Container");wait = new WebDriverWait (Treiber, 5);wait.until (ExpectedConditions.presenceOfElementLocated (Container));// Den Text abrufen, bevor ein Ajax-Aufruf ausgeführt wirdWebElement noTextElement = driver.findElement (By.className ("Radiobutton"));String textBefore = noTextElement.getText (). Trim ();// Klicken Sie auf das Optionsfelddriver.findElement (By.id ("yes")). click ();// Klicken Sie auf Check Buttondriver.findElement (By.id ("buttoncheck")). click ();/ * Erhalte den Text nach einem Ajax-Aufruf * /WebElement TextElement = driver.findElement (By.className ("Radiobutton"));wait.until (ExpectedConditions.visibilityOf (TextElement));String textAfter = TextElement.getText (). Trim ();/ * Überprüfen Sie beide Texte vor dem Ajax-Aufruf und nach dem Ajax-Aufruf. * ​​/Assert.assertNotEquals (textBefore, textAfter);System.out.println ("Ajax Call Performed");String expectedText = "Das Optionsfeld ist aktiviert und der Wert lautet" Ja "./ * Überprüfen Sie den erwarteten Text mit dem nach dem Ajax-Aufruf aktualisierten Text * /Assert.assertEquals (textAfter, expectedText);driver.close ();}}}}

Zusammenfassung:

  • Mit AJAX kann die Webseite kleine Datenmengen vom Server abrufen, ohne die gesamte Seite neu zu laden.
  • Um die Ajax-Anwendung zu testen, sollten verschiedene Wartemethoden angewendet werden
    • ThreadSleep
    • Implizites Warten
    • Explizites Warten
    • WebdriverWait
    • Fließend warten
  • Das Erstellen einer automatisierten Testanforderung kann für Testtools schwierig sein, da eine solche AJAX-Anwendung häufig unterschiedliche Codierungs- oder Serialisierungstechniken verwendet, um POST-Daten zu senden.