如何在selenium中提取没有id的文本

How to extract the text without id in selenium

<div class="tax_details">
    <ul class="clearfix">
         <li>
            <p>Total Income</p>
            <span>£33,254.00</span>
         </li>
         <li class="text-center">
            <p>Taxable Income</p>
            <span>£21,054.00</span>
         </li>
         <li class="text-right">
            <p>Tax Due</p>
            <span>£4,210.80</span>
         </li>
     </ul>
 </div>

如何使用 findby 在 selenium 中提取 Totalincome 和 Tax Due 以及 Taxable income without id

使用css,你可以这样做,因为总收入没有唯一的获取元素的方法:

List<WebElement> listItems = driver.findElements(By.cssSelector("li > span"));
listItems.get(0).getText(); //Total Income
listItems.get(1).getText(); //Taxable Income
listItems.get(2).getText(); //Tax Due

您可以使用 FindElements() 获取所有元素,然后在本地循环遍历它们,这样您就不必一直访问该站点。虽然只有 2 个元素可能没什么大不了的,但如果将来列表增加,你就已经拥有它了。

以下是未经测试的伪代码,但您应该能很好地理解我的意思:

List<WebElement> elements = driver.findElements(By.Xpath("//div[@class = 'tax_details']/ul");
for(WebElement element : elements) {
    WebElement item = element.findBy(By.Xpath("'./li');
    ... 
    ...
    ...
}

我们的想法是,您将拥有列表中的所有元素,然后您可以访问元素属性或构建 switch 语句或任何您的要求。

假设您要求使用视觉文本线索定位元素,您可以使用 XPath,例如:

WebElement taxDetails = driver.findElement(By.className("tax_details"));
WebElement totalIncome = taxDetails.findElement(By.xpath(".//li[contains(., 'Total Income')]"));
String totalIncomeAmount = totalIncome.findElement(By.tagName("span")).getText();
  1. 第一行检索对整个块的引用,假设属性 class="tax_details" 在页面上只出现一次。
  2. 第二行检索行 li,其中包含感兴趣的文本。在这种情况下,XPath 表达式中的前导点非常重要;见 official documentation.
  3. 最后一行检索位于感兴趣行的 span 元素中的金额。

在实际生产中,您可能希望将其提取到更有用的东西中,也许是一种将 "text of interest" 作为输入的方法。

您也可以使用纯 xpath 语句。您将需要三个,每个 例如。 "Total Income"

/div/[@class"tax_details"]/ul[@class="clearfix"]/li[p/text()="Total Income"]/span/text()

解释语句

[p/text()="Total Income"] 

导致 xpath 根据兄弟元素的文本限制返回的 li 元素,导致只返回一个 span 节点。