【问题标题】:How to get the text only from the child element - Webdriver - Java如何仅从子元素中获取文本 - Webdriver - Java
【发布时间】:2014-05-28 08:03:52
【问题描述】:

我试图仅从子元素中获取文本。见下文:

<strong class="EnvMain">
  <strong id="currentClock">11:19</strong>
  GMT
</strong>

我只想获取 GMT 文本。

我尝试将 xpath 编写为:.//*[@id='userEnvironmentInfo']/div[2]/a/strong/text()],但这样找不到元素。

提前致谢。

HTML 更新:

<div class="DateTime">
 <a class="EnvPicker" title="Change your timezone" href="javascript:void(0);">
  <span class="EnvDD">▾</span>
  <span class="EnvIcon DateTimeIcon">The time is:</span>
  <strong class="EnvMain">
    <strong id="currentClock">17:34</strong>
    GMT
    </strong>
  <span id="currentDay" class="EnvMore">Monday</span>
  <span id="currentDate" class="EnvMore">14.04.2014</span>
 </a>
 <div class="EnvContainer">
   <ol id="timeZoneOptions" class="EnvList">
      <li class="EnvItem">
         <a class="EnvOption" title="Set the timezone to GMT-12" onclick="return false;" rel="-12" href="javascript:void(0);">
             <strong class="EnvMain">GMT-12</strong>
             <span class="EnvMore">Current time:01:25</span>
         </a>
      </li>
      <li class="EnvItem">
         <a class="EnvOption" title="Set the timezone to GMT-11" onclick="return false;" rel="-11" href="javascript:void(0);">

这里的元素将持续到 GMT +12。

【问题讨论】:

  • 您打错字了 - 在 text() 之后有一个额外的尾随 ] 不应该在那里。如果你删除它,它会工作吗?
  • 这行不通。 text() 不会返回 Selenium 可以使用的 DOM 元素。
  • 是的,很抱歉错字,已经删除,它返回格林威治标准时间 11:19。

标签: java selenium xpath webdriver element


【解决方案1】:

您要搜索的 xpath 是:

//strong[@class='EnvMain']/text()

此 xpath 返回文本,而不是 Web 元素。

如果您想使用 selenium + java 获取文本,您可以尝试以下方法:

driver.findElement(By.xpath("//strong[@class='EnvMain']")).getText();

似乎 getText 函数不会只返回GMT。但是我们可以在得到文本后解析这样的字符串:

    String s = driver.findElement(By.xpath("//strong[@class='EnvMain']/strong[id='currentClock']/..")).getText();
    s = s.substring(s.lastIndexOf(' ') + 1);

【讨论】:

  • 感谢您的回答,我按照您所说的做了,但似乎还有另一个下拉列表具有相同的类(EnvMain),并且文本将仅取自该元素。跨度>
  • 试试这个强大的//strong[@class='EnvMain'][2] 或者提供更多的html,没有看到就忍不住了。
  • 谢谢,再次找不到元素。帖子中添加了更多 HTML。
  • 尝试使用来自@TJanesBoone 答案的xpath 并将/text() 添加到它。似乎 getText 函数在这里无济于事。但是你可以使用它然后解析字符串。
  • 运行测试时没有找到该元素,但是如果我在Firefox的View Xpath中编写xpath,则会显示正确的文本(GMT)。
【解决方案2】:

使用以下 xpath 查找元素:

//strong[@class='EnvMain']/strong[@id='currentClock']/..

这个 xpath 的作用是找到类 EnvMain 的 &lt;strong&gt; 元素,该元素有一个 id 为 currentClock 的子 &lt;strong&gt;。 (末尾的.. 会向上走回dom 到父元素)。

然后用getText()方法提取文本:

   String gmt = driver
        .getElement(By.xpath("//strong[@class='EnvMain']/strong[id='currentClock']/.."))
        .getText();

然后,如果您想忽略内部 &lt;strong&gt; 元素中的文本而只获取时区(“GMT”)... 使用 xpath 没有一个好的方法。您必须在 Java 中使用正则表达式来删除您不想要的部分:

gmt = gmt.replaceAll("[\\d][\\d]?:[\\d][\\d]\\s*", "");

【讨论】:

  • 谢谢,再次返回的文本将是时钟和时区。
  • 等等,我有点困惑……你想只得到“GMT”还是“hh:mm GMT”?
  • 是的,正如我在帖子“我只想获取 GMT 文本”中所说的那样。
【解决方案3】:

getText() 在您的情况下返回 null,因为在列表项中有锚标记,然后是锚标记的文本。所以使用 getAttribute("innerHTML")。但是您将无法选择列表中的项目。

WebElement e1 = driver.findElement(By.xpath("//ul[@class='EnvContainer']"));

List<WebElement> list = e1.findElements(By.tagName("li"));
for(WebElement item: list)
 {
    String s = item.getAttribute("innerHTML");
    System.out.println(item.getAttribute("innerHTML"));
    }

【讨论】:

  • driver.findElement(By.xpath("//*[@class=EnvContainer')).click(); driver.findElement(By.xpath("//*[@class=' EnvList']//*[text()='GMT']")).click();
猜你喜欢
  • 2012-09-01
  • 2018-12-24
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 2021-11-14
相关资源
最近更新 更多