環(huán)境配置可以參考:https://github.com/openatx/uiautomator2
1.啟動夜神模擬器
不要開啟各種安全衛(wèi)士,不然夜神模擬器會莫名其妙的卡在99%處。將夜神模擬器改成手機版,一般默認是平板。
2.在cmd下輸入:adb devices查看已連接設備。
正常情況下,會有如下輸出,如果沒有,測試下adb有沒有加入到環(huán)境變量,在cmd里輸入adb,或者adb version,是否報錯。
3.在cmd下輸入:python -m weditor
它會自動在瀏覽器打開一個窗口
Weditor旁邊默認是Android,如果不是,改回Android,往右填寫的是ip地址和端口號,如果是模擬器,就填寫第二步adb devices輸出的那個地址和端口。點一下連接,如連接成功,旁邊會顯示稻穗。灰色框里會出現(xiàn)夜神的界面。如果灰色框內(nèi)手機界面是黑屏,可以在模擬器里打開強制渲染,然后reload下Weditor;如果還不行,重啟夜神模擬器;如果還不行,執(zhí)行下圖框內(nèi)動作。關于黑屏的以上不分先后,可循環(huán)多次執(zhí)行。在渲染開啟后如果黑屏消失,可以關了渲染。(下圖來自:github)
4.pycharm進場
首先看下是否連接:
有信息輸出,說明連接成功了。
5.獲取app名稱
上圖右側這些鍵值對都可以使用,這里先使用最簡單的位置信息,將下面的位置代碼復制一下并執(zhí)行也可以使用xpath
(d.xpath("http://android.widget.TextView[@text='考研幫']").click())
import uiautomator2 as u2
d = u2.connect('127.0.0.1:62001')
d.click(0.482, 0.532)
print(d.info)
將會看到考研幫APP已經(jīng)啟動了
在weditor里reload一下,讓兩者同步
然后定位下“跳過”的鍵值對,備用。
現(xiàn)在代碼進行到跳過這一步了,代碼如下:
import uiautomator2 as u2
d = u2.connect('127.0.0.1:62001')
d.click(0.482, 0.532)
d(resourceId="com.tal.kaoyan:id/tv_skip").click()
在模擬器里將應用的數(shù)據(jù)清除下就可以執(zhí)行上面的代碼了
6.執(zhí)行登錄
和上面類似,定位用戶名,密碼,登錄按鈕,執(zhí)行代碼就好。在執(zhí)行之前先清理下應用數(shù)據(jù),或者在代碼里面加判斷。
代碼如下:
# -*- coding: utf-8 -*-
# @AuThor : frank_lee
import uiautomator2 as u2
d = u2.connect('127.0.0.1:62001')
# d.click(0.482, 0.532)
d.xpath("http://android.widget.TextView[@text='考研幫']").click()
d(resourceId="com.tal.kaoyan:id/tv_skip").click()
d(resourceId="com.tal.kaoyan:id/login_email_edittext").send_keys("starrymusic")
d(resourceId="com.tal.kaoyan:id/login_password_edittext").send_keys("我是密碼")
d(resourceId="com.tal.kaoyan:id/login_login_btn").click()
對于這種跳出的對我們無用的信息,我們需要跳過或叉掉,叉掉前需要加以判斷,有沒有出現(xiàn)這些元素,如果沒出現(xiàn)而執(zhí)行了該動作勢必會報錯。
類比上述步驟,可以使用代碼執(zhí)行登錄,并滑動“休閑空間”某個神奇的板塊
代碼如下:
# -*- coding: utf-8 -*-
# @AuThor : frank_lee
import uiautomator2 as u2
import time
# 連接模擬器
d = u2.connect('127.0.0.1:62001')
# 打開考研幫
try:
if d.xpath("http://android.widget.TextView[@text='考研幫']").wait(3):
d.xpath("http://android.widget.TextView[@text='考研幫']").click()
time.sleep(2)
except:
pass
# 點擊跳過頁面
try:
if d(resourceId="com.tal.kaoyan:id/tv_skip").wait(3):
d(resourceId="com.tal.kaoyan:id/tv_skip").click()
except:
pass
try:
# 實現(xiàn)登錄
if d(resourceId="com.tal.kaoyan:id/login_email_edittext").wait(2):
d(resourceId="com.tal.kaoyan:id/login_email_edittext").send_keys("starrymusic")
d(resourceId="com.tal.kaoyan:id/login_password_edittext").send_keys("我是密碼")
time.sleep(1)
d(resourceId="com.tal.kaoyan:id/login_login_btn").click()
time.sleep(2)
except:
pass
try:
# 下線通知
if d(resourceId="com.tal.kaoyan:id/tip_commit").wait(3):
d(resourceId="com.tal.kaoyan:id/tip_commit").click()
time.sleep(2)
# 發(fā)現(xiàn)新版本
if d(resourceId="com.tal.kaoyan:id/view_wemedia_cacel").wait(3):
d(resourceId="com.tal.kaoyan:id/view_wemedia_cacel").click()
time.sleep(2)
# 隱私條款
if d(resourceId="com.tal.kaoyan:id/tv_agree").wait(3):
d(resourceId="com.tal.kaoyan:id/tv_agree").click()
time.sleep(3)
# 下線通知
if d(resourceId="com.tal.kaoyan:id/tip_commit").wait(3):
d(resourceId="com.tal.kaoyan:id/tip_commit").click()
time.sleep(2)
except:
pass
try:
# 點擊下面社區(qū)板塊
if d(resourceId="com.tal.kaoyan:id/mainactivity_button_forum").wait(3):
d(resourceId="com.tal.kaoyan:id/mainactivity_button_forum").click()
time.sleep(0.5)
d(resourceId="com.tal.kaoyan:id/mainactivity_button_forum").click()
time.sleep(1)
# 上面為什么執(zhí)行兩次,規(guī)避彈出頁
# 點擊更多板塊
if d(resourceId="com.tal.kaoyan:id/mainactivity_button_forum").wait(3):
d(resourceId="com.tal.kaoyan:id/hotthread_recommend_moreforum").click()
time.sleep(1)
# 點擊休閑空間
if d(resourceId="com.tal.kaoyan:id/more_forum_title", text=u"休閑空間").wait(3):
d(resourceId="com.tal.kaoyan:id/more_forum_title", text=u"休閑空間").click()
time.sleep(2)
d(scrollable=True).scroll.to(text="玫瑰初相遇")
# 點擊'玫瑰初相遇'板塊
if d.xpath("http://android.widget.TextView[@text='玫瑰初相遇']").wait(3):
d.xpath("http://android.widget.TextView[@text='玫瑰初相遇']").click()
time.sleep(3)
# 執(zhí)行滑動動作,滑動20次
i = 0
while i < 10:
d(scrollable=True).scroll.toEnd(steps=50)
time.sleep(2)
d(scrollable=True).scroll.toEnd(steps=50)
time.sleep(2)
i += 1
except:
pass