I have 10 different pages contain different links. How to click on all the links?
Conditions are : i) I don\'t know how many links are there ii) I want to count and
Not sure how efficient it is but I reloaded the links in the same list after each iteration and successfully completed the task.
String baseURL = "https://www.wikipedia.org/";
driver.get(baseURL);
List<WebElement> links = driver.findElements(By.xpath("//div[@class='central-featured']/div/a"));
System.out.println("The size of the list is: " + links.size());
// Loop through links, click on each link, navigate back, reload the link and
// continue.
for (int i = 0; i < links.size(); ++i) {
links.get(i).click();
driver.navigate().back();
// reloading the list or there will be stale-element exception
links = driver.findElements(By.xpath("//div[@class='central-featured']/div/a"));
}
// print the link text and href values
for (int i = 0; i < links.size(); ++i) {
System.out.print(links.get(i).getText() + "--> " + links.get(i).getAttribute("href"));
}
driver.close();
Store them in an array then click them:
ArrayList<WebElement> input_type = (ArrayList<WebElement>)
driver.findElements(By.tagName("a"));
for (WebElement type : input_type)
{
type.click();
}
This will click one by one all links with a tag ,i hope you got the point .Enjoy!
You can use 2 logics to handle
Using REST WS would be the easiest way to validate links.
Below code works fine for me.
public class Testing{
public static void main(String[] args) {
try{
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.navigate().to("https://www.amazon.in/");
List<WebElement> links = driver.findElements(By.tagName("a"));
System.out.println("Number of links : " + links.size());
for(WebElement e : links) {
String linkText = e.getAttribute("href");
System.out.println("Link -->>" +linkText);
if(linkText!=null && !linkText.isEmpty()) {
HttpPost post = new HttpPost(linkText);
HttpClient client = HttpClientBuilder.create().build();
HttpResponse res = client.execute(post);
String s = res.getStatusLine().toString();
if(s.equals("HTTP/1.1 200 OK")) {
System.out.println("Navigated");
//your code to handle logic
} else {
//your code to handle logic with other response code
}
}
}
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
}
Compacting the last answers into a few lines:
In Python:
# extract link elements then extract the href itself.
# browser is the driver opened with the web page
link_elements = browser.find_elements_by_xpath('//*[@class="child-category-container"]/a')
for link in link_elements:
url = link.get_attribute('href')
urls.append(url)
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
public class Find_all_Links {
private static String testUrl = "http://www.google.co.in/";
private static WebDriver driver = null;
public static void main(String[] args) {
ProfilesIni profile = new ProfilesIni();
FirefoxProfile myProfile = profile.getProfile("AutomationQA");
driver = new FirefoxDriver(myProfile);
driver.get(testUrl);
List<WebElement> oLinksOnPage = driver.findElements(By.tagName("a"));
System.out.println(oLinksOnPage.size());
for(int i=0;i<oLinksOnPage.size();i++){
System.out.println(oLinksOnPage.get(i).getText());
}
}
}
Capture and Navigate all the Links on Webpage
Iterator and advanced for loop can do similar job; However, the inconsistency on page navigation within a loop can be solved using array concept.
private static String[] links = null;
private static int linksCount = 0;
driver.get("www.xyz.com");
List<WebElement> linksize = driver.findElements(By.tagName("a"));
linksCount = linksize.size();
System.out.println("Total no of links Available: "+linksCount);
links= new String[linksCount];
System.out.println("List of links Available: ");
// print all the links from webpage
for(int i=0;i<linksCount;i++)
{
links[i] = linksize.get(i).getAttribute("href");
System.out.println(all_links_webpage.get(i).getAttribute("href"));
}
// navigate to each Link on the webpage
for(int i=0;i<linksCount;i++)
{
driver.navigate().to(links[i]);
Thread.sleep(3000);
}
1| Capture all links under specific frame|class|id and Navigate one by one
driver.get("www.xyz.com");
WebElement element = driver.findElement(By.id(Value));
List<WebElement> elements = element.findElements(By.tagName("a"));
int sizeOfAllLinks = elements.size();
System.out.println(sizeOfAllLinks);
for(int i=0; i<sizeOfAllLinks ;i++)
{
System.out.println(elements.get(i).getAttribute("href"));
}
for (int index=0; index<sizeOfAllLinks; index++ ) {
getElementWithIndex(By.tagName("a"), index).click();
driver.navigate().back();
}
public WebElement getElementWithIndex(By by, int index) {
WebElement element = driver.findElement(By.id(Value));
List<WebElement> elements = element.findElements(By.tagName("a"));
return elements.get(index);
}
2| Capture all links [Alternate method]
driver.get(baseUrl + "https://www.google.co.in");
List<WebElement> all_links_webpage = driver.findElements(By.tagName("a"));
System.out.println("Total no of links Available: " + all_links_webpage.size());
int k = all_links_webpage.size();
System.out.println("List of links Available: ");
for(int i=0;i<k;i++)
{
if(all_links_webpage.get(i).getAttribute("href").contains("google"))
{
String link = all_links_webpage.get(i).getAttribute("href");
System.out.println(link);
}
}
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.google.co.in/")
list_links = driver.find_elements_by_tag_name('a')
for i in list_links:
print i.get_attribute('href')
driver.quit()