Synchronize Appium Execution with Wait Action


你的自動化測試總是跑得慢 ,又常常不穩定嗎?

那你應該是沒有好好處理執行時的同步問題


image

這邊介紹幾個解決執行同步的方式...


常用的同步方式

執行自動化測試時有時會因為
  1. 腳本執行太快,元件還沒出現在畫面上造成錯誤
  2. 因為網路讀取速度不一定,元件不知道何時會出現在頁面上
  3. 有時會無預期的跳出通知或授權請求頁面
我們通常會用下列三種方式來同步自動化測試:
  • 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)

Reference:

Comments