Appium進階教程


目錄

Monkey的使用

adb shell monkey -p com.lqr.wechat -v 500 > monkey.log

adb shell monkey -p com.lqr.wechat -vvv 5000 > monkey2.log

adb shell monkey -p com.lqr.wechat -vvv 5000 --send=1556166765229 --throttle 500 > monkey3.log

adb shell monkey -p com.lqr.wechat -vvv 5000 --send=1556166765229 --ignore-crashes > monkey4.log

參數:

  • -p
  • -v
  • -s
  • --throttle
  • --ignore-crashes: 忽略崩潰
  • --ignore-timeouts: 忽略ANR
  • --ignore-security-exceptions: 忽略證書問題
  • --kill-process-after-error: Monkey出錯后結束運行
  • --monitor-native-crashes: 監控本地崩潰

可通過命令行指定

  • count=5000: 計划執行5000次
  • AllowPackage: 包名
  • Event percentages: 事件百分比, 可通過命令行修改
  • Switch: Activity(頁面)跳轉
  • Sending Touch: 發送動作指令
  • Injection Failed #注入(執行)指令失敗, App無反應或不支持
  • CRASH: 崩潰

指定事件百分比

  • –pct-touch:觸摸事件(點擊)
  • –pct-motion:動作事件(拖動)
  • –pct-trackball:軌跡球事件(移動)
  • –pct-nav:基本導航事件:上下左右操作
  • –pct-majornav:主導航事件: 確認,菜單,返回鍵
  • –pct-syskeys:系統按鍵事件: 如HOME鍵,BACK鍵,撥號鍵,掛斷鍵,音量鍵等
  • –pct-appswitch:應用啟動事件
  • –pct-anyevent: 任意事件

手動停止Monkey

adb shell 
ps  | grep monkey   (查詢進程號)
kill 進程號

Appium inspector的使用

  • 啟動和配置
  • 定位和操作元素
  • 錄制

元素定位

  • 通過resource_id: find_element_by_id:
  • 通過content-desc: find_element_by__accessibility_id
  • 通過xpath: 結合屬性/上下級節點/索引定位
  • 重復元素+索引定位: l = find_elements_by_... l[1].click()
  • 逐級定位: driver.find_element_by_id(...).find_element_by_class_name(...)

使用By及元素定位器
from appium.webdriver.common.mobileby import By

driver.find_element(By.ID, "....")

使用uiautomator的原始定位方式

1.通過id定位

driver.find_element_by_android_uiautomator('new UiSelector().resourceId(“id”)').click()

  1. 通過text定位
# Text定位
driver.find_element_by_android_uiautomator('new UiSelector().text("textstr")')
# 文字包含
driver.find_element_by_android_uiautomator('new UiSelector().textContains(textStr)')
# 以哪個字符開始
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith(textStr)')

  1. 通過class屬性定位
driver.find_element_by_android_uiautomator('new UiSelector().className("class屬性")')

  1. 多屬性定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.TextView").text("Custom View")')

可作為過濾條件的有:

  • UISelector.text
  • UISelector.textContains
  • UISelector.textStartsWith
  • UiSelector.resourceId
  • UISelector.className
  • UISelector.textMatches
  • UISelector.classNameMatches
  • UiSelector.fromParent
  • UiSelector.childSelector
  • UiSelector.resourceIdMatches
  • UiSelector.description
  • UiSelector.descriptionStartWith
  • UiSelector.descriptionMatches

元素操作

  • click()
  • send_keys()
  • clear()
  • is_displayed()/is_enabled()/is_checked()
  • get_attribute(): 獲取屬性 文本/狀態/是否可操作等
    • get_attribute("text")
    • get_attribute("resourceId")
    • get_attribute("className")
  • set_value(): 設置text值
  • text: 元素的文本
  • location: 獲取元素坐標值
  • size: 獲取元素大小

練習

noReset: True
1. 打開微信應用 ,判斷是否存在 登錄按鈕

2. 如果已經登錄,登錄按鈕不存在 ,就直接進入登錄頁,打印 通訊錄的這些屬性值, resourceid,text,className,enabled,clickable,selected,Displayed

c = driver.find...()

print(c.get_attribute("clickable"))
print(c.is_enabled()/c.is_displayed()/c.is_selected())

如果登錄按鈕存在 ,打印這個登錄按鈕的上面的屬性值resourceid,text,className,enabled,clickable,selected,Displayed, 並點擊登錄按鈕,
	使用set_value())輸入用戶名密碼
	判斷登錄按鈕是否可用,
		可用的話打印可用,並點擊登錄,判斷是否登錄成功
		不可用打印不可用
3. 退出應用

練習提示

try:  # 嘗試定位登錄按鈕
	l = driver.find_element_by_id("")	
except:  # 未定位到
	print(“沒有登錄按鈕”)
	c = driver.find_....()    # 定位 通訊錄 標簽
	print(c.get_attribute('resource-id')  # 打印各種屬性
	print(c.text)
	print(c.get_attribute(“class”)
	print(c.is_enabled())
	....
else:  # 如果沒有異常(定位到了登錄按鈕)
	print(l.get_attribute("resource-id")   # 打印登錄按鈕的各種屬性
	print(l.text)
	print(l.get_attribute(“class”)
	print(l.is_enabled())
	...
	l.click()  # 點擊登錄按鈕
	driver.find…().set_value("18010181267")  # 使用set_value輸入文字
	driver.find…().set_value("123456")  # 使用set_value輸入密碼
	l2 = driver.find..()  # 定位 登錄 按鈕
	if l2.is_enabled() is True:  # 判斷 登錄按鈕 是否可用
		print(“可用”)
		l2.click()  # 點擊登錄按鈕
		try:   # 判斷是否登錄成功, 登錄成功后會有 "通訊錄" 這個標簽
			c = driver.find_....()   # 嘗試定位通訊錄這個標簽
		except:  # 定位不到打印失敗
			print(“登錄失敗”)
		else:  # 沒有異常(定位到) 打印成功
			print(“登錄成功”)
	else:
		print("不可用")  # 上面的l2登錄按鈕不可用打印不可用





按鍵操作

  • drvier.keyevent()
  • driver.press_keycode()

練習


啟動 微信,登錄用戶名和密碼,並點擊登錄
 進入 “我” ,點擊用戶名,
點擊二維碼名片,
截圖並保存到d:\\screenshot\\VCODE.png
導入截圖到手機/sdcard/images/這個路徑下
返回到微信聊天列表頁,並將音量放大兩個分貝
點擊菜單回到手機主屏
退出

屏幕操作

  • tap: 觸控(點擊指定坐標),支持多點觸控
  • swipe: 滑動
  • flick: 快滑
  • pinch:
  • zoom:
  • get_screenshot_as_file: 截圖

獲取屏幕寬度

  • width = driver.get_window_size()['width']
  • height = driver.get_window_size()['height']

練習

封裝四個方法,
向下滑動,
向上滑動,
向左滑動,
向右滑動,

練習2

打開手機設置 
滑動查找頁面上含有“關於“文字的 元素
如果找到了點擊,如果沒找到繼續找,
進入關於頁面,查看手機的版本信息
退出設置頁面

文件操作

  • driver.pull()
  • driver.push()

app操作

autoLaunch=False

  • driver.is_app_installed()
  • driver.install_app()
  • driver.remove_app()
  • driver.launch_app()
  • driver.start_activity()
  • driver.current_activity()
  • driver.background_app(3)
  • driver.close_app()

網絡狀態

  • driver.network_connection

查找已安裝app(無apk包)Package/MainActiviy方法

adb shell
logcat | grep cmp=

然后在設備上操作一次app

練習

1.連接appium server,不啟動任何app ,(autoLaunch =False)
2.啟動微信的首頁activity( launch_app() )
3.打開通知欄,然后關閉通知欄(要先打開一個activity)  driver.press_keyevent(“4”)
4.用start_activity()啟動本地瀏覽器,判斷當前相機activity是否正確(
獲取current_activity 對比當前的activity print driver.current_activity -  .Camera)
5. 截屏screenshot.png 並保存到 d:\tmp\目錄下
6.把當前app放在后台運行5秒鍾  driver.backGround_app—進入 入到app首頁
7.查看當前的網絡狀態,並且輸出
8. 判斷微信app是否已安裝,已安裝卸載,未安裝執行安裝 driver.is_app_install(“com.sankuai.meituan”)
Driver.remove_app(“包名”)
Driver.install_app(“路徑/.apk”)


免責聲明!

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



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