【问题标题】:How to find parent elements by python webdriver?如何通过 python webdriver 查找父元素?
【发布时间】:2013-08-07 10:26:49
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    可以使用..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 元素的父属性是 WebDriver 类型的,所以它不是 WebElement 类型的元素
    • @AlessandroDaRugna 有没有办法以类似的方式获取元素的下一个直接子元素?
    • 查看此站点以获取更多 Xpath 命令 - scientecheasy.com/2019/08/xpath-axes.html
    【解决方案2】:

    从您的示例中,我认为您只希望表行中的选定选项当且仅当该行还具有名称为“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 层的元素,则使用“子元素”而不是“祖先”。如果您对父级以下的所有元素感兴趣,请使用“后代”而不是祖先。
    【解决方案3】:

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

    【讨论】:

    • 这很好用,但上面的例子不是最好的。检查一下,它找到一个元素,然后导航到父 div:driver.find_element_by_xpath("//div[contains(text(),'floor price')]/../div").text
    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2015-11-07
    • 2014-08-13
    • 2013-04-19
    • 2017-10-27
    • 2017-01-05
    相关资源
    最近更新 更多