我正在使用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);
}
}
实际上,它在输出中显示
[[FirefoxDriver:XP上的firefox(ce0da229-f77b-4fb8-b017-df517845fa78)] - &gt;标签名称:a]
作为链接,我想消除这些形式的结果。
答案 0 :(得分:8)
没有一个好主意有以下场景:
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);
}
希望足够。
答案 1 :(得分:1)
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();
}
答案 2 :(得分:1)
如果您确定使用WebDriver.get()
代替WebElement.click()
来测试链接,则另一种方法是将每个找到href
的{{1}}值保存在单独的清单。这样您就可以避免使用WebElement
,因为您在使用第一个StaleElementReferenceException
导航后并未尝试重复使用后续WebElement
。
基本示例:
WebElement.click()
答案 3 :(得分:1)
信贷归“贷款”。
我也得到“陈旧的例外”所以我使用'贷款'答案并且完美地工作。如果有人需要知道如何点击结果页面中的每个链接,请试试这个(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);
}
答案 4 :(得分:0)
//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
答案 5 :(得分:0)
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();