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

Sha*_*mmi 4 java testng selenium-webdriver

我正在使用Selenium WebDriver和java.

我从网页上获取所有链接,并尝试逐个点击每个链接.我收到以下错误:

错误org.openqa.selenium.StaleElementReferenceException:在缓存中找不到元素 - 自查询以来页面可能已更改命令持续时间或超时:30.01秒有关此错误的文档,请访问: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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

实际上,它在输出中显示

[[FirefoxDriver:XP上的firefox(ce0da229-f77b-4fb8-b017-df517845fa78)] - >标签名称:a]

作为链接,我想消除这些形式的结果.

Ioa*_*oan 8

有以下场景没有这么好的主意:

for (WebElement element : webDriver.findElements(locator.getBy())){
  element.click();
}
Run Code Online (Sandbox Code Playgroud)

为什么?因为不能保证element.click();对其他找到的元素没有影响,所以DOM可能会改变,所以因此StaleElementReferenceException.

最好使用以下方案:

int numberOfElementsFound = getNumberOfElementsFound(locator);
for (int pos = 0; pos < numberOfElementsFound; pos++) {
  getElementWithIndex(locator, pos).click();
}
Run Code Online (Sandbox Code Playgroud)

这样更好,因为你总是会WebElement刷新,即使之前的点击对它有一些影响.

编辑:添加示例

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

  public WebElement getElementWithIndex(By by, int pos) {
    return webDriver.findElements(by).get(pos);
  }
Run Code Online (Sandbox Code Playgroud)

希望足够.