我在我的selenium课程的第2天,需要帮助找到循环元素的有效方法,如果匹配点击链接地址。
我想从classFrame导航到navList并循环查找匹配并单击。
public void switchFrames() {
driver.navigate().to("https://seleniumhq.github.io/selenium/docs/api/java/");
driver.switchTo().frame("classFrame");
/* List<WebElement> elements = driver.findElements(By.className("navList"));
for (WebElement element : elements) {
System.out.println(element.findElement(By.xpath(".//li/a")).getText());
}
*/
List<WebElement> items = driver.findElements(By.cssSelector("ul li"));
if ( items.size() > 0 ) {
for ( WebElement we: items ) {
we.findElement(By.linkText("Deprecated")).click();
}
}
driver.findElement(By.linkText("Deprecated")).click();
driver.close();
}
答案 0 :(得分:3)
您缺少的主要部分以及您无法找到所需元素的原因是因为它在一个框架中。要使用Selenium访问框架中的元素,您需要将驱动程序上下文切换到框架。您可以使用driver.switchTo().frame()
执行此操作。完成与框架的交互后,使用driver.switchTo().defaultContent()
切换回默认上下文。
话虽如此......让我为你提供更多建议,因为你刚刚开始。有几种方法可以做到这一点。一种方式就像你尝试的那样...抓住一个元素,找到一个孩子,循环遍历那些寻找你想要的链接的孩子。我更喜欢更直接的方法,因为我们可以使用XPath搜索确切的链接。您要做的是单击导航栏上的DEPRECATED链接。您可以使用By.linkText()
定位器,但这样可以使用,但是您要小心,尤其是对于包含这么多链接的此类页面,不要点击您不打算这样做的链接。您这样做的方法是将搜索范围缩小到您期望链接所在的特定区域,即导航栏。在那里缩小搜索范围后,您可以快速安全地找到所需的链接。我更喜欢在使用XPath的单个搜索中执行此操作,但您可以使用CSS选择器来查找导航栏区域,然后使用By.linkText()
来查找链接,例如
driver.findElement(By.cssSelector("ul[title='Navigation']").findElement(By.linkText("Deprecated").click();
在这种情况下,您将两次抓取页面。它不太可能是一个重大的性能影响,我只是喜欢在有意义时使用单个定位器。我建议你,因为你可能会反复使用这个代码,你把它放在一个函数中并传递给它的链接名称,例如。
public void clickNavbar(String linkName)
{
driver.switchTo().frame(driver.findElement(By.cssSelector("frame[name='classFrame']")));
driver.findElement(By.xpath("//ul[@title='Navigation']//a[.='" + linkName + "']")).click();
driver.switchTo().defaultContent();
}
然后您可以将其称为clickNavbar("Deprecated");