如何使用Selenium WebDriver获取网页中的所有链接并单击(应删除隐藏的链接)?
我想点击页面上显示的链接。
public void linksclick() throws Exception{
System.setProperty("webdriver.chrome.driver", "path of chrome driver");
WebDriver driver = new ChromeDriver();
baseUrl = "www.example.com";
driver.get(baseUrl);
//driver.get(baseUrl);
List<WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println("All Links--> " + allLinks.size());
//Fetching an nth Link
System.out.println(" 1st Link is--> " + allLinks.get(1).getText());
//Fetching all the Links
for (int i=0;i<allLinks.size();i++){
String homeWindow;
String currentWindow;
List<WebElement> allLinks1 = driver.findElements(By.tagName("a"));
Thread.sleep(2000);
System.out.println(allLinks1.get(i).getText());
if((allLinks1.get(i).getText() == null | (allLinks1.get(i).getText()).equalsIgnoreCase("")|allLinks1.get(i).getAttribute("href") == null | allLinks1.get(i).getCssValue("font-size")==null | allLinks1.get(i).getCssValue("font-size")==null | allLinks1.get(i).getCssValue("font-size") == null
| allLinks1.get(i).getCssValue("font-weight")== null | allLinks1.get(i).getCssValue("text-align")== null
| allLinks1.get(i).getCssValue("font-family")== null | allLinks1.get(i).getCssValue("color")== null))
{//DO NOTHING
}
else{
Thread.sleep(2000);
System.out.println(allLinks1.get(i).getText());
//Thread.sleep(1000);
homeWindow = driver.getWindowHandle().toString();
allLinks1.get(i).click();
Thread.sleep(2000);
currentWindow = driver.getWindowHandle().toString();
if(homeWindow.contentEquals(currentWindow)){
//Do nothing
}else {
driver.close();
driver.switchTo().window(homeWindow);
//closechild window
//focus on homewindow
}
driver.navigate().to(baseUrl);
}
}
}
请帮我解决问题。
答案 0 :(得分:0)
您可以尝试使用以下内容:
if (allLinks1.get(i).isDisplayed())
{
allLinks1.get(i).click();
}
如果这不符合您的要求,您可以在上面的if语句中加入allLinks1.get(i).isEnabled()
。
答案 1 :(得分:0)
您需要修复代码中的一些问题才能使其正常工作。
确保您的网址确实有效:&#34; http://www.example.com&#34;而不只是&#34; www.example.com&#34;。
列表使用从零开始的索引。因此,请使用allLinks.get(1)
而不是allLinks.get(0)
。由于站点上只有一个链接,并且您的代码试图获取列表中的第二个链接,因此您将获得IndexOutOfBoundsException。
这应该有助于您的代码运行。
建议:为变量提供更具描述性的名称,以便您的代码可以帮助评论自己。例如,看起来你在循环的每次迭代中创建所有链接的新列表的原因是因为你不会有过时的元素。因此,不要将该变量命名为allLinks1
,而是将其命名为freshListOfAllLinks
,这样您的代码所做的就更明显了。