如何在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();
- 第一行检索对整个块的引用,假设属性
class="tax_details"
在页面上只出现一次。
- 第二行检索行
li
,其中包含感兴趣的文本。在这种情况下,XPath 表达式中的前导点非常重要;见 official documentation.
- 最后一行检索位于感兴趣行的
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 节点。
<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();
- 第一行检索对整个块的引用,假设属性
class="tax_details"
在页面上只出现一次。 - 第二行检索行
li
,其中包含感兴趣的文本。在这种情况下,XPath 表达式中的前导点非常重要;见 official documentation. - 最后一行检索位于感兴趣行的
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 节点。