亲爱的我所有使用Selenium EventFiringWebDriver记录被调用的Web驱动程序方法。我意识到我经常得到一个“StaleReferenceException”,而当我单独使用HtmlUnitDriver时,我没有问题。使用EventFiringWebDriver时Selenium StaleElementReferenceException
我也认识到虽然抛出了“StaleElementReferenceException”,但是在浏览器中执行了“click()”这个调用。
有没有人有一个想法,而EventFiringWebDriver遇到这样的问题,而使用HtmlUnitDriver或FirefoxDriver独立不? 难道是WebElements在运行时被原始驱动程序更新,而EventFiringWebDriver的wrapped WebElements不是? 或者我们应该提出这个作为EventFiringWebDriver实现的错误?
示例代码EventFiringWebDriver - 抛出StaleElementReferenceException
HtmlUnitDriver driver = new HtmlUnitDriver();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
ExtentReports extent = new ExtentReports ("report.html", true);
ExtentTest logger = extent.startTest("test");
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
eventDriver.register(new MyWebDriverEventListener(logger));
try {
WebElement element = null;
eventDriver.get("https://www.google.com");
element = eventDriver.findElement(By.xpath("//input[@type='text']"));
element.sendKeys("Test");
element.submit();
Thread.sleep(2000);
element = eventDriver.findElement(By.xpath("//div[@id='search']//a"));
String title = element.getText();
// HERE the StaleElementReferenceException get thrown ALTHOUGH the "click" event get processed by the browser, it loads already the page
try {
element.click();
} catch(StaleElementReferenceException ex) {
}
Thread.sleep(2000);
Assert.assertEquals(title, eventDriver.getTitle());
logger.log(LogStatus.PASS,"end","Test passed");
} catch(AssertionError error) {
logger.log(LogStatus.FAIL,"end","Test failed:" + error.getMessage());
throw error;
}
finally {
extent.endTest(logger);
extent.flush();
extent.close();
eventDriver.quit();
}
相同的代码 - 只是直接使用HtmlUnitDriver,没有任何问题,工作
HtmlUnitDriver driver = new HtmlUnitDriver();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
ExtentReports extent = new ExtentReports ("report.html", true);
ExtentTest logger = extent.startTest("test");
try {
WebElement element = null;
driver.get("https://www.google.com");
element = driver.findElement(By.xpath("//input[@type='text']"));
element.sendKeys("Test");
element.submit();
Thread.sleep(2000);
element = driver.findElement(By.xpath("//div[@id='search']//a"));
String title = element.getText();
element.click();
Thread.sleep(2000);
Assert.assertEquals(title, driver.getTitle());
logger.log(LogStatus.PASS,"end","Test passed");
} catch(AssertionError error) {
logger.log(LogStatus.FAIL,"end","Test failed:" + error.getMessage());
throw error;
}
finally {
extent.endTest(logger);
extent.flush();
extent.close();
driver.quit();
}