选择任何同级

时间:2018-07-24 01:50:07

标签: python selenium xpath

明确 选择同胞的唯一选择是preceding-siblingfollowing-sibling吗?

标记的简化版本

<ui-view>
  <descendant> <!-- 1 -->
    <descendant> <!-- 2 -->
      <descendant> <!-- 3 -->
        <descendant> <!-- 4 -->
          <descendant> <!-- 5 -->
            <sibling>
              <child></child> <!-- comments_author -->
              <child></child> <!-- comments_timestamp -->
            </sibling>
            <sibling></sibling> <!-- comment (in comments_comment) -->

脚本

# 1. Select All Comment Threads
comments_threads = browser.find_elements_by_xpath('//ui-view//div[@class="commentLayout"]')

for thread in comments_threads:
    # 2. Select All Comments in Each Thread
    comments_comment = comments_threads.find_elements_by_xpath('./div[contains(@class, "commentLayout-text")]')

    for comment in comments_comment:
        # 3. Select Author of Each Comment
        # comments_author = comments_threads.find_element_by_xpath('./*[contains(@class, "commentLayout-account")]')

        # 4. Select Timestamp of Each Comment
        # comments_timestamp = comments_threads.find_element_by_xpath('./span[contains(@class, "commentNote")]')

问题是必须相对于嵌套循环的每个3项目选择4comment,我希望我的代码尽可能地灵活。

选择任何与所需节点匹配的同级对象比使用preceding-sibling匹配所需节点要灵活得多。

一种解决方案是选择父节点,然后选择与特定条件匹配的任何子节点,但是,如果可能的话,使用任何同级作为选择器肯定会更加灵活甚至效率更高。

是否不可能选择 所有 个兄弟姐妹?

3 个答案:

答案 0 :(得分:1)

使用下面的选择器:

  //“您的div” [position()= 1],只需根据需要更改为任何位置。
 

我只是想提出一个主意,但不知道这对您是否有帮助。 请查看此帖子,以获取有关xpath中位置的进一步说明:
http:// seleniumone-by-arun。 blogspot.com/2013/04/64-position-xpath-function.html

答案 1 :(得分:1)

我认为这将为“ thisnode”选择所有同级:

.got.plt

/ ..表示选择父级(上一级)

/ *表示选择每个孩子(向下一级)

答案 2 :(得分:0)

在XPath中没有合并的siblings轴-仅preceding-siblingfollowing-sibling

通常可以通过元素父级的子级上的条件来实现与兄弟元素有关的任何目标。详细信息将针对目标标记中的不变量。当排序在同级中很重要时,请使用preceding-siblingfollowing-sibling轴;否则,请在父元素的子元素上写条件。