https://docs.seleniumhq.org/exceptions/stale_element_reference.jsp
页面元素过期,引用的元素过时,不再依附于当前页面,需要重新定位获取元素对象
如果JavaScript把网页给刷新了,那么操作的时候就会碰到Stale Element Reference Exception
1,用executeScript 等待元素加载显示完成并点击
@Keyword
def public void JavaScriptClick(WebElement element) {
WebDriver driver = DriverFactory.getWebDriver()
jsexecutor = (JavascriptExecutor) driver;
try {
// 判断传入的element元素是否处于可单击状态,以及是否能显示在页面上
if (element.isEnabled() && element.isDisplayed()) {
System.out.println("使用JavaScript进行页面元素的单击");
// 执行JavaScript语句arguments[0].click();
//argumets[0]表示第一个参数,即element
jsexecutor.executeScript("arguments[0].click();", element);
} else {
System.out.println("页面上的元素无法进行单击操作");
}
} catch (StaleElementReferenceException e) {
// e是Throwable的实例异常对象,用在catch语句中,相当于一个形参,一旦try捕获到了异常,那么就将这个异常信息交给e,由e处理
// TODO: handle exception
System.out.println("页面元素没有附加在网页中"+e.getStackTrace());
} catch (NoSuchElementException e) {
// TODO: handle exception
System.out.println("在页面中没有找到要操作的元素"+e.getStackTrace());
} catch (Exception e) {
// TODO: handle exception
System.out.println("无法完成单击动作"+e.getStackTrace());
}
}
note:getStackTrace()
getStackTrace()返回的是通过getOurStackTrace方法获取的StackTraceElement[]数组,而这个StackTraceElement是ERROR的每一个cause by的信息。
printStackTrace()返回的是一个void值,但是可以看到其方法内部将当前传入打印流锁住,然后同样通过getOurStackTrace方法获取的StackTraceElement[]数组,只不过printStackTrace()方法直接打印出来了。而getStackTrace()则是得到数组,使用者可以根据自己的需求去得到打印信息,相比printStackTrace()会更细一些。
2.先判断元素是否显示,在对元素进行操作
public Boolean isDisplay(final String xpath, final String text) {
logger.info("等待指定元素文本显示");
boolean result = false;
int attempts = 0;
while (attempts < 5) {
try {
attempts++;
logger.info("扫描开始元素开始第" + attempts + "次");
result = new WebDriverWait(driver, 30)
.until(new ExpectedCondition
public Boolean apply(WebDriver driver) {
return driver.findElement(By.xpath(xpath)).getText().contains(text);
}
});
logger.info("扫描开始元素结束");
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}