溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python中Appium怎么用

發(fā)布時(shí)間:2021-10-18 11:55:29 來源:億速云 閱讀:154 作者:小新 欄目:編程語言

這篇文章主要介紹了python中Appium怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Appium
Appium 服務(wù)關(guān)鍵字
關(guān)鍵字 描述  實(shí)例  
automationName  你想使用的自動(dòng)化測試引擎    Appium (默認(rèn)) 或 Selendroid    
platformName    你要測試的手機(jī)操作系統(tǒng) iOS, Android, 或 FirefoxOS   
platformVersion 手機(jī)操作系統(tǒng)版本    例如: 7.1, 4.4    
deviceName  使用的手機(jī)類型或模擬器類型   iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等。在 iOS 上,這個(gè)關(guān)鍵字的值必須是使用 instruments -s devices 得到的可使用的設(shè)備名稱之一。在 Android 上,這個(gè)關(guān)鍵字目前不起作用。   
app .ipa or .apk文件所在的本地絕對(duì)路徑或者遠(yuǎn)程路徑,也可以是一個(gè)包括兩者之一的.zip。 Appium會(huì)先嘗試安裝路徑對(duì)應(yīng)的應(yīng)用在適當(dāng)?shù)恼鏅C(jī)或模擬器上。針對(duì)Android系統(tǒng),如果你指定app-package和app-activity(具體見下面)的話,那么就可以不指定app。 會(huì)與 browserName 沖突   比如/abs/path/to/my.apk或http://myapp.com/app.ipa  
browserName 需要進(jìn)行自動(dòng)化測試的手機(jī) web 瀏覽器名稱。如果是對(duì)應(yīng)用進(jìn)行自動(dòng)化測試,這個(gè)關(guān)鍵字的值應(yīng)為空。    iOS 系統(tǒng)上可以用 'Safari' ,Android 系統(tǒng)上可以用 'Chrome', 'Chromium', 或 'Browser'。  
newCommandTimeout   設(shè)置命令超時(shí)時(shí)間,單位:秒。達(dá)到超時(shí)時(shí)間仍未接收到新的命令時(shí) Appium 會(huì)假設(shè)客戶端退出然后自動(dòng)結(jié)束會(huì)話。 比如 60   
autoLaunch  Appium是否需要自動(dòng)安裝和啟動(dòng)應(yīng)用。默認(rèn)值true true, false 
language    (Sim/Emu-only) 設(shè)定模擬器 ( simulator / emulator ) 的語言。  如: fr   
locale  (Sim/Emu-only) 設(shè)定模擬器 ( simulator / emulator ) 的區(qū)域設(shè)置。    如: fr_CA    
udid    連接的物理設(shè)備的唯一設(shè)備標(biāo)識(shí)  如: 1ae203187fc012g  
orientation (Sim/Emu-only) 在一個(gè)設(shè)定的方向模式中開始測試  LANDSCAPE (橫向) 或 PORTRAIT (縱向)  
autoWebview 直接轉(zhuǎn)換到 WebView 上下文。 默認(rèn)值 false、   true, false 
noReset 不要在會(huì)話前重置應(yīng)用狀態(tài)。默認(rèn)值false。  true, false 
fullReset   (iOS) 刪除整個(gè)模擬器目錄。(Android) 通過卸載——而不是清空數(shù)據(jù)——來重置應(yīng)用狀態(tài)。在 Android 上,這也會(huì)在會(huì)話結(jié)束后自動(dòng)清除被測應(yīng)用。默認(rèn)值 false    true, false 
 
