如何通过python webdriver查找父元素?

时间:2013-08-06 12:08:52

标签: python selenium xpath selenium-webdriver parent-child

是否有任何方法可以让python + selenium找到父元素,兄弟元素或子元素,就像

一样

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

我如何获得输入元素的父级,然后最后选择该选项

3 个答案:

答案 0 :(得分:73)

您可以使用.. 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"]')

答案 1 :(得分:6)

从你的例子中我想你只想要一个表行中的选定选项当且仅当该行还有一个名为&#34; A&#34;的输入元素时,无论html-tree中的哪个位置此元素位于row-element下面。

您可以通过xpath祖先轴实现此目的。

为了更好的可读性,我将逐步展示如何执行此操作(但实际上只能将所有内容放在一个xpath-expression中):

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

答案 2 :(得分: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"]