【问题标题】:Xpath is unable to find textXpath 找不到文本
【发布时间】:2017-03-23 20:46:12
【问题描述】:

HTML 代码

<div class="filterInfoContainer">
    <div class="result-header-right">
      <div class="show-soldout">
        <label for="soldout-switch">Display sold out products</label>
        <label class="switch xs">
          <input type="checkbox" name="soldout-switch" id="soldout-switch">
          <div class="switch-slider"></div>
        </label>
      </div>
      <div class="sort-by">Sorted by:
        <select id="sortByDropdown">
          <option value="popularity">Popularity</option>
          <option value="price">Lowest price</option>
          <option value="discount">Highest discount</option>
          <option value="year">Latest release</option>
        </select>
      </div>
    </div>
      Showing 323 products
    <div class="clearfix"></div>

  </div>

我尝试过的 Xpath

.//*[@id='filterInfo']/div
.//*[@id='filterInfo']/div/text()

我想获取文本显示 323 个产品,但我的 xpath 没有返回我。由于此文本没有特定的 div,我很难得到它。

我尝试过的 Selenium 代码

 driver.findElement(By.xpath(".//*[@id='filterInfo']/div"));

 driver.findElement(By.xpath(".//*[@id='filterInfo']/div/text()"));

获取异常:无效的选择器

【问题讨论】:

  • 是否有可能通过更改代码将“显示 323 个产品”移动到
    标记中?
  • @Fey - 不可能更改代码:(

标签: java xpath selenium-webdriver


【解决方案1】:

您可以通过//div/text() 获得显示 323 个产品。 基本上它将返回未包含在标签中的文本。 请参考这个example

所以在你的情况下:

//div[@class='filterInfoContainer']/text()

http://www.xpathtester.com/xpath/d06b22fb023db960d8fc619485759127

【讨论】:

    【解决方案2】:

    尝试使用 Chrome 中的开发者工具,先通过 xpath 找到“filterInfo”组件,看看是否有效。

    【讨论】:

    • 如果您的 id 为“filterInfo”的组件位于一个表中,例如,那么您可能必须这样写:“table-id:filterInfo”
    【解决方案3】:

    Selenium XPath 表达式应该返回 webelement 只有当你的第二个 XPath 打算返回文本节点。这就是你得到Invalid Selector 异常的原因。

    我在提供的HTML 样本中也看不到divid="filterInfo"。如果您需要获取"Showing 323 products",请尝试以下代码:

    driver.findElement(By.xpath("//div[@class="filterInfoContainer"]/div[1]")).getText();
    

    考虑到更新的HTML 示例,当您需要获取不包括子元素文本的文本时,另一种方法是:

    JavascriptExecutor jse = (JavascriptExecutor)driver;
    jse.executeScript("return document.evaluate('//div[@class=\"filterInfoContainer\"]/div/following-sibling::text()', document, null, XPathResult.ANY_TYPE, null).iterateNext().textContent;");
    

    【讨论】:

    • 感谢您的回答。我刚刚更新了 html 代码,请您根据此更新答案。
    • 尝试更新的答案,如果它不起作用,请告诉我。您可能需要使用trim() 删除不必要的空格
    • JavaScriptExecutor 没有返回所需的值,返回不正确的值,什么也不返回,异常?
    • 不通过任何错误或异常,也不返回任何文本。
    • 提供的HTML 样本看起来和真实的HTML 完全一样吗?也许你删除了一些节点?还可以尝试添加一些sleep 执行时间
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签