Selenium常用的等待方式
Selenium常用的等待方式
為什麼需要等待?
在做自動化測試時,設計一些測試用例時,一些步驟需要等到上一步驟完成才能執行,這時候就需要等待上一步的完成,用等待來判斷,什麼時候才可以進行下一步操作。
否則,如果上一步還沒操作完,就執行下一步驟,那麼可能會定位不到指定元素,元素狀態不正確,驗證不正確等異常。
例如,在登入時,輸入地址,頁面需要載入完成,才可以輸入使用者名稱密碼。
例如,需要定位的元素在某個彈出框上,需要等待彈出框彈出後,才能定位到這個元素。
例如,需要驗證查詢結果的正確性,需要等到查詢結果完成之後,再去定位需要查詢的資料等等。
常用的三種等待方式
1. 強制等待
Thread.sleep(x) -- java; 等待x秒後,進行下一步操作。x是毫秒值。
強制等待x秒,強制讓瀏覽器等待x秒,不管當前操作是否完成,是否可以進行下一步操作,都必須等待x秒時間。暫停當前程序,把cpu片段讓給其他程序,減緩當前程序的執行。但是如果當前執行緒獲取到的有鎖,sleep不會讓出鎖。執行緒睡眠到期自動甦醒,並返回到可執行狀態(就緒),不是執行狀態。sleep()中指定的時間是執行緒不會執行的最短時間,sleep方法不能作為精確的時間控制。sleep()是靜態方法,只能控制當前正在執行的執行緒。
使用時,java方法需要throws InterruptedException
缺點除了不能精確把握等待時間外,如果在用例中大量使用,會浪費不必要的等待時間,影響測試用例的執行效率。一般不建議使用,但是在彈窗處理,可以優先選擇執行緒等待。
2. 隱式等待
使用方法:
頁面載入超時: webdriver.manage().timeouts().pageLoadTimeout(x, TimeUnit.SECONDS); 設定等待時間,是對頁面中的所有元素設定載入時間。
頁面元素載入超時:webdriver.manage().timeouts().implicitlyWait(x, TimeUnit.SECONDS); --java 在x時間內,頁面元素載入完成,便可進行下一步。在規定的時間範圍內,瀏覽器在不停的重新整理頁面,直到找到相關元素或者時間結束。
非同步指令碼超時: webdriver.manage().timouts().setScriptTimeout(x, TimeUnit.SECONDS);
設定了一個最長等待時間,如果在規定時間內網頁載入完成,則執行下一步,否則一直等到時間結束,然後執行下一步操作。超出設定時間後則丟擲找不到元素的異常。預設設定是0秒。一旦設定了隱式等待時間,它的作用範圍就是webdriver物件例項的整個生命週期。
3.顯示等待
WebDriverWait wait = new WebDriverWait(driver,10,1); //每隔1秒去呼叫一下until中的函式,預設是0.5秒,如果等待10秒還沒有找到元素,則丟擲TimeoutException/NoSuchElementException??異常。假設在第三秒就找到了這個元素,那麼就不會多等待剩下的7秒,而是繼續執行後續程式碼。
wait.unitl(new ExpectedCondition<WebElement>())
是針對某個特定的元素設定等待時間,如果在規定的時間範圍內,沒有找到元素,則會丟擲異常,如果在規定的時間內找到了元素,則直接執行,即找到元素就執行相關操作。
配合使用的ExpectedCondition: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html, 繼承自java.lang.Object
缺點使用相對比較複雜。優點是等待判斷準確,不會浪費多餘的等待時間,在用例中使用,可以提高執行效率。