篇4 安卓app自動化測試-Appium API進階
--lamecho辣么丑
1.1概要
大家好! 我是lamecho(辣么丑),今天是《安卓app自動化測試》的第四篇,可以說是使用appium的進階,本篇不去糾結如何去找界面元素(不明白的同學移步到我的上一篇學習)而是主要根據手機app的特性,介紹有關的操作方法,比如如何鎖屏如何在鎖屏后點亮屏幕並做手勢解鎖等等類似的操作實現。
1.2 appium玩轉安卓手機
智能手機發展到今天,形成了一整套有關手勢操作的操作習慣,如手指左右上下滑動,及雙指縮放,還有手指的滑動解鎖,搖晃手機等動作。那么我們怎么在python中利用appium實現這些復雜的動作呢?接下來我將對大家感興趣的一些操作,一步步認識我們強大的Appium。
1.屏幕滑動—swipe
還記得我們在使用今日頭條的實戰中,切換熱點標簽是通過點擊動作實現的吧。當然我們平時在使用手機時最多的還是利用android系統的特點,一般是通過手指的左右滑動屏幕來實現切換的。那么我們來看看腳本中是如何寫的。
……
w=driver.get_window_size()['width']
h=driver.get_window_size()['height']
driver.swipe(int(w*0.25),int(h*0.5),int(w*0.75),int(h*0.5),1000)
sleep(2)
driver.swipe(int(w*0.5),int(h*0.75),int(w*0.5),int(h*0.25) ,1000)
大家應該直到屏幕的滑動分為四種,上划,下划,左划和右划。所以我們在利用swipe方法時通過變化里邊的參數值來實現。首先我們看看swipe方法的API文檔介紹
Swipe from one point to another point, for an optional duration.
:Args:
- start_x - x-coordinate at which to start
- start_y - y-coordinate at which to start
- end_x - x-coordinate at which to stop
- end_y - y-coordinate at which to stop
- duration - (optional) time to take the swipe, in ms.
:Usage:
driver.swipe(100, 100, 100, 400,1000)
swipe方法包含5個參數,起始點的坐標,終點的坐標及移動的時長。而這里我們確定坐標不采用絕對值,而是通過屏幕的相對值坐標位置去操作滑動,這樣的好處就是不需要考慮不同分辨率帶來的影響,讓你的腳本在不同分辨率的手機上都可以順利執行。所以這里我們先通過get_window_size()方法獲取到當前手機的長,寬,然后再通過長寬上的不同比例來實現兩個點的定位。driver.swipe(int(w*0.25),int(h*0.5),int(w*0.75),int(h*0.5),1000)實現的是屏幕的左划;driver.swipe(int(w*0.5),int(h*0.75),int(w*0.5),int(h*0.25) ,1000)實現的是屏幕的上划操作。大家可以把腳本加到我們的今日頭條的demo腳本中,去看看實現效果,左划一次做頁面的切換,上划瀏覽今日頭條下面的文章。這里注意我們的左后一個參數時間,當我們的時間設置的很短,帶來的效果是對應我們滑動的速率很快,拿上划來說你將瀏覽更多的文章。具體的效果大家可以自行體驗一下。
2.屏幕點擊—tap
driver.tap()方法是模擬手指多點點擊的,即我們常說的多點觸控。我們拿兩點觸控來說就是兩根手指點擊屏幕
driver.tap([(398,1864),(703,1852),],3000)
我們將其加到代碼中,實現這兩個坐標點的同時點擊3秒。這里要介紹一下,如何快速的查看到當前屏幕的坐標,在手機的設置-開發者選項中有一個“顯示觸摸位置”和“顯示指針位置”的選項,打開即可看到屏幕的最上方就會顯示坐標了。另外多點觸控最多支持5個點位的同時點擊。
3. pinch和zoom縮放
這兩個方法pinch是實現屏幕上元素的縮小,常用於圖片的縮小;那么zoom就是元素的放大了。
pinch(self, element=None, percent=200, steps=50)
zoom(self, element=None, percent=200, steps=50)
比如找到我們要進行縮放的元素element,縮放比例percent200就是2倍的比率,steps是步長。比如我們在進入頭條點開一個圖片后,對圖片進行放大操作
els=driver.find_elements_by_class_name('android.widget.ImageView')
sleep(3)
driver.zoom(els[0],200,50)
4. 鎖屏及手勢解鎖
在模擬手勢解鎖屏幕上,我們需要導入appium的TouchAction模塊其實這個模塊的功用類似selenium里的ActionChain,用法也都類似。在使用TouchAction時我們可以在一行的語句中實現連續的動作執行,思考一下手勢解鎖的操作流程:點擊第一個位置然后移動到第二個位置,再移動到第三個位置,以此類推最后手指移開。那么大家看看這樣一些的動作我們使用TouchAction怎么來完成。
TouchAction(driver).press(x=159,y=749).move_to(x=206,y=0).move_to(x=206,y=0).move_to(x=0,y=201).move_to(x=0,y=201).release().perform()
這里需要注意的一點是,在move_to里填寫的必須是相對坐標。好了,解鎖會了,那怎么使用屏幕鎖屏呢?這個就很簡單了執行
driver.lock(3)
driver.keyevent(26)
第一行就是我們的鎖屏命令,里邊的參數標識鎖屏時間,不過實際執行中並沒有起到時間的作用。第二行這里大家也要注意一下,它是keyevent表示我們執行一些手機鍵盤指令動作,26表示的是電源鍵。具體還有哪些,大家自行搜索網上有很多,我就不在這里列出來了。
這樣的動作就是鎖屏然后操作電源鍵點亮屏幕,接下來就是執行我們的解鎖動作就可以了。
5. 拖拽—drag_and_drop
這個動作也很好理解,比如在qq消息中當接收到新消息后在消息列表右邊會出現一個表示消息數的小圓圈,我們手指拖動它后會將其取消掉。那么這樣的操作在appium里怎么實現呢?那就用到drag_and_drop方法了,我們看看具體的腳本,由於今日頭條沒有這樣的操作,我就在qq中去執行了,腳本如下:
els_title=driver.find_elements_by_id('icon')
els_unmsg=driver.find_elements_by_id('unreadmsg')
driver.drag_and_drop(els_unmsg[0],els_title[0])
找到我們要拖拽的元素els_unmsg,然后拖拽到另一個元素els_title位置,這樣就實現了這個動作。大家可以在qq的app里演示一下。
6. 搖一搖—shake
搖晃手機,高大上了有沒有。但是很遺憾的是這個方法appium還沒有實現,運行會報錯。還有很多方法我就不在文章里一一介紹了,我只是撿了幾個比較重要,大家遇到問題最多的的幾個命令來做講解。
好了,我們的《app自動化測試第四篇- Appium API進階》也要結束了。希望大家把文章中涉及的方法自己都去找個APP實現一下,這樣加深理解。在寫app自動化測試的系列的空擋中我同時寫了兩篇關於python接口測試的文章《book-python-auto-test-番外篇--接口》希望大家關注學習。最后感謝大家耐心讀完本篇文章,我是lamecho,辣么丑。
