如何使用 Selenium 和 Java 提取表格元素的 id 属性的动态值

Posted

技术标签:

【中文标题】如何使用 Selenium 和 Java 提取表格元素的 id 属性的动态值【英文标题】:How to extract the dynamic values of the id attributes of the table elements using Selenium and Java 【发布时间】:2019-09-06 12:01:06 【问题描述】:

我有一个表格,其中每一行都有一个下载链接,其中包含(部分)自动生成的 id 元素。原因是实际的 href 元素总是“#”,所以 id 将下载分开。

我需要在 td.id 中找到该 id 元素的名称。即:我知道表格行有一个id元素,而且我知道部分名称,我需要得到确切的名称。

我一次访问每一行,所以我一次只需要查看一个 td。无需查看整个表格。

当我知道名称时,我就知道如何找到一个元素。但是在只知道类型的情况下找到元素是另一回事。

...
<tr>
 <td class="journalTable-journalPost"
  <a class="htext-small" href="#" id="downloadJournalPost-345">Download</a>
 </td>
</tr>
<tr>
 <td class="journalTable-journalPost"
  <a class="htext-small" href="#" id="downloadJournalPost-346">Download</a>
 </td>
</tr>
...

我在 webdriver 中找不到任何可以让我按类型查找元素的方法。

部分名称会起作用,因为 id 的名称为“downloadJournalPost-xxx”,其中只有 xxx 发生变化。但是链接文本是我能找到的唯一值,它可以让我搜索部分匹配。

编辑:更完整的标记。

<td class="journalTable-journalpost">
 <span class="hb-tekst--sekundar">In <!----><est-ikon class="ng-star-inserted">
  <div aria-hidden="true" class="hb-ikon hb-ikon--pil3-inn  ">
   <svg focusable="false">
    <use xlink:href="#ikon-pil3-inn"></use>
   </svg>
  </div></est-ikon><!----></span>
 <span class="hb-tekst--mellomTittel hb-avstandIngen"> Application and attachments</span>
 <a class="hb-tekst--liten" href="#" id="lastNedJournalPost-2892">Download journal post</a>
</td>

【问题讨论】:

你说的到底是什么意思...我只知道类型是另一回事...?这两个元素看起来很相似?表中有多少行/列?用更多的父元素更新 html 我不确定更多相同的代码会有什么帮助?元素不相似。在此示例中,一行具有 id="downloadJournalPost-345",下一行具有 id="downloadJournalPost.346"。对于每一行,我需要获取 id 的名称。我不需要元素的联系方式。 是的,因为您需要获取我们需要首先识别元素的元素的id(它是动态的)。因此,我们需要知道所需元素的存在深度。因此,您需要使用更多的 HTML 更新 HTML,包括父元素以首先识别元素。 您在寻找所有id 属性吗? 【参考方案1】:

在你先找到元素之前,你无法检索它的属性值。

使用findElements 方法使用以下定位器获取所有链接

table tr td[class='journalTable-journalPost'] a

然后使用 for-each 遍历每个元素以获取每个元素的 id。

示例代码:

List<WebElement> listOfLinks = driver.findElements(By.cssSelector("table tr td[class='journalTable-journalPost'] a"));

for(WebElement link: listOfLinks) 
     System.out.println("id:" + link.getAttribute("id"));

【讨论】:

我几乎可以让它工作。它找到具有类名的元素(数字与行数匹配),但 getAttbute("id") 为空。 如果它不打印它,我确信元素的 HTML 中不会有 ID。您确定每次都会生成 ID 吗?尝试打印link.getText() 并检查文本。此外,打印 link.getAttribute("innerHTML"); 以查看该元素的完整 HTML。 是的,我确定每次都有一个ID。 link.getText() 打印 td 中的文本。 link.getAttribute("innerHTML") 打印 id="downloadJournalPost-345"> 那可能是时间问题。使用 WebDriverWait 或 Sleep 解决它。为了确认,在找到元素之前放置一个调试点并等待完整的页面加载。然后继续执行。如果它打印ID,那么它是你需要解决的时间问题。 好吧,您的解决方案似乎有效。只是我无法使用 cssSelector 找到它。正如@DebanjanB 建议的那样,改用xPath,它可以工作。【参考方案2】:

要打印 Listid attribute 元素,您需要为 @987654324 诱导 WebDriverWait @ 并且您可以使用 Java8 stream()map() 并且您可以使用以下任一 Locator Strategies:

cssSelector:

List<String> myID = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("td.journalTable-journalPost>a.htext-small"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList());
System.out.println(myIDs);

xpath:

List<String> myIDs = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//td[@class='journalTable-journalPost']/a[@class='htext-small' and text()='Download']"))).stream().map(element->element.getAttribute("id")).collect(Collectors.toList());
System.out.println(myIDs);

【讨论】:

这很优雅。我喜欢溪流。但是,问题是 - 与下面的答案一样 - getAttribute("id") 返回 "" 而不是 id 的名称。 查看我的答案更新并让我知道状态 啊!它适用于 xpath 版本。是不是因为类内部还有其他元素,所以cssSelector版本需要更精确?如果可以避免的话,我真的不喜欢 xpath。 嗯,xpathcssSelector,很大程度上取决于 AUT(被测应用程序)。因此选择。

以上是关于如何使用 Selenium 和 Java 提取表格元素的 id 属性的动态值的主要内容,如果未能解决你的问题,请参考以下文章

如何从Java中提取PDF文件中的表格数据

Selenium:在 Java 中使用 cssSelector 提取 div 的文本

无法使用 Selenium Java 提取手风琴中的段落文本

使用 Selenium 返回空 DataFrame 从网站抓取表格

如何使用 selenium 提取类值并保存在 csv 中?

使用 Selenium 在 Python 中获取 HTML 表格正文