How to fetch all links and click those links one by one using Selenium WebDriver

后端 未结 6 1326
深忆病人
深忆病人 2021-01-05 22:59

I am using Selenium WebDriver with java.

I am fetching all links from webpage and trying to click each link one by one. I am getting below error:

相关标签:
6条回答
  • 2021-01-05 23:07

    If you're OK using WebDriver.get() instead of WebElement.click() to test the links, an alternate approach is to save the href value of each found WebElement in a separate list. This way you avoid the StaleElementReferenceException because you're not trying to reuse subsequent WebElements after navigating away with the first WebElement.click().

    Basic example:

    List<String> hrefs = new ArrayList<String>();
    List<WebElement> anchors = driver.findElements(By.tagName("a"));
    for ( WebElement anchor : anchors ) {
        hrefs.add(anchor.getAttribute("href"));
    }
    for ( String href : hrefs ) {
        driver.get(href);           
    }
    
    0 讨论(0)
  • 2021-01-05 23:13
        WebDriver _driver = new InternetExplorerDriver();
        _driver.navigate().to("http://www.google.co.in/");
        List <WebElement> alllinks = _driver.findElements(By.tagName("a"));
    
        for(int i=0;i<alllinks.size();i++)
            System.out.println(alllinks.get(i).getText());
    
        for(int i=0;i<alllinks.size();i++){
            alllinks.get(i).click();
            _driver.navigate().back();
        }
    
    0 讨论(0)
  • 2021-01-05 23:17

    Credit goes to "loan".

    I am also getting "stale exception" so I used 'loan' answer and works perfectly. Just if anyone need to know how to click on each link from results page try this (java)

    clickAllHyperLinksByTagName("h3"); where "h3" tag contains hyperlink

     public static void clickAllHyperLinksByTagName(String tagName){
        int numberOfElementsFound = getNumberOfElementsFound(By.tagName(tagName));
        System.out.println(numberOfElementsFound);
        for (int pos = 0; pos < numberOfElementsFound; pos++) {
            getElementWithIndex(By.tagName(tagName), pos).click();
            driver.navigate().back();
        }
    }
    
    public static int getNumberOfElementsFound(By by) {
        return driver.findElements(by).size();
    }
    
    public static WebElement getElementWithIndex(By by, int pos) {
        return driver.findElements(by).get(pos);
    }
    
    0 讨论(0)
  • 2021-01-05 23:19
    List <WebElement> links = driver.findElements(By.tagName("a"));                 
    int linkCount=links.size();
    
    System.out.println("Total number of page on the webpage:"+ linkCount);
    String[] texts=new String[linkCount];
    int t=0;
    for (WebElement text:links){
      texts[t]=text.getText();//extract text from link and put in Array
      //System.out.println(texts[t]);
      t++;
    }
    for (String clicks:texts) {
    
      driver.findElement(By.linkText(clicks)).click();
      if (driver.getTitle().equals("notWorkingUrlTitle" )) {
        System.out.println("\"" + t + "\""
        + " is not working.");
      } else {
        System.out.println("\"" + t + "\""
                           + " is working.");
      }
    
      driver.navigate().back();
    }
    
    driver.quit();
    
    0 讨论(0)
  • 2021-01-05 23:22

    There is no such a good idea to have following scenario :

    for (WebElement element : webDriver.findElements(locator.getBy())){
      element.click();
    }
    

    Why? Because there is no guarantee that the element.click(); will have no effect on other found elements, so the DOM may be changed, so hence the StaleElementReferenceException.

    It is better to use the following scenario :

    int numberOfElementsFound = getNumberOfElementsFound(locator);
    for (int pos = 0; pos < numberOfElementsFound; pos++) {
      getElementWithIndex(locator, pos).click();
    }
    

    This is better because you will always take the WebElement refreshed, even the previous click had some effects on it.

    EDIT : Example added

      public int getNumberOfElementsFound(By by) {
        return webDriver.findElements(by).size();
      }
    
      public WebElement getElementWithIndex(By by, int pos) {
        return webDriver.findElements(by).get(pos);
      }
    

    Hope to be enough.

    0 讨论(0)
  • 2021-01-05 23:26
    //extract the link texts of each link element
            for (WebElement elements : linkElements) {
                linkTexts[i] = elements.getText();
                i++;
            }
    
            //test each link
            for (String t : linkTexts) {
                driver.findElement(By.linkText(t)).click();
                if (driver.getTitle().equals(notWorkingUrlTitle )) {
                    System.out.println("\"" + t + "\""
                            + " is not working.");
                } else {
                    System.out.println("\"" + t + "\""
                            + " is working.");
                }
                driver.navigate().back();
            }
            driver.quit();
        }
    

    For complete Explanation Read This POST

    0 讨论(0)
提交回复
热议问题