python+appium app自動化的方法實例運用
# -*- coding: utf-8 -*-
import os
import sys
import time
import unittest
from appium import webdriver
# from selenium import webdriver
from HTMLTestRunner import HTMLTestRunner
from appium.webdriver.common.touch_action import TouchAction
global driver
class MyTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
# 初始化測試平臺
desired_caps = {}
desired_caps[‘platformName‘] = ‘Android‘
desired_caps[‘platformVersion‘] = ‘6.0‘
desired_caps[‘deviceName‘] = ‘78d358ad‘
desired_caps[‘appPackage‘] = ‘com.wochacha‘
desired_caps[‘appActivity‘] = ‘com.wochacha.StartupActivity‘
# desired_caps[‘appWaitActivity‘] = ‘‘
desired_caps["unicodeKeyboard"] = "True" # 輸入中文
desired_caps["resetKeyboard"] = "True" # 輸入中文
cls.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
# if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {WebView.setWebContentsDebuggingEnabled(true);}
# cls.driver.implicitly_wait(8)
time.sleep(8)
def test_home_page(self):
"""首頁原生頁面和H5頁面切換"""
time.sleep(2)
print(self.driver.contexts)
contexts = self.driver.contexts
self.driver.switch_to.context(contexts[1]) # 切換到H5頁面
time.sleep(2)
print(self.driver.current_context)
self.driver.switch_to.context("NATIVE_APP") # 切換到原生頁面
def test_native_h5(self):
"""首頁原生頁面和H5頁面切換"""
# 註意切換H5的webview頁面時,先打印下context,看是否有H5頁面
# 因為有的H5頁面沒有開啟debug模式的話,即使有h5頁面也無法切換
# 解決方法,需要開發同學打一個測試包,加上一段調試的代碼
print(self.driver.context)
print(self.driver.contexts) # 打印所有上下文
print(self.driver.current_context)
print(self.driver.current_activity) # 打印當前的activity
self.driver.switch_to.context("NATIVE_APP") # 切換到原生頁面
self.driver.switch_to.context("WEBVIEW_com.android.browser") # 切換到H5頁面
def test_find_element(self):
"""定位元素方法"""
self.driver.find_element_by_id("id") # id定位
self.driver.find_element_by_name("name") # name定位
self.driver.find_element_by_link_text("text") # 鏈接名定位
self.driver.find_element_by_partial_link_text("text") # 通過元素部分可見鏈接文本定位
self.driver.find_element_by_tag_name("name") # 通過查找html的標簽名稱定位元素
self.driver.find_element_by_xpath("xpath") # 路徑定位
self.driver.find_element_by_class_name("android.widget.LinearLayout") # 類名定位
self.driver.find_element_by_css_selector("css") # css選擇器定位
def test_find_elements_list(self):
"""定位元素復數集合方法"""
self.driver.find_elements_by_id("id") # id元素集合
self.driver.find_elements_by_name("name") # name元素集合
self.driver.find_elements_by_link_text("text") # 鏈接名元素集合
self.driver.find_elements_by_partial_link_text("text") # 部分元素可見鏈接集合
self.driver.find_elements_by_tag_name("name") # html標簽名集合
self.driver.find_elements_by_xpath("xpath") # 路徑定位集合
self.driver.find_elements_by_class_name("android.widget.LinearLayout") # 類名定位集合
elements = self.driver.find_elements_by_css_selector("css") # css選擇器定位集合
elements[0].click() # 選擇復數集合裏面第幾個來進行定位
def test_element_action(self):
"""元素操作方法"""
element = self.driver.find_element_by_id("id")
element.click() # 點擊
element.clear() # 清除元素內容
element.text() # 返回元素的文本內容
element.submit(self) # 提交表單
element.is_enabled() # 元素是否可用
element.is_slected() # 元素是否可選
element.is_displayed() # 元素是否可見
element.send_keys("中英+selenium") # 輸入方法
def test_swipe_all(self):
"""滑動方法匯總"""
self.driver.swipe(500, 1700, 500, 100, 500) # 向上滑動(坐標滑動可能不是很穩定)
el1 = self.driver.find_element_by_name("商品黑榜")
el2 = self.driver.find_element_by_name("曝光欄")
self.driver.scroll(el1, el2) # 從一個元素滑到另一個元素 穩定,推薦這個
TouchAction(self.driver).press(el1).move_to(el2).release().perform() # 從一個元素滑到另一個元素
# 連續滑動,可以用作滑動屏幕解鎖
TouchAction().press(el1).move_to(el2).move_to(el3).move_to(el4).release().perform() # 連續坐標滑動
TouchAction(self.driver).press(x, y).move_to(x, y).move_to(x, y).move_to(x, y).release().perform() # 連續元素滑動
# 獲取元素的大小(高和寬),按照屏幕分辨率來滑動
x = self.driver.get_window_size()[‘width‘]
y = self.driver.get_window_size()[‘height‘]
self.driver.swipe(x * 0.5, y * 0.75, x * 0.5, y * 0.25, 500) # 上滑
self.driver.swipe(x * 0.5, y * 0.25, x * 0.5, y * 0.75, 500) # 下滑
self.driver.swipe(x * 0.75, y * 0.5, x * 0.25, y * 0.5, 500) # 左滑
self.driver.swipe(x * 0.25, y * 0.5, x * 0.75, y * 0.5, 500) # 右滑
def test_pinch_zoom(self):
"""捏屏幕和放大屏幕"""
e1 = self.driver.find_element_by_id(id)
# 捏 (Pinch)捏屏幕 (雙指往內移動來縮小屏幕)
self.driver.pinch(element=e1)
# 放大 (Zoom)放大屏幕 (雙指往外移動來放大屏幕)
self.driver.zoom(element=e1)
def test_screen_shot(self):
"""截屏方法"""
self.driver.save_screenshot("D:/appium/screenshot/homepage.jpg") # 僅保存圖片
self.driver.get_screenshot_as_file("D:/appium/screenshot/homepage.jpg") # 完整路徑,IOError返回False
self.driver.get_screenshot_as_base64() # 截取當前屏幕圖片,用於html頁面直接嵌入base64編碼圖片
self.driver.get_screenshot_as_png() # 獲取當前屏幕截圖的二進制文件數據string
def test_get_message(self):
"""獲取當前信息"""
self.driver.current_url # 獲取當前url
self.driver.page_source # 獲取頁面源
self.driver.current_package # 獲取當前的包名
self.driver.current_activity # 獲取當前的activity
self.driver.current_context # 列出當前上下文
def test_pull_file(self):
"""設備推送文件"""
# 從設備中拉出文件 (Pull File)
self.driver.pull_file(‘Library/AddressBook/AddressBook.sqlitedb‘)
# 推送文件到設備中去
data = "push test"
path = "/data/local/tmp/file.txt"
self.driver.push_file(path, data.encode(‘base64‘))
# self.driver.push_file(path, data.encode(‘base64‘, ‘errors‘))
# self.driver.push_file(path, base64.b64encode(bytes("push test", ‘utf-8‘)))
def test_js(self):
"""JS操作,執行"""
# 在當前窗口/框架(特指 Html 的 iframe )同步執行 javascript 代碼
driver.execute_script(‘document.title‘)
# 異步執行代碼,其他代碼在執行
driver.execute_async_script(‘document.title‘)
def test_system(self):
"""系統雜項功能"""
self.driver.app_strings(language=None, string_file=None) # 獲取應用字符串
self.driver.background_app(5) # 把當前應用置於後臺5秒
self.driver.hide_keyboard() # 隱藏鍵盤
self.driver.keyevent(176) # 按鍵事件 (Key Event)給設備發送一個按鍵事件
self.driver.toggle_location_services() # 打開安卓設備上的位置定位設置
# 打開一個應用或者activity,僅安卓端(百度糯米的包和activity名)
self.driver.start_activity(‘com.nuomi‘, ‘com.baidu.bainuo.dex.InstallDexActivity‘)
def test_lock_and_open_notifaication(self):
"""鎖屏和打開通知欄"""
self.driver.open_notifications() # 打開通知欄
self.driver.find_element_by_id("com.android.systemui:id/clear_all_button").click() # 點擊清除通知
self.driver.lock(5) # 鎖屏5秒
def test_remove_install_reset(self):
"""卸載和安裝app"""
self.driver.is_app_installed("com.wochacha") # 是否安裝了app
self.driver.remove_app("com.wochacha") # 刪除應用
self.driver.install_app("D:/wochacha.apk") # 安裝應用
self.driver.reset() # 重置應用
def test_launch_close_shake(self):
"""啟動和關閉app,搖晃app"""
# 這三個方法都報錯,雖然不常用
self.driver.launch_app() # 啟動應用
self.driver.close_app() # 關閉應用
self.driver.shake() # 搖晃設備
@classmethod
def tearDownClass(cls):
cls.driver.quit() # 這句一定要加,不加再次啟動appium會無法創建一個新的sessionid
# cls.driver.close() # 關閉當前窗口
if __name__ == ‘__main__‘:
# unittest.main(verbosity=2)
date = time.strftime("%Y%m%d") # 定義date為日期,time為時間 20180710 年月日
tm = time.strftime("%Y%m%d-%H%M%S") # 20180710-124530 年月日-時分秒
# hms = time.strftime("%H%M%S") # 124530 時分秒
# 構造測試集 # 加入測試用例
suite = unittest.TestSuite()
suite.addTest(MyTests("test_home_page")) # 首頁
# suite.addTest(MyTests("test_native_h5")) # 原生頁面與H5的切換
# suite.addTest(MyTests("test_lock_and_open_notifaication")) # 鎖屏和打開通知欄
# 執行測試用例 TextTestRunner
unittest.TextTestRunner().run(suite) # 執行測試用例
"""
# 執行測試用例 HtmlTestRunner
path = "./report/home_page/"+date+"/"
# 判斷是否定義的路徑目錄存在,不能存在則創建
if not os.path.exists(path):
os.makedirs(path)
else:
pass
# report_path = path+time+"report.html" # 將運行結果保存到report,名字為定義的路徑和文件名,運行腳本
report_path = path + time +"-home_page_1_report.html" # 不添加時間的測試報告名
report_title = u"百度糯米首頁home_page_1測試報告"
desc = u‘Appium自動化測試報告詳情:‘
with open(report_path, ‘wb‘) as report:
runner = HTMLTestRunner(stream=report, title=report_title, description=desc)
runner.run(suite)
# 關閉report,腳本結束
report.close()
"""
python+appium app自動化的方法實例運用