問題描述:wap版支付成功后,跳轉到支付成功頁,查找的元素已出現,如圖的:元素1,元素2,但是提示查找的元素超時,失敗,並且每到這個頁面都會報頁面超時,不能查找到頁面元素
原始代碼:
try{ op.actionSingleClick("PlaceYourOrderBtn"); //點擊確認提交支付按鈕 Page.pause(4); } catch (Exception e) { e.printStackTrace(); } String successMsg1 = op.loopGetElementText("successMsg1", 10, 60); .//獲取支付成功提示 Log.logInfo("支付成功提示為:"+successMsg1);.
actionSingleClick內容:
public void actionSingleClick(String elementStr) throws Exception { boolean res = false; boolean printFlag = true; int loopTimes = 3; for (int i = 1; i <= loopTimes; i++) { try { WebElement element = MyWebDriverWait2(elementStr, explicitWaitTimeoutLoop, false, false); action.moveToElement(element).click().perform(); Thread.sleep(1000); res = true; break; } catch (Exception e) { if (printFlag) { e.printStackTrace(); printFlag = false; } Log.logWarn("模擬鼠標操作時發生異常(" + GetMethodName() + ")."); } } if (!res) { Log.logWarn("連續 " + loopTimes + " times,模擬鼠標操作發生異常."); throw new RetryException(); } }
執行后報錯提示如下:
timeout: cannot determine loading status
連續 3 times,模擬鼠標操作發生異常.
提示在點擊確認按鈕“PlaceYourOrderBtn”就已經出錯,但是錯誤截圖是在已支付成功的頁面
本地測試,發現控件有時能查找到,有時查找不到,原因能查找到的元素時,頂部的進度條已完成,而沒有查找到控件時,頂部進度條,一直在是80%呈未加載完成的狀態,類似如圖
思路方案:
方案1,使用selenium的隱時頁面等待:
try{ driver.manage().timeouts().implicitlyWait(25, TimeUnit.SECONDS); op.actionSingleClick("PlaceYourOrderBtn"); //點擊確認提交支付按鈕 Page.pause(4); } catch (Exception e) { e.printStackTrace(); } String successMsg1 = op.loopGetElementText("successMsg1", 10, 60); Log.logInfo("支付成功提示為:"+successMsg1);.//獲取支付成功提示
意思是:總共等待25秒, 如果25秒后,元素還不存在,就會拋出異常 org.openqa.selenium.NoSuchElementException
隱式等待相當於設置全局的等待,在定位元素時,對所有元素設置超時時間。
發現這個隱時等待沒用,設置了足夠的時間還是沒有找到,不能解決問題,
方案2:想通過頁面的加載狀態,頁面在規定時間內加載不成功,就在刷新
try { driver.manage().timeouts().pageLoadTimeout(60,TimeUnit.SECONDS) op.actionSingleClick("PlaceYourOrderBtn"); //點擊確認提交支付按鈕 Page.pause(4); } catch (Exception e) { e.printStackTrace(); } String successMsg1 = op.loopGetElementText("successMsg1", 10, 60); Log.logInfo("支付成功提示為:"+successMsg1);.//獲取支付成功提示
意思是:頁面加載超過60S報錯,並重新進行頁面刷新
想當頁面加載超過60S,報錯,並重新刷新頁面,當時設置過刷新頁面3次,這個偶爾好使,但網絡慢時,刷新3次或者4次都不管用
方案3:顯示等待
try{ op.actionSingleClick("PlaceYourOrderBtn"); //點擊確認提交支付按鈕 Page.pause(4); } catch (Exception e) { Log.logInfo("點擊提交按鈕,頁面超時了,但是頁面已經顯示了支付成功頁,繼續執行下一步");} try { wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#mainWrap> div.msg-page > p")));//先判斷是否存在,存在就打印下面一句,不存在就報錯 Log.logInfo("成功進入支付成功頁面!!!"); } catch (Exception e) { e.printStackTrace(); Log.logError("進入支付成功頁面失敗!!!,不進行下一步操作"); } String successMsg1 = op.loopGetElementText("successMsg1", 10, 60); Log.logInfo("支付成功提示語為:"+successMsg1); .
當頁面加載很慢時,使用顯示等待:等到需要操作的那個元素加載成功之后就直接操作這個元素,不需要等待其他元素的加載
意思是:當點擊按鈕后跳轉到另外一個頁面,頁面還是在加載中,默認是60s,頁面加載已超時,但是頁面上已經出現了需要查找的控件,等待報錯后,還會繼續執行,如果成功頁面的提示在10s內有這個元素,繼續執行下一步,就解決頁面沒有加載完,找不到元素的問題
等待的條件 |
WebDriver方法 |
頁面元素是否在頁面上可用和可被單擊 |
elementToBeClickable(By locator) |
頁面元素處於被選中狀態 |
elementToBeSelected(WebElement element) |
頁面元素在頁面中存在 |
presenceOfElementLocated(By locator) |
在頁面元素中是否包含特定的文本 |
textToBePresentInElement(By locator) |
頁面元素值 |
textToBePresentInElementValue(By locator, java.lang.String text) |
標題 (title) |
titleContains(java.lang.String title) |