java 如何使用Selenium WebDriver获取所有链接并逐个单击这些链接

xienkqul  于 2023-04-19  发布在  Java
关注(0)|答案(7)|浏览(119)

我正在使用Selenium WebDriver和Java。
我正在获取网页上的所有链接,并试图逐个点击每个链接。我得到下面的错误:
error org.openqa.selenium.StaleElementReferenceException:元素该高速缓存中找不到-可能页面在查找后已更改命令持续时间或超时:如需有关此错误的文档,请访问:http://seleniumhq.org/exceptions/stale_element_reference.html构建信息:版本:“2.25.0”,修订版:‘17482’,时间:2012-07-18 21:09:54
下面是我的代码:

public void getLinks()throws Exception{
    try {
        List<WebElement> links = driver.findElements(By.tagName("a"));
        int linkcount = links.size(); 
         System.out.println(links.size()); 
          for (WebElement myElement : links){
         String link = myElement.getText(); 
         System.out.println(link);
         System.out.println(myElement);   
        if (link !=""){
             myElement.click();
             Thread.sleep(2000);
             System.out.println("third");
            }
            //Thread.sleep(5000);
          } 
        }catch (Exception e){
            System.out.println("error "+e);
        }
    }

实际上,它显示在输出中
[[FirefoxDriver:firefox on XP(ce0da229-f77b-4fb8-b017-df517845fa78)] -〉tag name:a]
作为链接,我想消除这些形式的结果。

ni65a41a

ni65a41a1#

有没有这样一个好主意,有以下情况:

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

为什么?因为不能保证element.click();不会对其他找到的元素产生影响,所以DOM可能会被改变,因此StaleElementReferenceException也会被改变。
最好使用以下场景:

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

这是更好的,因为你将始终采取WebElement刷新,即使以前的点击有一些影响。
编辑:添加示例

public int getNumberOfElementsFound(By by) {
    return webDriver.findElements(by).size();
  }

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

希望足够了。

mhd8tkvw

mhd8tkvw2#

信用属于“贷款”。
我也得到了“陈旧异常”,所以我用'贷款'的答案和完美的作品。只是如果有人需要知道如何点击每个链接从结果页尝试这个(java)
clickAllHyperLinksByTagName("h3");其中“h3”标记包含超链接

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);
}
nimxete2

nimxete23#

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();
    }
yks3o0rb

yks3o0rb4#

如果您可以使用WebDriver.get()而不是WebElement.click()来测试链接,另一种方法是将每个找到的WebElementhref值保存在一个单独的列表中。这样您就可以避免StaleElementReferenceException,因为您在使用第一个WebElement.click()导航离开后不会尝试重用后续的WebElement
基本示例:

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);           
}
ie3xauqp

ie3xauqp5#

//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();
    }

完整的解释请阅读此POST

ktca8awb

ktca8awb6#

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();
ncgqoxb0

ncgqoxb07#

List jobLinks =driver.findElements(By.tagName(“loc”));

List<String> texts = new ArrayList<String>();

    for (WebElement element : jobLinks) {
        texts.add(element.getText());
    }

    for(String text:texts) {

相关问题