habe eine Java-Server-Faces Seite entwickelt und möchte nun diese mit Selenium testen allerdings sagt er mir Fehler wie Invalid Session Id oder located element not visible wenn ich einen Button meiner Seite aufrüfen möchte.
Mit WebdriverWait und ImplycitlyWait hab ich es schon probiert ohne Erfolg gibt es besonderheiten auf die ich achten muss wenn ich mit Jsf arbeite?
[CODE lang="java" title="Funktioniert"]@Test
public void testButton() {
d.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
WebElement buttonElement = d
.findElement(By.xpath("/html[1]/body[1]/form[1]/table[1]/tbody[1]/tr[1]/td[7]/input[1]"));
WebDriverWait wait = new WebDriverWait(d, 10);
wait.until(ExpectedConditions.visibilityOf(buttonElement));
buttonElement.click();
}[/CODE]
Nach Aufruf meiner Seite drücke ich auf einen Update Button siehe Code oben dies funktioniert auch komme ich dann auf die Edit Seite und versuche dort ein Element auszuwählen findet er dies nicht..
JSF-IDs und HTML-IDs sind nicht unbedingt identisch. Am einfachsten ist es, wenn Du die Seite im Browser öffnest, das Kontextmenü des Browsers für das betreffende Element öffnest und dort mal "Inspect Element" (oder Element untersuchen o. ä.) auswählst. Dort solltest Du dann die korrekte ID sehen.
JSF ohne Ajax rendert das HTML serverseitig - das ist so ziemlich das einfachste. Problematisch sollte es erst werden, wenn Ajax dazukommt bzw. der DOM anderweitig während der Laufzeit verändert wird Was macht denn der Button beim Klick?
Ajax ist nicht vorhanden in meiner Anwendung daher verwunderts mich es Ja so.
Bei Klick des Buttons sollen alle Einträge eigentlich aktualisiert werden. Es soll aber erstmal das Textfeld gefunden werden und ein Eintrag erfolgen daran haberts noch.
Mit diesem Code findet er das TextElement und sendet auch die Einträge 😦 nun findet er aber den UpdateButton nichtmehr komisch komisch ich arbeite weiter dran
@TestprivatevoidpressUpdateButton1()throwsInterruptedException{// d.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);WebDriverWait wait =newWebDriverWait(d,10);WebElement pressbuttonElement = wait
.until(ExpectedConditions.visibilityOfElementLocated(By.id("form:j_idt34")));Thread.sleep(5000);
pressbuttonElement.submit();
sagt aber auch das es nicht gefunden wurde
Das glaub ich nicht. Es wird an Deinem Code liegen, den wir nicht vollständig kennen. Schreib mal eine minimale Testklasse, bei der das Problem auftritt - zusammen mit einer minimalen JSF-Seite.
package basicLocator;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;publicclassTestLogin{publicstaticvoidmain(String[] args)throwsInterruptedException{// 1.Schritt wenn man mit Selenium arbeitet// Ein Treiber Objekt erzeugenWebDriver d =newChromeDriver();
d.get("http://www.uitestpractice.com/Students/Form");
d.findElement(By.id("firstname")).sendKeys("Hallo");Thread.sleep(6000);
d.findElement(By.xpath("//button[contains(text(),'Submit')]")).click();Thread.sleep(3000);
d.close();}}
Das funktioniert....aber wieso es auf meiner Seite nicht funktioniert weder mit Id noch mit contains(text) 😩 ich steh aufm Schlauch.
Ich bin jetzt wirklich verwirrt und möchte es gerne verstehen.
Java:
package basicLocator;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;publicclassTestLogin{publicstaticvoidmain(String[] args)throwsInterruptedException{// 1.Schritt wenn man mit Selenium arbeitet// Ein Treiber Objekt erzeugenWebDriver d =newChromeDriver();
d.get("http://localhost:8090/JSFLoginExample");
d.findElement(By.xpath("//tbody/tr[1]/td[7]/input[1]")).click();Thread.sleep(6000);
d.findElement(By.id("form:id")).sendKeys("Hallo");
d.findElement(By.id("form:password")).sendKeys("Perta");
d.findElement(By.id("form:updateBtn")).click();Thread.sleep(3000);
d.close();}}Funktioniert1A
importjava.util.Set;importjava.util.concurrent.TimeUnit;importorg.openqa.selenium.By;importorg.openqa.selenium.JavascriptExecutor;importorg.openqa.selenium.Keys;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.support.ui.ExpectedConditions;importorg.openqa.selenium.support.ui.WebDriverWait;importorg.testng.Assert;importorg.testng.annotations.AfterClass;importorg.testng.annotations.BeforeClass;importorg.testng.annotations.BeforeMethod;importorg.testng.annotations.Test;publicclassSeleniumTesting3{WebDriver d =newChromeDriver();WebDriverWait wait =newWebDriverWait(d,20);privateString baseUrl;JavascriptExecutor js =((JavascriptExecutor) d);@BeforeClasspublicvoidsetUp()throwsInterruptedException{// System Set Property kann hier stehen falls es initaliziert wird
d =newChromeDriver();
baseUrl ="http://localhost:8090/JSFLoginExample";
d.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);Thread.sleep(5000);
d.get(baseUrl);}@TestprivatevoidtestUpdateButton()throwsInterruptedException{
d.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);WebElement clickElement = d.findElement(By.xpath("//tbody/tr[1]/td[7]/input[1]"));
clickElement.click();Thread.sleep(3000);}@TestpublicvoidchangeName()throwsInterruptedException{WebElement f = d.findElement(By.id("form:id"));Thread.sleep(3000);
f.sendKeys("Hallo");}@Testpublicvoidchangepw()throwsInterruptedException{WebElement g = d.findElement(By.id("form:password"));Thread.sleep(3000);
g.sendKeys("My New Secret Pw");}@Testpublicvoidtestbutton()throwsInterruptedException{WebElement k = d.findElement(By.id("form:updateBtn"));Thread.sleep(3000);
k.click();}@AfterClassprivatevoidafterTest()throwsInterruptedException{Thread.sleep(3000);
d.close();}}
Dort findet er wieder die Ids nicht mein Problem ist wohl gelöst aber verstehen möcht ich trotzdem was daran faul ist.
Naja, Du bist damit abhängig von der Reihenfolge, in der die Tests ausgeführt werden. Wen Du beim Klick auf updateButton die Seite wechselst, dann sind im nächsten Test die Elemente natürlich nicht mehr vorhanden.
Du könntest eine @BeforeTest-Methode einfügen, die sicherstellt, dass jeder Test immer auf der gleichen Seite beginnt.
Sie sagten die Elemente sind nicht mehr vorhanden allerdings sind sie Ja eigentlich erst vorhanden wenn die Seite gewechselt wird durch den Button.click der Ja funktioniert.
Also entweder findet er die Id´s nicht oder er findet die Id aber den UpdateBtn nicht der Ja auch eine Id besitzt komisch komisch 🤕 ich bastel mal weiter.
Gut, das geht natürlich, ist aber eher so die schlechteste Variante 😅
@AfterClass ist dafür da, dass man nach Abschluss der Tests aufräumen kann, zB würde man dort den Driver schließen – relevanten Test-Code sollte man dort aber nicht ausführen.
Deine Test-Methoden sehen aktuell sehr danach aus, als sollte es nur eine einzige Methode sein, und in dieser sollten sowohl Felder gefüllt als auch Buttons gedrückt werden.
Durch das Trennen in mehrere Tests und das ausführen von Logik in @AfterClass führt auf lange (und eigentlich auch auf kurze) Sicht nur zu Problemen.