https://docs.seleniumhq.org/exceptions/stale_element_reference.jsp?
頁面元素過期,引用的元素過時,不再依附于當前頁面刃唤,需要重新定位獲取元素對象
如果JavaScript把網(wǎng)頁給刷新了,那么操作的時候就會碰到Stale Element Reference Exception
1,用executeScript 等待元素加載顯示完成并點擊
@Keyword
def public void JavaScriptClick(WebElement element) {
WebDriver driver = DriverFactory.getWebDriver()
jsexecutor = (JavascriptExecutor) driver;
try {
// 判斷傳入的element元素是否處于可單擊狀態(tài)刽射,以及是否能顯示在頁面上
if (element.isEnabled() && element.isDisplayed()) {
System.out.println("使用JavaScript進行頁面元素的單擊");
// 執(zhí)行JavaScript語句arguments[0].click();
//argumets[0]表示第一個參數(shù)轻掩,即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("頁面元素沒有附加在網(wǎng)頁中"+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[]數(shù)組膛堤,而這個StackTraceElement是ERROR的每一個cause by的信息手趣。
? ?printStackTrace()返回的是一個void值,但是可以看到其方法內(nèi)部將當前傳入打印流鎖住肥荔,然后同樣通過getOurStackTrace方法獲取的StackTraceElement[]數(shù)組绿渣,只不過printStackTrace()方法直接打印出來了。而getStackTrace()則是得到數(shù)組燕耿,使用者可以根據(jù)自己的需求去得到打印信息中符,相比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<Boolean>() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? public Boolean apply(WebDriver driver) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return driver.findElement(By.xpath(xpath)).getText().contains(text);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? logger.info("掃描開始元素結(jié)束");
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result;
? ? }