当前环境上的getText()生成StaleElementReferenceExeption:在Firefox运行硒的webdriver上表元素
- Selenium服务器版本2.37.0
- RemoteWebDriver
- 没有的Ajax /异步加载内容
我的测试正在尝试验证HTML表格的每个单元格的内容。之前访问任何表元素的明确等待验证表一旦被证实存在的<TBODY>元素存在
ExpectedCondition<WebElement> recruitTableIsPresent = ExpectedConditions.presenceOfElementLocated(By.id("newRecruitFieldAgentWidget:newRecruitDataTable_data"));
new WebDriverWait(driver, 5).until(recruitTableIsPresent);
,数据是通过行和列拉出
private Stats[] parseStats() {
String xpath = "//tbody[@id='regionalFieldAgentWidget:regionalDataTable_data']/tr[%d]/td[%d]";
Stats[] stats = new Stats[3];
for (int i = 0; i < stats.length; i++) {
String inProgresOrders = cellContent(xpath, i, 1);
String maxCapacity = cellContent(xpath, i, 2);
String allocationRatio = cellContent(xpath, i, 3);
Stats[i] = new Stats(inProgressORders, maxCapacity, allocationRatio);
}
return stats;
}
private String cellContent(String xpathTemplate, int row, int cell) {
String xpath = String.format(xpathTemplate, row + 1, cell + 1);
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath(xpath)));
WebElement elementByXPath = driver.findElementByXPath(xpath);
return elementByXPath.getText();
}
我不查看任何竞态条件,因为表格内容是用页面填充的,而不是在异步调用中。另外,我看到其他答案,建议通过驱动程序实例调用findElement()将刷新缓存。最后,在访问元素之前的明确等待应确保标签存在。
什么引起了gettext()方法返回了以下异常:
org.openqa.selenium.StaleElementReferenceException:元素在缓存中没有发现 - 也许是页面发生了变化,因为它是抬头
值得注意的是,失败是间歇性的。一些执行失败,而其他通过相同的代码通过。导致失败的表格单元格也不一致。
使用try Thread.sleep(1000)调试是否真的是种族问题,否则唯一的问题可能与刷新元素缓存有关! – Anirudh
我以前添加了5秒显式等待,没有直到()条件没有成功。我宁愿避免睡觉的线程,但我会试试 – PaoloV
原来,有一个异步回发,我一开始并没有注意到,这大大简化了问题。正如在类似的问题中提到的,下面的代码片段像一个魅力等待活动异步请求完成:(Long)jsContext.executeScript(“return(window.jQuery || {active:0})。active”); – PaoloV