Android特有
關(guān)鍵字 描述  實(shí)例
appActivity 你要從你的應(yīng)用包中啟動(dòng)的 Android Activity 名稱。它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity)  MainActivity, .Settings
appPackage  你想運(yùn)行的Android應(yīng)用的包名   比如com.example.android.myApp, com.android.settings
appWaitActivity 你想要等待啟動(dòng)的 Android Activity 名稱    SplashActivity
deviceReadyTimeout  設(shè)置等待一個(gè)模擬器或真機(jī)準(zhǔn)備就緒的超時(shí)時(shí)間   5
androidCoverage 用于執(zhí)行測試的 instrumentation 類。作為命令 adb shell am instrument -e coverage true -w 的-w 參數(shù)。  com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation
enablePerformanceLogging    (僅適用于 Chrome 和 webview) 開啟 Chromedriver 的性能日志。 (默認(rèn) false)   true, false
androidDeviceReadyTimeout   等待設(shè)備在啟動(dòng)應(yīng)用后準(zhǔn)備就緒的超時(shí)時(shí)間。以秒為單位。  如 30
androidDeviceSocket 開發(fā)工具的 socket 名稱。只有在被測應(yīng)用是一個(gè)使用 Chromium 內(nèi)核的瀏覽器時(shí)需要。 socket 會(huì)被瀏覽器打開,然后 Chromedriver 把它作為開發(fā)者工具來進(jìn)行連接。 如 chrome_devtools_remote
avd 需要啟動(dòng)的 AVD (安卓虛擬設(shè)備) 名稱。  如 api19
avdLaunchTimeout    以毫秒為單位,等待 AVD 啟動(dòng)并連接到 ADB 的超時(shí)時(shí)間。(默認(rèn)值120000)  300000
avdReadyTimeout 以毫秒為單位,等待 AVD 完成啟動(dòng)動(dòng)畫的超時(shí)時(shí)間。(默認(rèn)值 120000)  300000
avdArgs 啟動(dòng) AVD 時(shí)需要加入的額外的參數(shù)。 如 -netfast
useKeystore 使用一個(gè)自定義的 keystore 來對(duì) apk 進(jìn)行重簽名。默認(rèn)值 false    true or false
keystorePath    自定義 keystore 的路徑。默認(rèn): ~/.android/debug.keystore  如 /path/to.keystore
keystorePassword    自定義 keystore 的密碼。   如 foo
keyAlias    key 的別名 如 androiddebugkey
keyPassword key 的密碼 如 foo
chromedriverExecutable  webdriver 可執(zhí)行文件的絕對(duì)路徑 (如果 Chromium 核心提供了對(duì)應(yīng)的 webdriver, 應(yīng)該用它代替 Appium 自帶的 webdriver)  /abs/path/to/webdriver
autoWebviewTimeout  以毫秒為單位,等待 Webview 上下文激活的時(shí)間。默認(rèn)值 2000 如 4
intentAction    用于啟動(dòng) activity 的 intent action。 (默認(rèn)值android.intent.action.MAIN)  如 android.intent.action.MAIN,android.intent.action.VIEW
intentCategory  用于啟動(dòng) activity 的 intent category。 (默認(rèn)值android.intent.category.LAUNCHER)  如 android.intent.category.LAUNCHER,android.intent.category.APP_CONTACTS
intentFlags 用于啟動(dòng) activity 的標(biāo)識(shí) ( flags ) (默認(rèn)值 0x10200000)    如 0x10200000
optionalIntentArguments 用于啟動(dòng) activity 的額外 intent 參數(shù)。請查看?Intent 參數(shù)   如 --esn <EXTRA_KEY>, --ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>
stopAppOnReset  在使用 adb 啟動(dòng)應(yīng)用前停止被測應(yīng)用的進(jìn)程 ( process ) 。如果被測應(yīng)用是被另一個(gè)應(yīng)用創(chuàng)建的,當(dāng)這個(gè)參數(shù)被設(shè)定為 false 時(shí),允許另一個(gè)應(yīng)用的進(jìn)程在使用 adb 啟動(dòng)被測應(yīng)用時(shí)繼續(xù)存活。默認(rèn)值 true   true 或 false
unicodeKeyboard 使用 Unicode 輸入法。默認(rèn)值false true 或 false
resetKeyboard   在設(shè)定了 unicodeKeyboard 關(guān)鍵字的 Unicode 測試結(jié)束后,重置輸入法到原有狀態(tài)。如果單獨(dú)使用,將會(huì)被忽略。默認(rèn)值 false   true 或 false
noSign  跳過檢查和對(duì)應(yīng)用進(jìn)行 debug 簽名的步驟。只能在使用 UiAutomator 時(shí)使用,使用 selendroid 是不行。默認(rèn)值 false    true 或 false
ignoreUnimportantViews  調(diào)用 uiautomator 的函數(shù)setCompressedLayoutHierarchy()。由于 Accessibility 命令在忽略部分元素的情況下執(zhí)行速度會(huì)加快,這個(gè)關(guān)鍵字能加快測試執(zhí)行的速度。被忽略的元素將不能夠被找到,因此這個(gè)關(guān)鍵字同時(shí)也被實(shí)現(xiàn)成可以隨時(shí)改變的 *設(shè)置 ( settings ) * 。默認(rèn)值 false    true 或 false

 
iOS特有
關(guān)鍵字 描述  實(shí)例
calendarFormat  (Sim-only) 為iOS的模擬器設(shè)置日歷格式   如 gregorian (公歷)
bundleId    被測應(yīng)用的 bundle ID 。用于在真實(shí)設(shè)備中啟動(dòng)測試,也用于使用其他需要 bundle ID 的關(guān)鍵字啟動(dòng)測試。在使用 bundle ID 在真實(shí)設(shè)備上執(zhí)行測試時(shí),你可以不提供 app 關(guān)鍵字,但你必須提供 udid 。   如 io.appium.TestApp
udid    連接的真實(shí)設(shè)備的唯一設(shè)備編號(hào) ( Unique device identifier ) 如 1ae203187fc012g
launchTimeout   以毫秒為單位,在 Appium 運(yùn)行失敗之前設(shè)置一個(gè)等待 instruments 的時(shí)間    比如: 20000
locationServicesEnabled (Sim-only) 強(qiáng)制打開或關(guān)閉定位服務(wù)。默認(rèn)值是保持當(dāng)前模擬器的設(shè)定   true 或 false
locationServicesAuthorized  (Sim-only) 通過修改 plist 文件設(shè)定是否允許應(yīng)用使用定位服務(wù),從而避免定位服務(wù)的警告出現(xiàn)。默認(rèn)值是保持當(dāng)前模擬器的設(shè)定。請注意在使用這個(gè)關(guān)鍵字時(shí),你同時(shí)需要使用 bundleId 關(guān)鍵字來發(fā)送你的應(yīng)用的 bundle ID。    true 或者 false
autoAcceptAlerts    當(dāng) iOS 的個(gè)人信息訪問警告 (如 位置、聯(lián)系人、圖片) 出現(xiàn)時(shí),自動(dòng)選擇接受( Accept )。默認(rèn)值 false。   true 或者 false
autoDismissAlerts   當(dāng) iOS 的個(gè)人信息訪問警告 (如 位置、聯(lián)系人、圖片) 出現(xiàn)時(shí),自動(dòng)選擇不接受( Dismiss )。默認(rèn)值false。  true 或者 false
nativeInstrumentsLib    使用原生 intruments 庫 (即關(guān)閉 instruments-without-delay )  true 或者 false
nativeWebTap    (Sim-only) 在Safari中允許"真實(shí)的",非基于 javascript 的 web 點(diǎn)擊 (tap) 。 默認(rèn)值: false。注意:取決于 viewport 大小/比例, 點(diǎn)擊操作不一定能精確地點(diǎn)中對(duì)應(yīng)的元素。    true 或者 false
safariInitialUrl    (Sim-only) (>= 8.1) 初始化 safari 的時(shí)使用的地址。默認(rèn)是一個(gè)本地的歡迎頁面 如https://www.github.com
safariAllowPopups   (Sim-only) 允許 javascript 在 Safari 中創(chuàng)建新窗口。默認(rèn)保持模擬器當(dāng)前設(shè)置。   true 或者 false
safariIgnoreFraudWarning    (Sim-only) 阻止 Safari 顯示此網(wǎng)站可能存在風(fēng)險(xiǎn)的警告。默認(rèn)保持瀏覽器當(dāng)前設(shè)置。    true 或者 false
safariOpenLinksInBackground (Sim-only) Safari 是否允許鏈接在新窗口打開。默認(rèn)保持瀏覽器當(dāng)前設(shè)置。 true 或者 false
keepKeyChains   (Sim-only) 當(dāng) Appium 會(huì)話開始/結(jié)束時(shí)是否保留存放密碼存放記錄 (keychains) (庫(Library)/鑰匙串(Keychains))    true 或者 false
localizableStringsDir   從哪里查找本地化字符串。默認(rèn)值 en.lproj    en.lproj
processArguments    通過 instruments 傳遞到 AUT 的參數(shù)  如 -myflag
interKeyDelay   以毫秒為單位,按下每一個(gè)按鍵之間的延遲時(shí)間。  如 100
showIOSLog  是否在 Appium 的日志中顯示設(shè)備的日志。默認(rèn)值false true 或者 false
sendKeyStrategy 輸入文字到文字框的策略。模擬器默認(rèn)值:oneByOne(一個(gè)接著一個(gè)) 。真實(shí)設(shè)備默認(rèn)值:grouped (分組輸入) oneByOne, grouped 或setValue
screenshotWaitTimeout   以秒為單位,生成屏幕截圖的最長等待時(shí)間。默認(rèn)值: 10。    如 5
waitForAppScript    用于判斷 "應(yīng)用是否被啟動(dòng)” 的 iOS 自動(dòng)化腳本代碼。默認(rèn)情況下系統(tǒng)等待直到頁面內(nèi)容非空。結(jié)果必須是布爾類型。   例如 true;,target.elements().length > 0;, $.delay(5000); true;

