我试图打印谷歌搜索中显示的前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());
}
}
}
它打印得很好,直到第2页,但在我得到
之后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
答案 0 :(得分:0)
您的脚本正在尝试点击第一页上的每个链接,这会将您带到一个新页面。一旦它完成该页面上的工作,它似乎无法返回到第一页,因此脚本无法找到列表中的下一个链接。
即使它确实返回到第一页,您仍然会有一个陈旧元素,因为页面已经重新加载。您需要通过其他内容跟踪第一页中的链接(比如href可能?),然后在点击之前再次通过该标识找到该链接。
答案 1 :(得分:0)
这是由于在移动到另一个页面后引用对象。请尝试在最后的for循环中添加以下行。它可以解决过时的参考问题。
driver.navigate().back();
fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));
答案 2 :(得分:0)
有几件事:
printLinksName()
时。Generic List
类型WebElement
中。for()
循环内点击 WebElement
的Page 2
,然后拨打printLinksName()
打印所有链接。 for()
循环内的第二次迭代时,List<WebElement> fiveLinks
的引用会因DOM已更改而丢失。因此,您会看到 StaleElementReferenceException
。避免 StaleElementReferenceException
的简单解决方案是在List<WebElement> fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));
循环中移动代码行for()
。所以你的代码块看起来像:
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());
}
}
}
注意:在这个简单的解决方案中,当您完成第二页的打印时,接下来当您第二次使用
List<WebElement> fiveLinks
创建xpath
到.//*[@id='nav']/tbody/tr/td/a
时, {{1} } 是第一个存储在Page 1
列表中的元素。因此,您可能会再次被重定向到fiveLinks
。为避免这种情况,您可以考虑通过适当的索引来获取Page 1
的帮助。