2016-07-06 11 views
3

Ich habe eine wirklich einfache Frage, ich habe ein div in einer HTML-Seite, die ich durch seine XPath zugreifen kann, die ist: //div[2]/div/div[2]/div[2]/div[2].Holen Sie sich das Kind eines HTML-Elements durch seine XPath

Ich möchte einen XPath, der allen Kindern dieses div geben würde, aber ich kann es nicht finden. Ich brauche das Element mit dem findElements Verfahren von Selen zu bekommen, aber was ich getestet habe funktioniert nicht:

Mein HTML-Code wie folgt aussieht:

<div> 
    <input/> 
    <span/> 
    <p></p> 
</div> 

Und die XPath Ich mag verwenden möchten dies:

//div[2]/div/div[2]/div[2]/div[2]/child 

Und mein Java Selenium-Skript wie folgt aus:

List<WebElement> listElement = driver.findElements(By.xpath(xpath)); 

for(WebElement element : listElement) { 
    System.out.println(element.getAttribute("id")); 
} 

Welchen XPath soll ich setzen, um das Kind der div zu bekommen?

EDIT 1: Ich habe das * verwendet und es funktioniert, aber wenn ich die Anzahl der Elemente zähle, druckt es mich 6. Betrachtet das * die Kinder seiner Kinder als seine eigenen Kinder?

+1

'// Pfad/zu/Element/*' - das '/ *' am Ende wählt alle unmittelbaren Kinder von 'element' –

Antwort

1

Wenn die div im HTML-Fragment in Ihrer Frage an

//div[2]/div/div[2]/div[2]/div[2] 

befindet sich dann das input Kind-Element wäre hier:

//div[2]/div/div[2]/div[2]/div[2]/input 

und alle Kinder Elemente hier sein würde:

//div[2]/div/div[2]/div[2]/div[2]/* 

Update:

EDIT 1: habe ich die * verwenden und es funktioniert, aber wenn ich die Nummer des Elements zählen druckt er mir 6. die Kinder seiner Kinder die * betrachten Hat sein als eigene Kinder ??

Nein, div/* wählt nur die unmittelbaren untergeordneten Elemente des übergeordneten Elements div aus.

Wenn Sie von einer größeren Anzahl von Kindern als erwartet überrascht werden, kann es sein, dass der Basis-XPath mehrere Elemente auswählt und Sie dann die untergeordneten Objekte auswählen, die mehr als nur das Zielelement div aufweisen.


Update 2:

Wenn Sie kein MCVE veröffentlichen können, und du bist immer noch verwirrt über die Anzahl der Kinder, die von zurückkehrte,

//div[2]/div/div[2]/div[2]/div[2]/* 

versuchen, sich auf dem XPath herausfordernd Sie haben als Basis zur Verfügung gestellt:

//div[2]/div/div[2]/div[2]/div[2]/ 

Zuerst versuchen

//div[2] 

Ist es wirklich die einzige div zu wählen, wie Sie erwarten?

versuchen Dann

//div[2]/div 

Auch hier sehen, ob dies ein wirklich die einzige div wählt man erwarten würde.

Fahren Sie auf diese Weise fort, bis Sie an einen Ort gelangen, an dem die Realität der ausgewählten Elemente von Ihren Erwartungen abweicht. Dort wird Ihre Antwort offensichtlich sein, oder Sie haben eine spezifischere Frage zu stellen.

Ohne Ihre XML/HTML zu sehen, ist dies ungefähr so ​​gut, wie der Rat bekommen kann.

+0

Aber wie kann xpath als // div [2]/div/div [2]/div [2]/div [2] zeigt auf mehrere Elemente hin? –

+0

Zum einen ist der zweite Div in Ihrem XPath ohne Index. Aber eigentlich solltest du einen [mcve] posten; Es gibt wahrscheinlich bessere Möglichkeiten, einen robusteren XPath als den von Ihnen bereitgestellten zu erstellen. – kjhughes

+0

Das Projekt, an dem ich arbeite, ist wirklich beschissen, weil sie etwas "dynamisches" und "generisches" machen wollten, aber am Ende ist es nur ein großes Durcheinander, es ist keine konstante ID und ich kann das CSS-Tag nicht isolieren das andere Element ... Wenn ich das minimale, vollständige und überprüfbare Beispiel zur Verfügung stellen könnte, würde ich. –

1
List<WebElement> childs = driver.findElements(By.xpath("//div[2]/div/div[2]/div[2]/div[2]/*")); 

In diesem Fall Selen searchs für alle untergeordneten Elemente aus Pfad div[2]/div/div[2]/div[2]/div[2]/ und sie als WebElement Objekt in der Liste Sammlung.

+0

Code-only-Antworten werden dringend davon abgeraten. Bitte erläutern Sie, was Ihr Code macht und wie er die Frage beantwortet. – JeffC

Verwandte Themen