也可以嵌套<li>标签.....只需要直接</li> <li>项

时间:2019-03-31 15:26:38

标签: selenium xpath

我有一个页面结构,其中包含具有不同级别的嵌套列表项的超链接。我只为第二个嵌套列表项(级别2)编写了xpath,但它也为我提供了不需要的级别2(级别3或以下)下的所有列表项。现在变得非常沮丧,因为每次尝试将第3级列表项和第2级列表同时使用时,我尝试了不同的xpathscssSelectors

页面结构如下:

<div>
     <ul class="menuBar_menu_lvl_0">
       <li class="item_lvl_1">
       <li class="item_lvl_1">
          <ul class="menu_lvl_1">
            <li class="item_lvl_2"></li>
            <li class="item_lvl_2"></li>
            <li class="item_lvl_2">
               <ul class="menu_lvl_2">
                 <li class="item_lvl_3"></li>
                 <li class="item_lvl_3"></li>
                 <li class="item_lvl_3"></li>
               </ul>
            </li>
          </ul>
       <li class="item_lvl_1">
       <li class="item_lvl_1">

xpath = //ul[@class="menuBar_menu_lvl_0"]//li[@class="item_lvl_1"]//ul[@class="menu_lvl_1"]//li[@class="item_lvl_2"]

这也给了我3号物品以及2级物品。我想正确而分别地获得每个等级物品。任何人的帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

欢迎来到SO。 这是使用的示例。

<html>
  <body>
  <div>
     <ul class="menuBar_menu_lvl_0">
       <li class="item_lvl_1">
       <li class="item_lvl_1">
          <ul class="menu_lvl_1">
            <li class="item_lvl_2">Level1-li1</li>
            <li class="item_lvl_2">Level1-li2</li>
            <li class="item_lvl_2">
               <ul class="menu_lvl_2">
                 <li class="item_lvl_3">Level2-li1</li>
                 <li class="item_lvl_3">Level2-li2</li>
                 <li class="item_lvl_3">Level2-li1</li>
               </ul>
               Level1-li3
            </li>
          </ul>
       <li class="item_lvl_1">
       <li class="item_lvl_1">
         </ul>
</div>
</body>
  
</html>
下面是xpath

//ul[@class='menu_lvl_1']//li[not(parent::ul[@class='menu_lvl_2'])]

这是输出: enter image description here

这是仅从父元素获取文本的方法。

def get_text_exclude_children(element):
    return driver.execute_script(
        """
        var parent = arguments[0];
        var child = parent.firstChild;
        var textValue = "";
        while(child) {
            if (child.nodeType === Node.TEXT_NODE)
                    textValue += child.textContent;
                    child = child.nextSibling;
        }
        return textValue;""",
        element).strip()