Synchronize Appium Execution with Wait Action
你的自動化測試總是跑得慢 ,又常常不穩定嗎?
那你應該是沒有好好處理執行時的同步問題
這邊介紹幾個解決執行同步的方式...
常用的同步方式
執行自動化測試時有時會因為- 腳本執行太快,元件還沒出現在畫面上造成錯誤
- 因為網路讀取速度不一定,元件不知道何時會出現在頁面上
- 有時會無預期的跳出通知或授權請求頁面
- Sleep (就是讓子彈睡ㄧ會)
- Implicit Wait (隱性等待)
- Explicit Wait (顯性等待)
Sleep
- 語法:
sleep(10)強制停止程式執行指定的秒數
最簡單常用的方式,也是造成執行速度慢的元兇
每個出現在script裡面的sleep 時間都會加總上去
雖然有這些缺點,某些情況還是需要使用它的
Implicit Wait (隱性等待)
隱性等待的做法是給定WebDriver一段指定的時間去持續搜尋整個頁面DOM直到元素出現 ,時間到就停止拋出Exception
語法:
driver.implicitly_wait(10)這段的意思就是
每個尋找element都要等10秒鐘
時間單位以秒計費
隱性等待一經過設定,在 driver的整個 生命週期內都有效
也就是在driver沒有被close以前,定位每個元素時,都會有 等待
10秒,只要設置一次就可以套用到之後的所有敘述
Explicit Wait (顯性等待)
顯性等待就是一種主動出擊的概念使用WebDriverWait和ExpectedCondition來實現依照不同
的單獨等待某個元素出現特定的條件
WebDriverWait執行等待的動作
ExpectedCondition提供一系列預先定義好的條件供使用
比較常用的有:
- element_to_be_clickable
- presence_of_element_located
- visibility_of_element_located
- element_to_be_selected
- invisibility_of_element_located
wait = WebDriverWait(driver, 10)這段的意思就是
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
指定等待10秒鐘直到element的狀態是clickable
Fluent Wait
這是加強版的顯性等待 ,除了能指定等待秒數加上指定每隔多久檢查一次
還可以忽略指定的Exception type
Java有提供Fluent wait class
Python沒有這樣的好康,我們只能土炮製作
語法:
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[NoSuchElementException,ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.ID,"someid")))這段的意思就是
指定等待10秒鐘, 每秒檢查一次, 直到元件出現clickable, 忽略指定的exception
一些有用的參數設定
大家應該有碰過一啟動App 還來不及執行就報錯誤了這裡 提供一個我自己處理的小技巧
可以用在DesiredCapabilities加上
'waitForAppScript': 'true'
這會告訴Appium要確實地等App已經打開才能開始動作
我們也可以指定每個頁面 的讀取時間,確保整個頁面都讀取完再進行下一步語法:
driver.set_page_load_timeout(5000)
Comments
Post a Comment