2 Stimmen

Nachkommende Beziehungen + Indizierung in Selenium

Ich teste eine Web-Seite mit Selenium. Ich möchte alle "Blattelemente und Elemente, die Text enthalten" erhalten. Ich verwende den folgenden funktionierenden XPath.

//*[. != '' or  not(*)]

Das funktioniert hervorragend.

Nun möchte ich jedes dieser Elemente in einer Schleife durchlaufen und einen Befehl für sie ausführen. Eigentlich möchte ich ihre Position abrufen, aber ich veranschauliche mein Problem, indem ich GetXpathCount verwende.

int elementCount = this.selenium.GetXpathCount("//*[. != '' or  not(*)]");
for (int i = 1; i <= elementCount; ++i)
{
    Console.WriteLine(this.selenium.GetXpathCount("//*[. != '' or  not(*)][" + i + "]"));
}

Der Wert von elementCount ist 242. Und die Konsolenausgabe lautet 142 45 30 13 4 4 1 1 1 1 0 0 0 0 0 0 ... [200 weitere Nullen] Die Zahlen auf der Konsole summieren sich immer zu elementCount, sind aber nach ~10 immer Null.

Es wurde mir klar, dass mein XPath

//*[. != '' or  not(*)][1] 

Das hat nicht die von mir beabsichtigte Bedeutung. Und gibt stattdessen "alle Blattelemente und alle Elemente, die Text enthalten, die das erste Kind ihres Elternteils sind" zurück und ist äquivalent zu

//*[(. != '' or  not(*)) and position() = 1]

Ich verwende daher Klammern, um diesen Fehler zu korrigieren:

(//*[(. != '' or  not(*))])[1]

Juhu. Die Konsolenausgabe lautet jetzt 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 für alle Elemente. Aber lassen Sie uns meinen Schleifencode aktualisieren, um tatsächlich eine Operation auf dem Element @ path durchzuführen.

int elementCount = this.selenium.GetXpathCount("//*[. != '' or  not(*)]");
for (int i = 1; i <= elementCount; ++i)
{
    Console.WriteLine(this.selenium.GetElementPositionLeft("(//*[. != '' or  not(*)])[" + i + "]"));
}

NEIN!!! GetXpathCount funktioniert, aber GetElementPositionLeft (und andere) alle fehlschlagen. Woran liegt das? Wie kann ich das Problem umgehen?

Hier ist die Selenium Exception: {"ERROR: Element (// [. != '' oder nicht( )])[1] nicht gefunden"} [Selenium.SeleniumException]: {"ERROR: Element (// [. != '' oder nicht( )])[1] nicht gefunden"} Daten: {System.Collections.ListDictionaryInternal} HelpLink: null InnerException: null Meldung: "ERROR: Element (// [. != '' oder nicht( )])[1] nicht gefunden" Quelle: "ThoughtWorks.Selenium.Core"

4voto

Dave Hunt Punkte 8121

Selenium weiß nicht, welche Standortstrategie es für (//*[. != '' or not(*)])[1] . Versuchen Sie es mit einem vorangestellten xpath=

Als alternativen Locator habe ich dies mit dem folgenden (in Java) zum Laufen gebracht:

int elementCount = selenium.getXpathCount("/descendant::*[. != '' or  not(*)]").intValue();
for (int i = 1; i <= elementCount; ++i) {
    System.out.println(i + ": " + selenium.getElementPositionLeft("xpath=/descendant::*[. != '' or  not(*)][" + i + "]"));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X