Holen Sie sich das N-te element mit XPath - wenn element[N] fehl
Gab es schon einige Diskussion über das N-te element in XPath:
XPath-Abfrage zu erhalten N-te Instanz von einem element
Erhalten N-te Kind eines Knotens mit xpath
XPath und PHP: Parse aus der N-TEN Instanz eines Elements
Bin ich mit Selenium und PHPUnit für die funktionellen Tests. Mein problem ist, dass auf einer Seite mit einer großen form der N-TEN Selektor nicht funktioniert. Ich habe 80 input-Felder (mit Selen ist getXpathCount('//input') aufrufen, um die genaue Zahl) - und ich möchte zu Durchlaufen, die 80 Felder und geben Sie text.
Was hab ich schon versucht und funktioniert nicht (N ist der index-Variablen):
//input[N]
//input[position()=N]
input[N]
(//input)[N]
(.//input)[N]
css=input:nth-of-type(N)
Sowie alle Mischungen der vorgenannten. Es in der Regel feuert eine Ausnahme, nämlich: element wurde nicht gefunden bei N = 2. Ich habe versucht, mehrere XPath-tools für die Browser, so, wie native Erweiterungen wie XPathEvaluator in Chrom - fast alle Gaben mir die richtigen Ergebnisse. So scheint es Seleniums XPath-parser arbeitet ein bisschen anders.
Was denkst du? Vermisse ich eine wichtige Sache?
Update:
Hier sind Sie, meine Lösung:
getAllFields(): http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/DefaultSelenium.html#getAllFields() und dann habe ich Durchlaufen.
Es tatsächlich löst nicht das ursprüngliche problem, also ich bin immer noch interessiert an der Antwort.
Dank!
- Ich bin mir ziemlich sicher, dass Selen nicht vollständig, standard XPath. Aber ich kann nicht meine finger auf die Beweise jetzt, andere als das, was Sie gerade gebucht. Ihr Ausdruck
(//input)[N]
funktionieren sollte. - Es können Teile von XPath 1.0, mit der Selen-RC API nicht unterstützen, korrekt, aber ich bin mir nicht bekannt. Ich habe sicherlich verwendet die XPath-version, diese Art von Dingen viele Male, und Sie gut funktionieren.
- gut zu wissen. Ich halte meine Augen offen für Ausnahmen in die Zukunft, da habe ich keine Besonderheiten zu bieten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
(//input)[15]
gibt die 15 input-element in das Dokument//input[15]
gibt jedes input-element, das ein 15-Eingang-Kind Ihres Eltern-Elements.Also einige der Ausdrücke sind zumindest falsch. Aber Sie sind nicht alle falsch, ich weiß also nicht, warum es nicht funktioniert für Sie.
Ohne zu sehen, Ihre spezifischen code und HTML, sind wir meist raten hier. Aber
xpath=(//input)[2]
befindet sich das zweite Eingabefeld auf der Seite, unabhängig davon, wo es ist. Werden Sie sicher, dass diexpath=
, weil Selenium RC nicht davon ausgehen, es sei denn, der locator startet mit//
. Beachten Sie auch, dass in XPathn
beginnt bei 1, nicht bei 0 wie in C abgeleiteten Sprachen.Diese funktionierte für mich:
/descendant::input[@id="search_query"][2]
Siehe auch diese Antwort
Verwende ich nicht, PHPUnit, aber ich Liebe XPath.
Im Suchfeld der Safari-inspector:
oder Gültigkeitsbereich:
//input[1]
bedeutet "Irgendwo im Dokument (//
), alle input-element (input
), dass ist das erste Kind seines übergeordneten Elements ([1]
)". Im Gegensatz zu dem, was die meisten C-ausgebildeten Programmierern erwarten,[1]
bedeutet nicht "erste input-element des Satzes", sondern es ist eine Abkürzung fürposition() = 1
. Es funktioniert für(//input)[1]
weil(//input)
ist die Menge aller input-Elemente, und dieposition()
gilt für das set. In der Erwägung, dass in//input[1]
, dieposition()
gilt für das element.