2013-08-06 6 views
29

Есть ли какие-либо методы питона + селен, чтобы найти родительские элементы, брат элементы, или дочерние элементы так же, какКак найти родительские элементы python webdriver?

driver.find_element_parent? или
driver.find_element_next? или
driver.find_element_previous?

например:

<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> 

Я попытался, как показано ниже, но не:

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

Как я родительский элемент ввода, а затем, наконец, получить возможность выбрано?

ответ

49

Вы можете найти родительский элемент, используя .. XPath:

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

Что о создании отдельной XPath для получения выбранной опции, например:

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

Просто для добавления деталей: '../' синтаксис не работает, './ ..' и './../ ..' работают как ожидалось. Не добавляйте конечную косую черту. –

4

Из вашего примера I вам нужно только выбрать выбранную опцию в строке таблицы, если и только если эта строка также имеет элемент ввода с именем «A», независимо от того, где в html-дереве находится этот элемент b elow the row-element.

Вы можете достичь этого с помощью оси предков xpath.

Ради удобства чтения я покажу, как сделать этот шаг за шагом (но вы можете поместить все только в одном XPATH-выражение):

// 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

Селен WebElement Объект имеет встроенный метод: self.parent

Например:

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

Это, кажется, относится просто к общему родителю WebDriver? – Tom

0

Одним из возможных способов для перемещения к элементу под одной иерархии является использование в /../ XPath, как показано ниже:

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"]') 

Здесь будет:

  1. Во-первых перейти к android.widget.TextView[@text = "Current element text"]
  2. Затем он вернется в родительский элемент т.е. android.widget.RelativeLayout и выберите следующий android.widget.TextView[@text="Next element text"] под одной и той же иерархии.
Смежные вопросы