Selenium . getText Problem

pixelhead

Aktives Mitglied
Hallo zusammen,

mein Problem is es einen exakten Textausschnitt auf einer Webseite zu auszulesen.

Meine aktuelle Lösung ist mit Xpath und sie funktioniert, aber ich möchte Xpath vermeiden, entsprechend eine andere Lösung dafür haben.
Hinzu kommt, dass ich nur den vollständigen Text abgleichen kann und nicht nur einen bestimmten Textausschnitt.

Ich habe es mit cssSelector und mit der id="top" versucht und beides funktionerte nicht. Zumindest habe ich es offenbar nicht richtig hinbekommen.

Ich möchte aus diesem Textausschnitt:
Dein Username ist: username1
Nur diesen Teil:
username1

Umgebung:

openjdk 11 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

JUnit5
selenium-java-4.0.0-alpha-1
Eclipse Version: 2021-03 (4.19.0)

HTML:
[CODE lang="java" title="HTML"]<vaadin-horizontal-layout style="width: 100%; align-items: center;" id="top" slot="navi">
</iron-icon>
<iron-icon style="cursor: pointer; color: var(--lumo-primary-color); margin-right: 20px;" icon="vaadin:top-o" title="Sitename">
</iron-icon><iron-icon style="cursor: pointer; color: var(--lumo-primary-color); margin-right: 20px;" icon="vaadin:tabs" title="new window">
</iron-icon>
<span style="margin-left: auto; color: var(--lumo-primary-color); margin-right: 20px;">Your user name is: username1</span>
</vaadin-horizontal-layout>[/CODE]

So wie ich das verstehe ist das kein iron-icon.

So habe ich es bisher gelöst, so möchte ich es aber nicht haben:

Java Selenium Xpath:

[CODE lang="java" title="Selenium Java"]System.out.println("text username");

Assert.assertEquals("Dein Username ist: username1", driver.findElement(By.xpath("/html/body/vaadin-app-layout/vaadin-horizontal-layout/span")).getText());

System.out.println("Get Text: ");

System.out.println(driver.findElement(By.xpath("/html/body/vaadin-app-layout/vaadin-horizontal-layout/span")).getText());[/CODE]

Hat jemand eine Idee wie ich das lösen kann?

Vielen Dank und viele Grüße
 
Du willst nicht den ganzen XPath angeben? Dann wäre die Idee mit dem Element mit der id='top' doch ein Ansatz. Was hast Du denn da probiert?

Das sollte dann etwas sein wie //vaadin-horizontal-layout[@id='top']/span

Und Du kannst da nur ganze Elemente selektieren. Es gibt also nur den ganzen Text des span Elements. Aber den kannst Du dann doch weiter auswerten um dann z.B. nur das letzte Wort davon zu nutzen (Dann kann der Text davor auch übersetzt sein und Du bekommst vermutlich noch immer den Usernamen selbst).
 
Ich habe folgendes probiert:

[CODE lang="java" title="findElement by id"]Assert.assertEquals("username1", driver.findElement(By.id("top")).getText());[/CODE]

Zurück kam ein leerer String, also nichts.

Mir gefällt an Xpath nicht, dass bei einer Positionsänderung des Elements der Xpath ungültig wird und der Test angepasst werden muss. Mit einer ID ist das Element fix ansprechbar, egal wohin es zukünftig angesprochen wird.
 
Mir gefällt an Xpath nicht, dass bei einer Positionsänderung des Elements der Xpath ungültig wird und der Test angepasst werden muss. Mit einer ID ist das Element fix ansprechbar, egal wohin es zukünftig angesprochen wird.
Beim XPath muss man nicht den ganzen Pfad angeben. Das Beispiel von mir sollte es ja zeigen.
XPath ist eine relativ mächtige Abfragesprache.
 
[CODE lang="java" title="findElement by id"]Assert.assertEquals("username1", driver.findElement(By.id("top")).getText());[/CODE]

Zurück kam ein leerer String, also nichts.
Noch dazu, warum das nicht geklappt hat: Das hat dann ja das Element mit der id "top" geliefert. Das ist das Element vaadin-horizontal-layout und darauf dann getText() aufrufen gibt natürlich nichts zurück, denn in dem Element selbst ist kein Text. Das, was Du haben willst, ist ja in einem Unterlement span.
 
Noch dazu, warum das nicht geklappt hat: Das hat dann ja das Element mit der id "top" geliefert. Das ist das Element vaadin-horizontal-layout und darauf dann getText() aufrufen gibt natürlich nichts zurück, denn in dem Element selbst ist kein Text. Das, was Du haben willst, ist ja in einem Unterlement span.
Da war ich auch unsicher, fand aber keine andere Herangehensweise für eine ID Verwnedung. Immerhin ist der Text in diesem ID Bereich. Meine Hoffnung war der Text würde dann in diesem Bereich erkannt. Nun, dem ist nicht so 🙂

XPath kennt auch contains und matches, ggf. funktioniert das einfacher als sich den Text zurückgeben zu lassen.
Aber es geht doch darum den Text zu prüfen oder evrstehe ich die Aussage falsch?

Ich habe immer noch nicht egfunden wie ich das anders ansprechen kann ohne dem klassischen Xpath Pfad.

Beim XPath muss man nicht den ganzen Pfad angeben. Das Beispiel von mir sollte es ja zeigen.
XPath ist eine relativ mächtige Abfragesprache.
Da bin ich gerade dran, befürchte aber die Nuss kriege ich sooo schnell nicht geknackt. Ich komme da gerade nicht mit klar.
 
Ach so, ok.

Ich bin einen Schritt weiter, aber noch nicht ganz zufrieden.

So siehts gerade aus:
[CODE lang="java" title="Assert Equals"]String[] xpathParts = new WebDriverWait(driver, Duration.ofSeconds(120, 1)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[contains(., 'Your user name is: ')]"))).getText().split(" ");
Assert.assertEquals("Nachname1, Vorname1 (Nummer)", xpathParts[4] + " " + xpathParts[5] + " " + xpathParts[6]);
System.out.println("Kontrollausgabe Assert Equals Name: " + xpathParts[4] + " " + xpathParts[5] + " " + xpathParts[6]);[/CODE]

Ich weiß nicht wie ich aus diesem String in meinem nun erstellten Script ab dem Freizeichen vom Doppelpunkt bis zum Schluss den String packe und vergleiche.
"Your user name is: Nachname1, Vorname1 (Nummer)"

AssertEquals also ab "Nachname1, Vorname1 (Nummer)", das als ganzes vergleichen und nicht in Stücke gerissen.
 

Zurück
Oben