在尝试打印链接名称时获取 StaleElementReferenceException



我正在尝试打印谷歌搜索中显示的前 5 页链接。但是获取 StateElementReferenceException 不确定哪一个出错了。

public class GoogleCoInTest {
static WebDriver driver = null;
public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.gecko.driver", "D:\bala back up\personel\selenium\Jars\Drivers\geckodriver.exe");
driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://www.google.co.in/");
//driver.findElement(By.xpath("//input[class='gsfi']")).sendKeys("Banduchode");;
WebElement search=driver.findElement(By.cssSelector("input#lst-ib"));
search.sendKeys("Banduchode");
search.sendKeys(Keys.ENTER);
printLinksName();
List<WebElement> fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));

for(int i=0;i<5;i++){
System.out.println(fiveLinks.get(i).getText());
fiveLinks.get(i).click();
Thread.sleep(5000);
printLinksName();

}
}   

public static void printLinksName() throws InterruptedException{
List<WebElement> allLinks=driver.findElements(By.xpath("//*[@id='rso']/div/div/div/div/div/h3/a"));
System.out.println(allLinks.size()); 
//print all list        
for(int i=0;i<allLinks.size();i++){
System.out.println("Sno"+(i+1)+":"+allLinks.get(i).getText());
}   
}
}

它打印得很好,直到第二页,但在我得到之后

Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: The element reference of <a class="fl"> stale: either the element is no longer attached to the DOM or the page has been refreshed
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html

有几件事:

  1. 脚本按预期打印前 2 页的结果。
  2. 当您第一次调用printLinksName()时,它可以工作。
  3. 接下来,您将 10 页码存储在类型为WebElementGeneric List中。
  4. 第一次在for()循环中,您单击Page 2WebElement,然后通过调用printLinksName()打印所有链接。
  5. 当您处于循环for()第二次迭代时,随着 DOM 的更改,List<WebElement> fiveLinks的引用将丢失。因此,您会看到StaleElementReferenceException.

溶液

避免StaleElementReferenceException的简单解决方案是在for()循环中移动List<WebElement> fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));的代码行。因此,您的代码块将如下所示:

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Q44970712_stale 
{
static WebDriver driver = null;
public static void main(String[] args)  throws InterruptedException
{
System.setProperty("webdriver.gecko.driver", "C:\Utility\BrowserDrivers\geckodriver.exe");
driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://www.google.co.in/");
//driver.findElement(By.xpath("//input[class='gsfi']")).sendKeys("Banduchode");;
WebElement search=driver.findElement(By.cssSelector("input#lst-ib"));
search.sendKeys("Banduchode");
search.sendKeys(Keys.ENTER);
printLinksName();

for(int i=0;i<5;i++)
{
List<WebElement> fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));
System.out.println(fiveLinks.get(i).getText());
fiveLinks.get(i).click();
Thread.sleep(5000);
printLinksName();
}
}
public static void printLinksName() throws InterruptedException
{
List<WebElement> allLinks=driver.findElements(By.xpath("//*[@id='rso']/div/div/div/div/div/h3/a"));
System.out.println(allLinks.size()); 
//print all list        
for(int i=0;i<allLinks.size();i++)
{
System.out.println("Sno"+(i+1)+":"+allLinks.get(i).getText());
}   
}
}

备注:在这个简单的解决方案中,当您完成打印第二页时,接下来您将使用.//*[@id='nav']/tbody/tr/td/a创建List<WebElement> fiveLinks通过xpathPage 1是存储在fiveLinks列表中的第一个元素。因此,您可能会再次被重定向到Page 1.为了避免这种情况,您可以考虑通过适当的索引来帮助xpath

您的脚本正在尝试单击第一页中的每个链接,这会将您带到一个新页面。 一旦它完成了该页面上的工作,它似乎不会返回到第一页,因此脚本无法在列表中找到下一个链接。

即使它确实返回到第一页,您仍然会有一个过时的元素,因为页面已被重新加载。 您需要通过其他内容(例如href?(跟踪第一页中的链接,并在单击该标识符之前再次找到该链接。

这是由于在移动到另一个页面后引用对象。 请尝试在末尾的 for 循环中添加以下行。它可能会解决过时的引用问题。

driver.navigate().back();
fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));

相关内容

  • 没有找到相关文章

最新更新