python+android ui自動化


環境:python2.7

定位工具:weditor

手機:小米

 

1.環境搭建,需要安裝python環境,和編輯工具 pycharm,然后利用python中  uiautomator2 和weditor 這兩個包進行接下來的操作。

2.安裝方式 直接 命令窗口 pip install 包名  (前提你在環境變量配置了 pip)

3.安裝完成之后 檢查環境 在命令窗口執行  python -m  uiautomator2 init 

提示這個Successfully 就是代表環境 OK

 

 

 

4.在命令窗口中執行 python -m weditor

 

 

 

 

 

 

會在瀏覽器中打開網頁,輸入設備devices信息 可以 通過 adb devices來進行查詢設備 信息。出現樹的模樣,代表鏈接上手機,然后點擊右上角的Reload 實時顯示手機頁面。 這樣就可以開始你的元素定位了。

 

5.通用的元素定位方式。

 

(1)根據文本進行定位。

d(text=顯示的文本).click()

 

(2)通過 resourceId 進行定位

d(resourceId="com.tcl.tclplus:id/cart_layout").click() # 進入購物 

 

3)滑動 上 或者下 

手指向上,就是頁面往下拉,分兩種情況 拉到底 或者 只拉一部分。

 

拉到底:

d(scrollable=True).scroll.toEnd()

拉一部分:

d.swipe(0.806, 0.801,0.818, 0.487) # 向上滑動  橫坐標可以不變,縱坐標是變化的,是變小的趨勢  這是手指向上

以此類推 那么需要手指向下:

 

拉倒底:就是拉倒頁面首頁 開頭部分

 

d(scrollable=True).scroll.toBeginning(steps=50)

 

拉一部分

 

橫坐標不變,縱坐標是變化的,是變大的趨勢  這是手指向下

 

 

(4)滑動 左右 

d(scrollable=True).scroll.horiz.toEnd() #橫向滾動到最右側

d(scrollable=True).scroll.horiz.toBeginning() #橫向滾動到最左側

 

或者

c.水平向右滾動:d(scrollable=True).scroll.horiz.forward(steps=50)
 
d.水平向左滾動:d(scrollable=True).scroll.horiz.backward(steps=50)
 
(5)滑動到指定位置:滑動到文本為測試的位置
 
d(scrollable=True).scroll.to(text ='測試')

 

(6)元素判斷  可以這樣寫,通過判斷元素的存在性來執行不同的操作

s = self.d(resourceId="com.tcl.tclplus:id/iot_txt_home_name", text=u"立即登錄", className="android.widget.TextView")
if len(s) == 0:
print '元素未找到,執行退出操作'

 

(7)隨機字符串或者隨機字母 輸入

a = random.sample(string.ascii_letters, 4)
data = ''.join([str(x) for x in a])

d(resourceId="com.tcl.tclplus:id/et_invoice_header").set_text(data)

  隨機從大小寫字母中取四位,然后寫入到輸入框中。

 

(8)截圖

filepaths 就是截圖所存的路徑,可以自己填寫。

filepaths = os.path.normpath(os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)), "Automation/Tcase")))
def get_png(self, filename, filepath='/Member'):
"""
截圖操作,默認截圖的存儲路徑為Member
"""
imgName = filename + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png' # 截圖可以單獨保存為別的名字的文件
stringPath = filepaths + '/image' + filepath + '\\' + imgName
print stringPath
# img.save('filename.png')#圖片保存在當前項目的文件夾下邊
self.d.screenshot().save(stringPath) # 保存文件到指定的文件夾下邊

self.get_png(filename='訂單-取消購買'.decode('utf-8'), filepath='/Market/訂單')  實際調用的時候 需要進行decode



(9)apk 自動安裝

def install_app(path):
app_Path = lambda x: os.path.join(file_path, "app", x)
apk = app_Path(path + ".apk")
os.system('adb install -r -d ' + apk)
time.sleep(5)

(10)報告生成

用例文件很多 采用 關鍵字匹配的方式進行。
def all_case():
testcase = unittest.TestSuite() # 加載測試套件
# 用例的目錄,關鍵字進行匹配
discover = unittest.defaultTestLoader.discover(filepath, pattern='Market*.py', top_level_dir=None)
testcase.addTest(discover)
return testcase


@UI_Report(testcase=all_case(),ReportPath=filepath+'/report/result.html')
def run():
print '生成測試報告'


if __name__ == '__main__':
run()

 

這里加了一個裝飾器 

def UI_Report(testcase, ReportPath):
"""
根據傳入的testcase 來判斷執行哪種報告生成方式。
"""

def Report(s):
@wraps(s)
def creat_report():
AA = hasattr(testcase,'__call__')
# AA = isfunction(testcase)
if AA:
print '這個是函數'
suite = unittest.makeSuite(testcase)
fp = file(ReportPath, 'wb')
runner = HTMLTestRunner(stream=fp, title=r'UI自動化', description=r'接口自動化測試報告')
runner.run(suite) #區別
fp.close()
else:
print '不是函數,是執行run_main方法'
fp = file(ReportPath, 'wb')
runner = HTMLTestRunner(stream=fp, title=r'UI自動化測試報告', description=r'商城')
runner.run(testcase)
fp.close()

return creat_report

return Report

 

 

 

 

 因為run_main 去執行的時候,是打印所有的用例文件+名稱

而通過測試套件 添加 類名稱時,執行方式不一樣

 

 

 

至於公共函數,比如啟動app、一些共有的操作,可以寫到 公共函數中,

 

 

在unitest中 增加setupclass 函數 是只 啟動一次app,跟setup 區別一下

 

下面增加你的公共函數。然后用例文件中 直接通過繼承的方式來進行

 

例如

class test(commons):

 

 

執行的過程中需要加上一個清理環境的操作,例如為了保證用例執行可靠 和 及時刪除調截圖。


def del_file(filepath):
listdir = os.listdir(filepath) # 獲取文件和子文件夾
for rename in listdir:
rename = filepath + "//" + rename
if os.path.isfile(rename): # 是文件
os.remove(rename) # 刪除文件
elif os.path.isdir(rename): # 是子文件
duellist = os.listdir(rename)
for f in duellist: # 遍歷該子文件夾
file_path = os.path.join(rename, f)
if os.path.isfile(file_path): # 刪除子文件夾下文件
os.remove(file_path)
elif os.path.isdir(file_path): # 強制刪除子文件夾下的子文件夾
shutil.rmtree(file_path)


可以在用例文件執行開頭增加一些 調用方法

 

 

如刪除截圖 和初始化 app環境 都是可以的 

 

至此  python2.7+android+UI自動化分享完畢。大家有興趣一起學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM