使用 selenium 访问属性文本

Using selenium to access attribute text

我真的是 selenium 的新手,这可能真的很简单,但我想做的是将 '2017 League Table Ranking: 25th" 这个属性中的文本存储到一个字符串中java:

<a href="/league-tables/rankings">
 2017 League Table Ranking: 25th
</a>

public void findRanking() throws Exception {
  String ranking = driver.findElement(By.xpath("(//a[contains(@href, '/league-tables/rankings')])")).getAttribute(href) ;

}

这为我提供了属性正在使用的 href 的 link,这是我最接近正确输出的方法。我已经尝试使用 .getText() 方法简单地获取上面元素的文本,但是 returns 什么都没有,我哪里出错了?

试试这个:

public String findRanking(){
   WebElement e = driver.findElement(By.xpath("//a[contains(@href, '/league-tables/rankings')]");
   return e.getText();
}

由于我们现在有一个 link 页面,我能够创建一个唯一的定位器。问题是有多个元素与定位器匹配,而第一个匹配项不是您想要的。因为我们在这里不需要 XPath,所以我切换到 CSS 选择器。 CSS 选择器有更好的浏览器支持,速度更快,而且我认为更容易创建。现在应该可以了。

public String findRanking() {
    return driver.findElement(By.cssSelector("p.league-table-latest-rank > a[href='/league-tables/rankings']")).getText();
}

这里有一些 CSS 选择器的参考资料。我建议您花一些时间学习它们。它们非常强大,应该是你在 By.id().

之后的定位器

W3C CSS Selector Reference

Sauce Labs CSS Selector Tips


使用 XPath 的原始答案

.getText() 应该适用于该元素。看起来您的 XPath 中有一组额外的 () 。此外,您应该能够使用 equals 而不是 contains()。可能还有其他 links 包含可能导致问题的部分 href。我会尝试以下。我添加了一个 return 并将 return 类型更改为 String.

public String findRanking() {
    return driver.findElement(By.xpath("//a[@href='/league-tables/rankings']")).getText();
}

您可以在 Chrome 中测试您的 XPath。打开页面并在开发控制台中尝试 $x("//a[@href='/league-tables/rankings']").length 并确保它 returns 1。如果是 0,则定位器有问题。如果它是 > 1,那么您将不得不进一步缩小定位器的焦点。找到一个唯一的 parent,它有一个 ID 或一些独特的东西。

试试这个方法。

如果你想获得 2017 League Table Ranking: 25thtext 然后使用下面的代码。

String test = driver.findElement(By.xpath("//a[contains(text(), '2017 League Table Ranking: 25th')]")).getText();
System.out.println(test);

如果您想获取此文本的 href 属性 2017 League Table Ranking: 25th 然后使用下面的代码。

String href = driver.findElement(By.xpath("//a[contains(text(), '2017 League Table Ranking: 25th')]")).getAttribute("href");
System.out.println(href);