【问题标题】:How to excluded XPATH Nested SPAN Class如何排除 XPATH 嵌套 SPAN 类
【发布时间】:2014-09-05 00:39:37
【问题描述】:

从下面的 Html 代码中,我只想选择第一个跨度类 Text..

<span class="item_amount order_minibasket_amount order_full_minibasket">10 
    <span class="article">Article
        <i class="icon"> >
        </i>
    </span>
</span>

这是我当前的 XPATH:

//span[contains(@class,'order_minibasket_amount')]

当我在 Selenium 测试中使用它时,我得到了整个 SPAN TEXT.. 就像:

10 Article >

我只想得到“10”篇文章的数量..

AMOUNT(new PageElement(By.xpath("//span[contains(@class,'order_minibasket_amount')]/text()[1]"), "not such Element...."))

  public String getAmount() {
    return amount = PageObjectUtil.findAndInitElementInside(webElement, PageElements.AMOUNT.pe, amount, String.class);
}

非常感谢,

干杯, 可可

【问题讨论】:

    标签: html selenium xpath


    【解决方案1】:

    您想要的不能直接完成,您将不得不诉诸String 操作。比如:

    String completeString = driver.findElement(By.className("item_amount")).getText()
    String endString = driver.findElement(By.className("article")).getText()
    String beginString = completeString.replace(endString, "")
    

    【讨论】:

    • 谢谢@SiKing,我会这样尝试的。
    【解决方案2】:

    您可以在末尾添加/text()

    //span[contains(@class,'order_minibasket_amount')]/text()
    

    此 XPath 不会选择 span 元素节点,而是选择一组 文本节点,它们是 span 元素的直接子节点。这应该是一组两个节点,一个包含“10”、一个换行符和四个空格(目标跨度的开始标记和嵌套跨度的开始标记之间的文本),另一个只包含一个换行符(在两个跨度的结束标签。如果你只想要 first 文本节点子节点(10,nl,空格),那么使用

    //span[contains(@class,'order_minibasket_amount')]/text()[1]
    

    【讨论】:

    • 当我使用这个 Xpath "//span[contains(@class,'order_minibasket_amount')]/text()[1]" - 我得到了我想要的元素 -。但是我得到了这个错误.. 引起:org.openqa.selenium.InvalidSelectorException:无效选择器:xpath 表达式的结果“//span[contains(@class,'order_sel_minibasket_amount')]/text()[1]”是:[对象文本]。它应该是一个元素。 (会话信息:chrome=36.0.1985.143)
    • @KoKo 您可以编辑问题以显示您用于执行 XPath 的代码吗?该表达式是正确的,并且正在返回一个文本节点,但您使用的 API 似乎只要求您选择 element 节点。您可能需要分两个阶段进行操作,使用 XPath 选择元素,然后通过其他 API 提取其文本节点子节点。
    • 考虑到上下文,这不正确 - Selenium 要求您的 XPath 查询返回它可以使用的物理 DOM 元素,因此会出现错误。
    • @Arran 我是从 XPath 端而不是 Selenium 端来的,我没有意识到 Selemium XPaths 必须只选择元素而不是任意 DOM 节点。
    【解决方案3】:

    现在我正在使用解决方案……但我对此并不满意。 :-(

        public String getAmount() {
        String tempAmount = PageObjectUtil.waitFindAndInitElement(PageElements.AMOUNT.pe).getText();
        String output = tempAmount.replaceAll("[a-zA-Z->]", "");
        return amount = output.trim();
    }
    

    干杯, 可可

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2023-03-19
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多