Webview

1、通過driver.page_source找源碼

2、通過chrome瀏覽器,×××
chrome://inspect/#devices

獲取webview的源代碼,需要×××

定位方式
Id定位

通過全名稱
person_center_id_1 = driver.find_element_by_id("com.xsteach.appedu:id/content_rb_mine")
person_center_id_1.click()

通過部分名稱  
person_center_id_2 = driver.find_element_by_id("content_rb_mine")
person_center_id_2.click()

class_name定位    

1、class_name 唯一存在

#定位搜索框,通過class_name
search_box = driver.find_element_by_class_name("android.widget.RelativeLayout")

2、class_name 和其他元素重復(fù)
比如底部的幾個(gè)元素都是同一個(gè)class_name,但是index索引不一樣,從0開始
定位方式1:

需要注意,此種寫法和ui automator viewer給的索引不一樣,是從1開始
home_page = driver.find_element_by_xpath("//*[@class='android.widget.RadioButton'][1]")

定位方式2:

此處定位表達(dá)式的index取自u(píng)i automator viewer
category =  driver.find_element_by_xpath("//*[@class='android.widget.RadioButton' and @index=1]")

定位方式3:
Uiautomator通過uiautomator定位,返回的是一列表,下標(biāo)從0開始

my_course = driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.RadioButton")')[2]

