使用 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()
.
之后的定位器
使用 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: 25th
的 text
然后使用下面的代码。
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);
我真的是 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()
.
使用 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: 25th
的 text
然后使用下面的代码。
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);