我的目标是点击列表中的每个链接,从新打开的页面(包含表格)中获取特定文本,然后返回上一页(包含所有链接的主页面),打开第二个链接等等... 因为我在Java selenium中相对较新我现在不知道如何返回主 页面并继续循环(从第一个打开的页面收集信息之后) )。
我尝试使用此代码但发生此错误:线程中的异常" main" org.openqa.selenium.StaleElementReferenceException:在缓存中找不到元素 - 也许页面自查找以来已更改 命令持续时间或超时:10.04秒
package expofair;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class exponull {
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// go to main page
driver.get(mainpage);
Thread.sleep(2000);
driver.manage().window().maximize();
// list of all links
List<WebElement> lista1 = driver.findElements(By.cssSelector(".tl.nobr>a"));
Iterator<WebElement> iter = lista1.iterator();
while(iter.hasNext()) {
WebElement we = iter.next();
we.click();
String S1 = driver.findElement(By.cssSelector("#nm-date")).getText();
System.out.println(S1);
}
}
}
答案 0 :(得分:0)
当您通过转到另一个页面甚至刷新DOM来更改DOM时,驱动程序会释放它所具有的WebElements并查看新元素,即使页面完全相同。导致StaleElementReferenceException
。
每次迭代都需要重新找到元素:
List<WebElement> lista1 = null;
int size = 1;
for (int i = 0 ; i < size ; ++i) {
lista1 = driver.findElements(By.cssSelector(".tl.nobr > a")); //locate all the links
size = lista1.size(); //change the loop itreations number to the right one
lista1.get(i).click(); //click on the link
System.out.println(Sdriver.findElement(By.id("nm-date")).getText()); //print the data
driver.navigate().back(); //go to previous page
}