xpath定位
需要注意,此種寫法和ui automator viewer給的索引不一樣,是從1開始
home_page = driver.find_element_by_xpath("//*[@class='android.widget.RadioButton'][1]")

text定位
需要使用uiautomator的定位方式
1、匹配全部文本

find_elements_by_android_uiautomator返回的是一個(gè)列表需要取第一元素

#個(gè)人中心
p_center = driver.find_elements_by_android_uiautomator('new UiSelector().text("個(gè)人中心")')[0]

也可以使用find_element_by_android_uiautomator返回的是單個(gè)元素

#分類
category = driver.find_element_by_android_uiautomator('new UiSelector().text("分類")')

2、匹配部分文本
#社區(qū)

area = driver.find_element_by_android_uiautomator('new UiSelector().textContains("社")')
area.click()
time.sleep(3)

3、正則匹配文本

#我的課程
course = driver.find_element_by_android_uiautomator('new UiSelector().textMatches(".*課程.*")')
course.click()
time.sleep(3)

css_selector定位(webview)
只適用于webview的html頁面,繼承自webdriver,與pc版本的UI測試一致
driver.find_element_by_css_selector()

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

用id
driver.find_element_by_css_selector("input#kw")
driver.find_element_by_css_selector("input[id=kw]")

通過link_text定位(webview)
只適用于webview容器中的html頁面,繼承自webdriver,與pc版本的UI測試一致
driver.find_element_by_link_text()

通過name定位
web view容器中的html頁面可以用name定位,native并沒有name屬性
driver.find_element_by_name()

<a href="https://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a>

driver.find_element_by_name("tj_trhao123")

find_element(by,value)
find_element_by_方式(value)實(shí)際調(diào)用的都是find_element(by,value)
需要導(dǎo)入這個(gè)包:
from selenium.webdriver.common.by import By

