環境: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() #橫向滾動到最左側
或者
(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自動化分享完畢。大家有興趣一起學習。