標籤:
手勢密碼在很多應用都會運到,手勢密碼都要求至少串連4個點,但AppiumLibrary並沒有提供對應的關鍵字,本人嘗試連續使用Swipe關鍵字兩次解決該問題,為什麼要用兩次呢?因為Swipe的參數只是起點和終點,如果直接給出手勢密碼的起點和重點,則會忽略中間的點,連續使用兩次Swipe關鍵字在Android中偶爾可以成功,但在iOS中則沒有一次成功過,為了徹底解決該問題,本人仔細看了Appium的文檔,終於所有發現,請看來自於Appium的官方網站的如下:
從中我得知手勢密碼的問題一定可以解決。
Robotframework基於Python,所以也只安裝了Appium的Python用戶端。
由於AppiumLibrary沒有提供手勢密碼關鍵字,那就自己寫一個Library。但是該嘗試失敗了,主要是由於Appium執行中需要很多上下文參數,而自己寫的Library如何與AppiumLibrary互動是個問題,也許可以解決,但可能會比較麻煩。
轉變下觀念,乾脆曲線救國吧。
既然安裝了AppiumLibrary,並且它是開源的,直接去修改其原始碼不就搞掂了嗎?
於是,去到AppiumLibrary安裝的檔案夾,預設會安裝到/Library/Python/2.7/site-packages/AppiumLibrary(Android的我用的是Windows 7進行測試,預設安裝路徑為:C:\Python27\Lib\site-packages\AppiumLibrary\keywords),再到keywords目錄中找到_touch.py檔案,就是它了。
給這個檔案的類_TouchKeywords加上一個方法gesture,具體代碼如下:
[python] view plaincopyprint?
- def gesture(self, platform):
- """ Gesture the element """
- driver = self._current_application()
- action = TouchAction(driver)
- if platform == "iOS":
- action.press(x=100, y=500).wait(ms=500).move_to(x=600, y=0). \
- wait(ms=500).move_to(x=0, y=500).wait(ms=500).release()
- else:
- action.press(x=50, y=100).wait(ms=500).move_to(x=150, y=0). \
- wait(ms=500).move_to(x=0, y=100).wait(ms=500).release()
- action.perform()
該方法的參數platform用於傳入平台,取值為iOS或者Android,這裡有兩個關鍵的知識點:
1.press方法中的座標為絕對座標,move_to方法中的座標都是相對座標,具體來說第一個move_to中的座標相對於press方法中的座標,第二個move_to方法中的座標相對於第一個move_to方法中的座標。
2.wait是必須的:開始我沒有用wait,結果效果是划動太快,直接從第一個點到了最後一個店,掠過了中間的點,加上wait之後就正常了。這裡ms表示為毫秒,ms=500就是等待500毫秒。
使用的話很簡單:在iOS中為:Gesture iOS;在Android中為:Gesture Android
可能有些人會問為什麼把座標點寫死了,不做為參數傳遞進來呢?
其實我一開始也是把座標作為參數,共用了三組座標分別表示起點,中間的點和終點座標,但執行時總是報錯,也一直找不到原因,後來想到其實手勢密碼是不變的,並不需要改變,乾脆寫成寫入程式碼,如果座標變化了,那就直接改這個檔案即可,反正Python是解釋型的語言,用到的時候會自動編譯,也省去了編譯的麻煩,也是很方便的。
在iOS和Android中都測試通過。
本文中的兩個問題:
1.如何寫一個Library來提供手勢密碼
2.如何把座標作為參數傳遞進來
也請朋友分享下你們的解決方案,歡迎互動討論。
Appium+Robotframework實現iOS應用的自動化測試-6:手勢密碼的解決方案