例如:定位id為ag2的元素
方式一:
driver.find_element_by_id("ag2”)
driver.find_element_by_id("content_rb_bbs”)

方式二:
driver.find_element(By.ID,"ag2")
driver.find_element(By.ID,"content_rb_bbs")

這個(gè)操作的好處是可以直接把操作的by和value放到一個(gè)元組里,然后調(diào)用通用方法來傳參獲得元素結(jié)果
cateid=(By.ID,"ag2")
driver.find_element(*cateid).click()

用find_element()方法定位,兩個(gè)參數(shù) 第一個(gè)參數(shù)是定位的類型由By指定,第二個(gè)參數(shù)是具體的定位值;

傳入兩個(gè)個(gè)參數(shù)不需要是元組

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

driver.find_element(By.XPATH,'//input[@id="kw"]')

driver.find_element(By.NAME,"tj_trhao123")

driver.find_element(By.CLASS_NAME,"s_ipt")

driver.find_element(By.TAG_NAME,"input")

driver.find_element(By.LINK_TEXT,"hao123").click()

driver.find_element(By.PARTIAL_LINK_TEXT,"hao123")

driver.find_element(By.CSS_SELECTOR,"input#kw")

find_elements_by_定位方式(value)
返回的是一個(gè)列表,需要通過下標(biāo)獲取對(duì)應(yīng)元素對(duì)象

driver.find_elements_by_id()
driver.find_elements_by_class_name()
driver.find_elements_by_android_uiautomator()

find_elements(by,value)
同樣返回
find_elements(By.ID,”XXXX”)

定位元素順序:
1、Id
2、class_name,如重復(fù)結(jié)合index
3、Uiautomator,可定位text等
4、xpath

常用API
點(diǎn)擊click
pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1]
pm.click()

清空clear()
userName = driver.find_element_by_id("etUser")
userName.clear()

輸入文本send_keys()
userName = driver.find_element_by_id("etUser")
userName.send_keys(“xxx”)

左右上下滑動(dòng)
'''左滑'''
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
driver.swipe(x*3/4,y/4,x/4,y/4)

'''右滑'''
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
driver.swipe(x/4,y/4,x*3/4,y/4)

'''下滑'''
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
driver.swipe(x/2,y*3/4,x/2,y/4)

'''上滑'''
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
driver.swipe(x/2,y/4,x/2,y*3/4)
滑動(dòng)界面
from appium.webdriver.common.touch_action import TouchAction
def test_scroll_down(driver):
    screen = driver.get_window_size()
    action = TouchAction(driver)
    action.press(x=screen['width']/2,y=screen['height']/2)
    action.move_to(x=0,y=-screen['height']/10)
    action.release()
    action.perform()

獲取界面屬性,控件屬性
1)獲取當(dāng)前Activity名稱
activity = driver.current_activity

2)獲取屏幕寬高
screen = driver.get_window_size()

3)獲取控件文本
mobile_name.get_attribute('text') 
mobile_name.text

4)獲取控件類名
mobile_name.get_attribute('className')

5)判斷控件是否顯示
mobile_name.is_displayed() 
mobile_name.get_attribute('displayed')

6)獲得控件位置
mobile_name.location

7)獲得控件大小mobile_name.size

8)查找控件子結(jié)點(diǎn)

   需要先獲取節(jié)點(diǎn)元素parent,然后獲取對(duì)應(yīng)的子節(jié)點(diǎn)

parent.find_elements_by_class_name('android.widget.TextView')

截屏
driver.get_screenshot_as_file(file_path)

斷言源碼內(nèi)容

assert "平面廣告設(shè)計(jì)付款專用鏈接1" in driver.page_source

#獲取當(dāng)前Activity的名稱
activity = driver.current_activity
print(activity)

#獲取屏幕高度、寬度
size = driver.get_window_size()
print(size)

#獲取平面設(shè)計(jì)元素
pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1]
print("文本:",pm.get_attribute('text'))
print("文本:",pm.text)
print("類名:",pm.get_attribute('className'))
print("控件是否顯示:",pm.is_displayed())
print("控件是否顯示:",pm.get_attribute("displayed"))
print("控件位置:",pm.location)
print("控件大小:",pm.size)

children = pm.find_elements_by_id("com.xsteach.appedu:id/iv_tag")
print(children)

pm.click()
time.sleep(5)

assert "平面廣告設(shè)計(jì)付款專用鏈接1" in driver.page_source

file_path = "e:\\" + time.strftime("%Y-%m-%d") + ".png"

driver.get_screenshot_as_file(file_path)

關(guān)閉driver 
driver.quit()
注意:一定要記得關(guān)閉driver, 否則下次連接的時(shí)候可能會(huì)出異常,因?yàn)锳ppium以為你上次未關(guān)閉,會(huì)創(chuàng)建Session失敗。
關(guān)閉app
driver.close_app()

模擬點(diǎn)擊返回鍵
模擬操作系統(tǒng)的返回鍵

driver.press_keycode(4)
其中按鈕的定義,由Android里的KeyEvent.java里定義的,所以其它的Android按鈕也是支持的。

#獲取平面設(shè)計(jì)元素
pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1]

pm.click()
time.sleep(5)

assert "平面廣告設(shè)計(jì)付款專用鏈接1" in driver.page_source

driver.press_keycode(4)

