ChatGPT解决这个技术问题 Extra ChatGPT

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

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

如何获取输入元素的父元素,然后最后选择选项?


a
alecxe

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

只是为了添加细节:../ 语法不起作用,./.../../.. 按预期工作。不要添加尾部斜杠。
bu_editor.find_element_by_xpath('..') AttributeError: 'NoneType' object has no attribute 'find_element_by_xpath' - 为什么我得到这个?
@Martlark 元素的 parent 属性是 WebDriver 类型的,因此它不是 WebElement 类型的元素
@AlessandroDaRugna 有没有办法以类似的方式获取元素的下一个直接子元素?
查看此站点以获取更多 Xpath 命令 - scientecheasy.com/2019/08/xpath-axes.html
L
Lucan

从您的示例中,我认为您只希望表行中的选定选项当且仅当该行还具有名称为“A”的输入元素时,无论该元素在 html-tree 中的哪个位置位于该行下方 -元素。

您可以通过 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 层的元素,则使用“子”而不是“祖先”。如果您对父级以下的所有元素感兴趣,请使用“后代”而不是祖先。
P
Parth Naik

导航到同一层次结构下的元素的一种可能方法是在 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"]')

在这里它将:

首先导航到 android.widget.TextView[@text = "Current element text"] 然后它会回到父元素,即 android.widget.RelativeLayout 并选择下一个 android.widget.TextView[@text="Next element text" ] 在同一层次结构下。


这非常有效,但上面的例子并不是最好的。检查一下,它找到一个元素,然后导航到父 div:driver.find_element_by_xpath("//div[contains(text(),'floor price')]/../div").text