【问题标题】:Getting sub text of an element using Java and Selenium使用 Java 和 Selenium 获取元素的子文本
【发布时间】:2017-09-10 02:31:41
【问题描述】:

我有一个表,其中包含标题 (th) 元素。 th 可能包含文本,但很可能 th 的子元素将包含文本。问题是子元素并不总是相同的标签或相同的深度。比如

<table>
<thead>
<tr>
  <th>
    <span>Here is some text</span>
  </th>
  <th>
    <a>This is some text</a>
  </th>
  <th>
     <span><a>Lower Level</a></span>
  </th>
  ..
 </tr>
 </thead>
 </table>

所以我的 find.elements xpath 是 "//div[@id = 'gridClaimListing']/div[1]//table//thead/tr[2]//th"(表格位于那个div下面)。

所以对于每个元素,我想我可以做另一个查找,例如“.//[@text]”或者“.//[text()]”,但这可能会很痛苦。有没有办法可以从 th 元素中获取该文本,即使 th 本身在其级别上没有文本?我相信 element.getText() 可能只是获取元素级别的文本而没有子级别。

【问题讨论】:

  • 您在最后一个 上尝试过.getText() 吗?它返回了什么?请阅读How much research effort is expected?请提供您尝试过的代码和执行结果,包括任何错误信息等。

标签: java selenium xpath


【解决方案1】:

假设&lt;th&gt; 不包含你需要的文本,只有子元素有文本,你可以试试这样:

List<WebElement> parentElems = driver.findElements(By.xpath("//div[@id = 'gridClaimListing']/div[1]//table//thead/tr[2]//th"));

for(WebElement parent: parentElems) {
    // for each parent element (th), fetch all it's children
    List<WebElement> childElements = parent.findElements(By.xpath(".//*"));

    // display text of all child elements
    for(WebElement descendant: childElements) {
        System.out.println(descendant.getText());
    }
}

这里我们利用 xPath ".//*" 来获取元素的所有子元素。

【讨论】:

  • 我会说内部 for 循环是无关紧要的;因为parentElems 正在识别所有三个&lt;th&gt;
  • @kushal。子元素的内部for循环?我这样做了,它适用于&lt;th&gt; 标签有超过 1 个孩子的情况
  • 哦.. 想法不错
  • 这些实际上是网格中的列标题。一个只是空白(即没有文本),而是一个复选框。我想在标题中获取文本所在的位置,然后在数据行中获取相同的位置单元格。我将列出标题并使用 indexOf()。因此,即使没有我需要计算的文本作为标题,数据位置也会保持同步。这有意义吗?
  • 是的。这是一个完全不同的问题,但是一旦您获取子元素,在内部 for 循环中,您可以检查 webelement 是否为复选框。如果是这样,请在列表中添加一个占位符,否则添加文本。
猜你喜欢
  • 2019-08-10
  • 2018-01-21
  • 2016-05-30
  • 1970-01-01
  • 2022-12-12
  • 2021-11-14
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多