手機(jī)鍵盤事件的操作
兩個(gè)函數(shù)可用
driver.keyevent()
driver.press_keycode(4)

KEYCODE_CALL 撥號(hào)鍵 5 
KEYCODE_ENDCALL 掛機(jī)鍵 6 
KEYCODE_HOME 按鍵Home 3 
KEYCODE_MENU 菜單鍵 82 
KEYCODE_BACK 返回鍵 4 
KEYCODE_SEARCH 搜索鍵 84 
KEYCODE_CAMERA 拍照鍵 27 
KEYCODE_FOCUS 拍照對(duì)焦鍵 80 
KEYCODE_POWER 電源鍵 26 
KEYCODE_NOTIFICATION 通知鍵 83 
KEYCODE_MUTE 話筒靜音鍵 91 
KEYCODE_VOLUME_MUTE 揚(yáng)聲器靜音鍵 164 
KEYCODE_VOLUME_UP 音量增加鍵 24 
KEYCODE_VOLUME_DOWN 音量減小鍵 25

控制鍵

KEYCODE_ENTER 回車鍵 66 
KEYCODE_ESCAPE ESC鍵 111 
KEYCODE_DPAD_CENTER 導(dǎo)航鍵 確定鍵 23 
KEYCODE_DPAD_UP 導(dǎo)航鍵 向上 19 
KEYCODE_DPAD_DOWN 導(dǎo)航鍵 向下 20 
KEYCODE_DPAD_LEFT 導(dǎo)航鍵 向左 21 
KEYCODE_DPAD_RIGHT 導(dǎo)航鍵 向右 22 
KEYCODE_MOVE_HOME 光標(biāo)移動(dòng)到開始鍵 122 
KEYCODE_MOVE_END 光標(biāo)移動(dòng)到末尾鍵 123 
KEYCODE_PAGE_UP 向上翻頁鍵 92 
KEYCODE_PAGE_DOWN 向下翻頁鍵 93 
KEYCODE_DEL 退格鍵 67 
KEYCODE_FORWARD_DEL 刪除鍵 112 
KEYCODE_INSERT 插入鍵 124 
KEYCODE_TAB Tab鍵 61 
KEYCODE_NUM_LOCK 小鍵盤鎖 143 
KEYCODE_CAPS_LOCK 大寫鎖定鍵 115 
KEYCODE_BREAK Break/Pause鍵 121 
KEYCODE_SCROLL_LOCK 滾動(dòng)鎖定鍵 116 
KEYCODE_ZOOM_IN 放大鍵 168 
KEYCODE_ZOOM_OUT 縮小鍵 169

組合鍵

KEYCODE_ALT_LEFT Alt+Left 
KEYCODE_ALT_RIGHT Alt+Right 
KEYCODE_CTRL_LEFT Control+Left 
KEYCODE_CTRL_RIGHT Control+Right 
KEYCODE_SHIFT_LEFT Shift+Left 
KEYCODE_SHIFT_RIGHT Shift+Right

基本

KEYCODE_0 按鍵’0’ 7 
KEYCODE_1 按鍵’1’ 8 
KEYCODE_2 按鍵’2’ 9 
KEYCODE_3 按鍵’3’ 10 
KEYCODE_4 按鍵’4’ 11 
KEYCODE_5 按鍵’5’ 12 
KEYCODE_6 按鍵’6’ 13 
KEYCODE_7 按鍵’7’ 14 
KEYCODE_8 按鍵’8’ 15 
KEYCODE_9 按鍵’9’ 16 
KEYCODE_A 按鍵’A’ 29 
KEYCODE_B 按鍵’B’ 30 
KEYCODE_C 按鍵’C’ 31 
KEYCODE_D 按鍵’D’ 32 
KEYCODE_E 按鍵’E’ 33 
KEYCODE_F 按鍵’F’ 34 
KEYCODE_G 按鍵’G’ 35 
KEYCODE_H 按鍵’H’ 36 
KEYCODE_I 按鍵’I’ 37 
KEYCODE_J 按鍵’J’ 38 
KEYCODE_K 按鍵’K’ 39 
KEYCODE_L 按鍵’L’ 40 
KEYCODE_M 按鍵’M’ 41 
KEYCODE_N 按鍵’N’ 42 
KEYCODE_O 按鍵’O’ 43 
KEYCODE_P 按鍵’P’ 44 
KEYCODE_Q 按鍵’Q’ 45 
KEYCODE_R 按鍵’R’ 46 
KEYCODE_S 按鍵’S’ 47 
KEYCODE_T 按鍵’T’ 48 
KEYCODE_U 按鍵’U’ 49 
KEYCODE_V 按鍵’V’ 50 
KEYCODE_W 按鍵’W’ 51 
KEYCODE_X 按鍵’X’ 52 
KEYCODE_Y 按鍵’Y’ 53 
KEYCODE_Z 按鍵’Z’ 54

