selenium顯示等待解決瀏覽器未加載完成查找控件的問題


問題描述: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)

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM