2013-08-06 9 views
29

Gibt es Methoden für Python + Selen übergeordnete Elemente, Bruder Elemente zu finden oder untergeordneten Elemente wieWie Elternelemente von Python Webdriver zu finden?

driver.find_element_parent? oder
driver.find_element_next? oder
driver.find_element_previous?

zB:

<tr> 
    <td> 
    <select> 
     <option value=0, selected='selected'> </option> 
     <option value=1, > </option> 
     <option value=2,> </option> 
    </select> 
    </td> 
    <td> 'abcd' 
    <input name='A'> </input> 
    <td> 
<tr> 

Ich habe wie unten versucht, aber fehlschlagen:

input_el=driver.find_element_by_name('A') 
td_p_input=find_element_by_xpath('ancestor::input') 

Wie kann ich das übergeordnete Eingabeelement und dann schließlich die Möglichkeit bekommen ausgewählt?

Antwort

49

Sie können ein übergeordnetes Element finden, indem Sie .. XPath:

input_el = driver.find_element_by_name('A') 
td_p_input = input_el.find_element_by_xpath('..') 

Was ist eine separate XPath machen für Option ausgewählt zu werden, wie folgt aus:

selected_option = driver.find_element_by_xpath('//option[@selected="selected"]') 
+0

Nur um Details hinzuzufügen: '../' Syntax funktioniert nicht, './ ..' und './../ ..' funktionieren wie erwartet. Fügen Sie den abschließenden Schrägstrich nicht hinzu. –

4

Von Ihrem Beispiel I Wenn die Zeile auch ein Eingabeelement mit dem Namen "A" haben soll, egal wo in der HTML-Struktur dieses Element steht b Ziehen Sie das Zeilenelement nach unten.

Sie können dies über die Xpath-Vorgängerachse erreichen.

Aus Gründen der besseren Lesbarkeit wird zeigen, ich, wie für Schritt, diesen Schritt zu tun (aber man kann eigentlich alles in nur einem XPath-Ausdruck) setzen:

// first find your "A" named element 
namedInput = driver.find_element_by_name("A"); 

// from there find all ancestors (parents, grandparents,...) that are a table row 'tr' 
rowElement = namedInput.find_element_by_xpath(".//ancestor::tr"); 

// from there find the first "selected" tagged option 
selectedOption = rowElement.find_element_by_xpath(".//option[@selected='selected']"); 
-1

Selen WebElement Objekt eine eingebaute Methode hat: self.parent

zum Beispiel:

origin_element = driver. find_element_by_class_name("some_class_name") 
parent_element = origin_element.parent 
brother_elements = parent_element.find_elements_by_css_selector("*") 
+0

Dies scheint sich einfach auf den gesamten WebDriver-Elternteil zu beziehen? – Tom

0

Einer der möglichen Wege, auf das Element unter derselben Hierarchie zu navigieren ist /../ zu verwenden, in XPath wie folgt:

current_element = driver.find_element_by_xpath('//android.view.ViewGroup/android.widget.RelativeLayout/android.widget.TextView[@text="Current element text"]/../android.widget.TextView[@text="Next element text"]') 

Hier wird sie:

  1. Zuerst navigieren zu android.widget.TextView[@text = "Current element text"]
  2. Dann wird es heißt android.widget.RelativeLayout zu übergeordnetes Element zurück und wählen Sie die nächste android.widget.TextView[@text="Next element text"] unter der gleichen Hierarchie.