appium可以借助pc端selenium的物理按鍵代碼來操作。 
driver.press_keycode() 括號(hào)內(nèi)填入pc端鍵盤的代號(hào)

示例
均基于邢帥教育 APP

示例1:
#encoding=utf-8
from appium import webdriver
import time
caps = {}
#app的包名
caps["appPackage"] = "com.xsteach.appedu"

#需要啟動(dòng)的Activity名稱
caps["appActivity"] = "com.xsteach.appedu.StartActivity"

#系統(tǒng)類
caps["platformName"] = "Android"

#系統(tǒng)版本
caps["platformVersion"] = "6"
#設(shè)置id
caps["deviceName"] = "G2W0214B11002712"
#使用使用 Unicode 輸入法,支持中文
caps["unicodeKeyboard"] =  True
#在設(shè)定了 unicodeKeyboard 關(guān)鍵字的 Unicode 測試結(jié)束后,重置輸入法到原有狀態(tài)。
#如果單獨(dú)使用,將會(huì)被忽略。默認(rèn)值 false
caps["resetKeyboard"] = True

#自動(dòng)確認(rèn)警告
caps["autoAcceptAlerts"] = True
#會(huì)話前重置應(yīng)用狀態(tài)
caps["noReset"] = True
#設(shè)置命令超時(shí)時(shí)間
caps["newCommandTimeout"] = 6000

#創(chuàng)建driver對(duì)象
driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)

#獲取屏幕的寬度、高度,返回字典
size = driver.get_window_size()
print(size)

#判斷對(duì)應(yīng)的app是否安裝
print(driver.is_app_installed("com.xsteach.appedu"))

#退出app
driver.close_app()

注意:通過adb shell dumpsys package com.xsteach.appedu獲取的包名
不能帶/

示例2:搜索
#encoding=utf-8
from appium import webdriver
import time
caps = {}
#app的包名
caps["appPackage"] = "com.xsteach.appedu"
#需要啟動(dòng)的Activity名稱
caps["appActivity"] = "com.xsteach.appedu.StartActivity"
#系統(tǒng)類
caps["platformName"] = "Android"
#系統(tǒng)版本
caps["platformVersion"] = "6"
#設(shè)置id
caps["deviceName"] = "G2W0214B11002712"
#使用使用 Unicode 輸入法,支持中文
caps["unicodeKeyboard"] =  True
#隱藏鍵盤,在設(shè)定了 unicodeKeyboard 關(guān)鍵字的 Unicode 測試結(jié)束后,重置輸入法到原有狀態(tài)。
#如果單獨(dú)使用,將會(huì)被忽略。默認(rèn)值 false
caps["resetKeyboard"] = True
#自動(dòng)確認(rèn)警告
caps["autoAcceptAlerts"] = True
#會(huì)話前重置應(yīng)用狀態(tài)
caps["noReset"] = True
#設(shè)置命令超時(shí)時(shí)間
caps["newCommandTimeout"] = 6000

#創(chuàng)建driver對(duì)象
driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)

#打印當(dāng)前頁面的Activity
print(driver.current_activity)

time.sleep(5)

#獲取個(gè)人中心元素對(duì)象,返回的是一個(gè)list
uList = driver.find_elements_by_android_uiautomator("new UiSelector().text(\"個(gè)人中心\")")

print(uList)
print(uList[0].text)

#獲取頂部搜索框?qū)ο?
searchBox = driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search")
searchBox.click()
time.sleep(3)

#獲取二級(jí)頁面的搜索框?qū)ο?
searchBox2 = driver.find_element_by_id("com.xsteach.appedu:id/editText")
time.sleep(3)

#輸入搜索關(guān)鍵字
searchBox2.send_keys("PS")
time.sleep(4)

#獲取搜索出的第一個(gè)內(nèi)容并點(diǎn)擊
driver.find_element_by_id("com.xsteach.appedu:id/item_tv_dynamic_search_result").click()
time.sleep(3)

#關(guān)閉app
driver.close_app()

示例3:登錄
#encoding=utf-8
from appium import webdriver
import time
caps = {}
#app的包名
caps["appPackage"] = "com.xsteach.appedu"
#需要啟動(dòng)的Activity名稱
caps["appActivity"] = "com.xsteach.appedu.StartActivity"
#系統(tǒng)類
caps["platformName"] = "Android"
#系統(tǒng)版本
caps["platformVersion"] = "6"
#設(shè)置id
caps["deviceName"] = "G2W0214B11002712"
#使用使用 Unicode 輸入法,支持中文
caps["unicodeKeyboard"] =  True
#隱藏鍵盤,在設(shè)定了 unicodeKeyboard 關(guān)鍵字的 Unicode 測試結(jié)束后,重置輸入法到原有狀態(tài)。
#如果單獨(dú)使用,將會(huì)被忽略。默認(rèn)值 false
caps["resetKeyboard"] = True
#自動(dòng)確認(rèn)警告
caps["autoAcceptAlerts"] = True
#會(huì)話前重置應(yīng)用狀態(tài)
caps["noReset"] = True
#設(shè)置命令超時(shí)時(shí)間
caps["newCommandTimeout"] = 6000

#創(chuàng)建driver對(duì)象
driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)

#獲取個(gè)人中心頁面元素
personInfo = driver.find_element_by_id("content_rb_mine")
personInfo.click()
time.sleep(3)

#獲取"點(diǎn)擊登錄"按鈕元素
click_login = driver.find_element_by_id("tvLogin")
click_login.click()
time.sleep(3)

#獲取用戶名輸入框,并輸入用戶名
userName = driver.find_element_by_id("etUser")
userName.send_keys("fosterwu")
time.sleep(2)
#獲取密碼輸入框并輸入名
passWord = driver.find_element_by_id("etPwd")
passWord.send_keys("gloryroad123")

time.sleep(2)
#獲取登錄按鈕,并點(diǎn)擊登錄按鈕
loginButton = driver.find_element_by_id("btnLogin")
loginButton.click()

time.sleep(3)
#退出app
driver.close_app()

示例4:
進(jìn)入平面設(shè)計(jì)模塊,然后選擇第一個(gè)課程,然后一直返回到首頁
#encoding=utf-8
from appium import webdriver
import time
caps = {}
#app的包名
caps["appPackage"] = "com.xsteach.appedu"
#需要啟動(dòng)的Activity名稱
caps["appActivity"] = "com.xsteach.appedu.StartActivity"
#系統(tǒng)類
caps["platformName"] = "Android"
#系統(tǒng)版本
caps["platformVersion"] = "6"
#設(shè)置id
caps["deviceName"] = "G2W0214B11002712"
#使用使用 Unicode 輸入法,支持中文
caps["unicodeKeyboard"] =  True
#隱藏鍵盤,在設(shè)定了 unicodeKeyboard 關(guān)鍵字的 Unicode 測試結(jié)束后,重置輸入法到原有狀態(tài)。
#如果單獨(dú)使用,將會(huì)被忽略。默認(rèn)值 false
caps["resetKeyboard"] = True
#自動(dòng)確認(rèn)警告
caps["autoAcceptAlerts"] = True
#會(huì)話前重置應(yīng)用狀態(tài)
caps["noReset"] = True
#設(shè)置命令超時(shí)時(shí)間
caps["newCommandTimeout"] = 6000

#創(chuàng)建driver對(duì)象
driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)

#獲取平面設(shè)計(jì)元素對(duì)象
pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1]
pm.click()

time.sleep(3)

#獲取平面設(shè)計(jì)下的第一個(gè)課程
course = driver.find_elements_by_xpath("//*[@class='android.widget.ImageView']")[1]
course .click()
time.sleep(3)

#也可以直接用圖標(biāo)下的文本定位
#course = driver.find_element_by_android_uiautomator('new UiSelector().text("Illustrator普通班課程(錄播)")')

#獲取當(dāng)前課程頁面的返回按鈕
course_back = driver.find_element_by_id("com.xsteach.appedu:id/iv_back")
course_back.click()
time.sleep(3)

#獲取平面設(shè)計(jì)頁面的返回按鈕
pm_back =  driver.find_elements_by_xpath("//*[@class='android.widget.ImageView']")[0]
pm_back.click()

由于以上兩個(gè)元素的id和class都不唯一,需要先獲取到所有的元素,然后再取某一個(gè),
并且第一個(gè)課程的index都是0,此時(shí)只好先獲取到所有的元素;

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“python中Appium怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI