Appium的簡答使用

Appium Appium 服務關鍵字 關鍵字 描述 實例 automationName 你想使用的自動化測試引擎 Appium (默認) 或 Selendroid platformName 你要測試的手機操作系統 iOS, Android, 或 FirefoxOS platformVersion 手機操作系統版本 例如: 7.1, 4.4 deviceName 使用的手機類型或模擬器類型 iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等。在 iOS 上,這個關鍵字的值必須是使用 instruments -s devices 得到的可使用的設備名稱之一。在 Android 上,這個關鍵字目前不起作用。 app .ipa or .apk文件所在的本地絕對路徑或者遠程路徑,也可以是一個包括兩者之一的.zip。 Appium會先嚐試安裝路徑對應的應用在適當的真機或模擬器上。針對Android系統,如果你指定app-package和app-activity(具體見下面)的話,那麼就可以不指定app。 會與 browserName 衝突 比如/abs/path/to/my.apk或http://myapp.com/app.ipa browserName 需要進行自動化測試的手機 web 瀏覽器名稱。如果是對應用進行自動化測試,這個關鍵字的值應爲空。 iOS 系統上可以用 'Safari' ,Android 系統上可以用 'Chrome', 'Chromium', 或 'Browser'。 newCommandTimeout 設置命令超時時間,單位:秒。達到超時時間仍未接收到新的命令時 Appium 會假設客戶端退出然後自動結束會話。 比如 60 autoLaunch Appium是否需要自動安裝和啓動應用。默認值true true, false language (Sim/Emu-only) 設定模擬器 ( simulator / emulator ) 的語言。 如: fr locale (Sim/Emu-only) 設定模擬器 ( simulator / emulator ) 的區域設置。 如: fr_CA udid 連接的物理設備的唯一設備標識 如: 1ae203187fc012g orientation (Sim/Emu-only) 在一個設定的方向模式中開始測試 LANDSCAPE (橫向) 或 PORTRAIT (縱向) autoWebview 直接轉換到 WebView 上下文。 默認值 false、 true, false noReset 不要在會話前重置應用狀態。默認值false。 true, false fullReset (iOS) 刪除整個模擬器目錄。(Android) 通過卸載——而不是清空數據——來重置應用狀態。在 Android 上,這也會在會話結束後自動清除被測應用。默認值 false true, false   Android特有 關鍵字 描述 實例 appActivity 你要從你的應用包中啓動的 Android Activity 名稱。它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity) MainActivity, .Settings appPackage 你想運行的Android應用的包名 比如com.example.android.myApp, com.android.settings appWaitActivity 你想要等待啓動的 Android Activity 名稱 SplashActivity deviceReadyTimeout 設置等待一個模擬器或真機準備就緒的超時時間 5 androidCoverage 用於執行測試的 instrumentation 類。作爲命令 adb shell am instrument -e coverage true -w 的-w 參數。 com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation enablePerformanceLogging (僅適用於 Chrome 和 webview) 開啓 Chromedriver 的性能日誌。 (默認 false) true, false androidDeviceReadyTimeout 等待設備在啓動應用後準備就緒的超時時間。以秒爲單位。 如 30 androidDeviceSocket 開發工具的 socket 名稱。只有在被測應用是一個使用 Chromium 內核的瀏覽器時需要。 socket 會被瀏覽器打開,然後 Chromedriver 把它作爲開發者工具來進行連接。 如 chrome_devtools_remote avd 需要啓動的 AVD (安卓虛擬設備) 名稱。 如 api19 avdLaunchTimeout 以毫秒爲單位,等待 AVD 啓動並連接到 ADB 的超時時間。(默認值120000) 300000 avdReadyTimeout 以毫秒爲單位,等待 AVD 完成啓動動畫的超時時間。(默認值 120000) 300000 avdArgs 啓動 AVD 時需要加入的額外的參數。 如 -netfast useKeystore 使用一個自定義的 keystore 來對 apk 進行重簽名。默認值 false true or false keystorePath 自定義 keystore 的路徑。默認: ~/.android/debug.keystore 如 /path/to.keystore keystorePassword 自定義 keystore 的密碼。 如 foo keyAlias key 的別名 如 androiddebugkey keyPassword key 的密碼 如 foo chromedriverExecutable webdriver 可執行文件的絕對路徑 (如果 Chromium 核心提供了對應的 webdriver, 應該用它代替 Appium 自帶的 webdriver) /abs/path/to/webdriver autoWebviewTimeout 以毫秒爲單位,等待 Webview 上下文激活的時間。默認值 2000 如 4 intentAction 用於啓動 activity 的 intent action。 (默認值android.intent.action.MAIN) 如 android.intent.action.MAIN,android.intent.action.VIEW intentCategory 用於啓動 activity 的 intent category。 (默認值android.intent.category.LAUNCHER) 如 android.intent.category.LAUNCHER,android.intent.category.APP_CONTACTS intentFlags 用於啓動 activity 的標識 ( flags ) (默認值 0x10200000) 如 0x10200000 optionalIntentArguments 用於啓動 activity 的額外 intent 參數。請查看 Intent 參數 如 --esn <EXTRA_KEY>, --ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> stopAppOnReset 在使用 adb 啓動應用前停止被測應用的進程 ( process ) 。如果被測應用是被另一個應用創建的,當這個參數被設定爲 false 時,允許另一個應用的進程在使用 adb 啓動被測應用時繼續存活。默認值 true true 或 false unicodeKeyboard 使用 Unicode 輸入法。默認值false true 或 false resetKeyboard 在設定了 unicodeKeyboard 關鍵字的 Unicode 測試結束後,重置輸入法到原有狀態。如果單獨使用,將會被忽略。默認值 false true 或 false noSign 跳過檢查和對應用進行 debug 簽名的步驟。只能在使用 UiAutomator 時使用,使用 selendroid 是不行。默認值 false true 或 false ignoreUnimportantViews 調用 uiautomator 的函數setCompressedLayoutHierarchy()。由於 Accessibility 命令在忽略部分元素的情況下執行速度會加快,這個關鍵字能加快測試執行的速度。被忽略的元素將不能夠被找到,因此這個關鍵字同時也被實現成可以隨時改變的 *設置 ( settings ) * 。默認值 false true 或 false   iOS特有 關鍵字 描述 實例 calendarFormat (Sim-only) 爲iOS的模擬器設置日曆格式 如 gregorian (公曆) bundleId 被測應用的 bundle ID 。用於在真實設備中啓動測試,也用於使用其他需要 bundle ID 的關鍵字啓動測試。在使用 bundle ID 在真實設備上執行測試時,你可以不提供 app 關鍵字,但你必須提供 udid 。 如 io.appium.TestApp udid 連接的真實設備的唯一設備編號 ( Unique device identifier ) 如 1ae203187fc012g launchTimeout 以毫秒爲單位,在 Appium 運行失敗之前設置一個等待 instruments 的時間 比如: 20000 locationServicesEnabled (Sim-only) 強制打開或關閉定位服務。默認值是保持當前模擬器的設定 true 或 false locationServicesAuthorized (Sim-only) 通過修改 plist 文件設定是否允許應用使用定位服務,從而避免定位服務的警告出現。默認值是保持當前模擬器的設定。請注意在使用這個關鍵字時,你同時需要使用 bundleId 關鍵字來發送你的應用的 bundle ID。 true 或者 false autoAcceptAlerts 當 iOS 的個人信息訪問警告 (如 位置、聯繫人、圖片) 出現時,自動選擇接受( Accept )。默認值 false。 true 或者 false autoDismissAlerts 當 iOS 的個人信息訪問警告 (如 位置、聯繫人、圖片) 出現時,自動選擇不接受( Dismiss )。默認值false。 true 或者 false nativeInstrumentsLib 使用原生 intruments 庫 (即關閉 instruments-without-delay ) true 或者 false nativeWebTap (Sim-only) 在Safari中允許"真實的",非基於 javascript 的 web 點擊 (tap) 。 默認值: false。注意:取決於 viewport 大小/比例, 點擊操作不一定能精確地點中對應的元素。 true 或者 false safariInitialUrl (Sim-only) (>= 8.1) 初始化 safari 的時使用的地址。默認是一個本地的歡迎頁面 如https://www.github.com safariAllowPopups (Sim-only) 允許 javascript 在 Safari 中創建新窗口。默認保持模擬器當前設置。 true 或者 false safariIgnoreFraudWarning (Sim-only) 阻止 Safari 顯示此網站可能存在風險的警告。默認保持瀏覽器當前設置。 true 或者 false safariOpenLinksInBackground (Sim-only) Safari 是否允許鏈接在新窗口打開。默認保持瀏覽器當前設置。 true 或者 false keepKeyChains (Sim-only) 當 Appium 會話開始/結束時是否保留存放密碼存放記錄 (keychains) (庫(Library)/鑰匙串(Keychains)) true 或者 false localizableStringsDir 從哪裏查找本地化字符串。默認值 en.lproj en.lproj processArguments 通過 instruments 傳遞到 AUT 的參數 如 -myflag interKeyDelay 以毫秒爲單位,按下每一個按鍵之間的延遲時間。 如 100 showIOSLog 是否在 Appium 的日誌中顯示設備的日誌。默認值false true 或者 false sendKeyStrategy 輸入文字到文字框的策略。模擬器默認值:oneByOne(一個接着一個) 。真實設備默認值:grouped (分組輸入) oneByOne, grouped 或setValue screenshotWaitTimeout 以秒爲單位,生成屏幕截圖的最長等待時間。默認值: 10。 如 5 waitForAppScript 用於判斷 "應用是否被啓動” 的 iOS 自動化腳本代碼。默認情況下系統等待直到頁面內容非空。結果必須是布爾類型。 例如 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 和其他元素重複 比如底部的幾個元素都是同一個class_name,但是index索引不一樣,從0開始 定位方式1: 需要注意,此種寫法和ui automator viewer給的索引不一樣,是從1開始 home_page = driver.find_element_by_xpath("//*[@class='android.widget.RadioButton'][1]") 定位方式2: 此處定位表達式的index取自ui automator viewer category = driver.find_element_by_xpath("//*[@class='android.widget.RadioButton' and @index=1]") 定位方式3: Uiautomator通過uiautomator定位,返回的是一列表,下標從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返回的是一個列表需要取第一元素 #個人中心 p_center = driver.find_elements_by_android_uiautomator('new UiSelector().text("個人中心")')[0] 也可以使用find_element_by_android_uiautomator返回的是單個元素 #分類 category = driver.find_element_by_android_uiautomator('new UiSelector().text("分類")') 2、匹配部分文本 #社區 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)實際調用的都是find_element(by,value) 需要導入這個包: 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") 這個操作的好處是可以直接把操作的by和value放到一個元組裏,然後調用通用方法來傳參獲得元素結果 cateid=(By.ID,"ag2") driver.find_element(*cateid).click() 用find_element()方法定位,兩個參數 第一個參數是定位的類型由By指定,第二個參數是具體的定位值; 傳入兩個個參數不需要是元組 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) 返回的是一個列表,需要通過下標獲取對應元素對象 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,如重複結合index 3、Uiautomator,可定位text等 4、xpath 常用API 點擊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”) 左右上下滑動 '''左滑''' 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) 滑動界面 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)獲取當前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)查找控件子結點 需要先獲取節點元素parent,然後獲取對應的子節點 parent.find_elements_by_class_name('android.widget.TextView') 截屏 driver.get_screenshot_as_file(file_path) 斷言源碼內容 assert "平面廣告設計付款專用鏈接1" in driver.page_source #獲取當前Activity的名稱 activity = driver.current_activity print(activity) #獲取屏幕高度、寬度 size = driver.get_window_size() print(size) #獲取平面設計元素 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 "平面廣告設計付款專用鏈接1" in driver.page_source file_path = "e:\\" + time.strftime("%Y-%m-%d") + ".png" driver.get_screenshot_as_file(file_path) 關閉driver driver.quit() 注意:一定要記得關閉driver, 否則下次連接的時候可能會出異常,因爲Appium以爲你上次未關閉,會創建Session失敗。 關閉app driver.close_app() 模擬點擊返回鍵 模擬操作系統的返回鍵 driver.press_keycode(4) 其中按鈕的定義,由Android裏的KeyEvent.java裏定義的,所以其它的Android按鈕也是支持的。 #獲取平面設計元素 pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1] pm.click() time.sleep(5) assert "平面廣告設計付款專用鏈接1" in driver.page_source driver.press_keycode(4) 手機鍵盤事件的操作 兩個函數可用 driver.keyevent() driver.press_keycode(4) KEYCODE_CALL 撥號鍵 5 KEYCODE_ENDCALL 掛機鍵 6 KEYCODE_HOME 按鍵Home 3 KEYCODE_MENU 菜單鍵 82 KEYCODE_BACK 返回鍵 4 KEYCODE_SEARCH 搜索鍵 84 KEYCODE_CAMERA 拍照鍵 27 KEYCODE_FOCUS 拍照對焦鍵 80 KEYCODE_POWER 電源鍵 26 KEYCODE_NOTIFICATION 通知鍵 83 KEYCODE_MUTE 話筒靜音鍵 91 KEYCODE_VOLUME_MUTE 揚聲器靜音鍵 164 KEYCODE_VOLUME_UP 音量增加鍵 24 KEYCODE_VOLUME_DOWN 音量減小鍵 25 控制鍵 KEYCODE_ENTER 回車鍵 66 KEYCODE_ESCAPE ESC鍵 111 KEYCODE_DPAD_CENTER 導航鍵 確定鍵 23 KEYCODE_DPAD_UP 導航鍵 向上 19 KEYCODE_DPAD_DOWN 導航鍵 向下 20 KEYCODE_DPAD_LEFT 導航鍵 向左 21 KEYCODE_DPAD_RIGHT 導航鍵 向右 22 KEYCODE_MOVE_HOME 光標移動到開始鍵 122 KEYCODE_MOVE_END 光標移動到末尾鍵 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 滾動鎖定鍵 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() 括號內填入pc端鍵盤的代號 示例 均基於邢帥教育 APP 示例1: #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要啓動的Activity名稱 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系統類 caps["platformName"] = "Android" #系統版本 caps["platformVersion"] = "6" #設置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 輸入法,支持中文 caps["unicodeKeyboard"] = True #在設定了 unicodeKeyboard 關鍵字的 Unicode 測試結束後,重置輸入法到原有狀態。 #如果單獨使用,將會被忽略。默認值 false caps["resetKeyboard"] = True #自動確認警告 caps["autoAcceptAlerts"] = True #會話前重置應用狀態 caps["noReset"] = True #設置命令超時時間 caps["newCommandTimeout"] = 6000 #創建driver對象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #獲取屏幕的寬度、高度,返回字典 size = driver.get_window_size() print(size) #判斷對應的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" #需要啓動的Activity名稱 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系統類 caps["platformName"] = "Android" #系統版本 caps["platformVersion"] = "6" #設置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 輸入法,支持中文 caps["unicodeKeyboard"] = True #隱藏鍵盤,在設定了 unicodeKeyboard 關鍵字的 Unicode 測試結束後,重置輸入法到原有狀態。 #如果單獨使用,將會被忽略。默認值 false caps["resetKeyboard"] = True #自動確認警告 caps["autoAcceptAlerts"] = True #會話前重置應用狀態 caps["noReset"] = True #設置命令超時時間 caps["newCommandTimeout"] = 6000 #創建driver對象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #打印當前頁面的Activity print(driver.current_activity) time.sleep(5) #獲取個人中心元素對象,返回的是一個list uList = driver.find_elements_by_android_uiautomator("new UiSelector().text(\"個人中心\")") print(uList) print(uList[0].text) #獲取頂部搜索框對象 searchBox = driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search") searchBox.click() time.sleep(3) #獲取二級頁面的搜索框對象 searchBox2 = driver.find_element_by_id("com.xsteach.appedu:id/editText") time.sleep(3) #輸入搜索關鍵字 searchBox2.send_keys("PS") time.sleep(4) #獲取搜索出的第一個內容並點擊 driver.find_element_by_id("com.xsteach.appedu:id/item_tv_dynamic_search_result").click() time.sleep(3) #關閉app driver.close_app() 示例3:登錄 #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要啓動的Activity名稱 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系統類 caps["platformName"] = "Android" #系統版本 caps["platformVersion"] = "6" #設置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 輸入法,支持中文 caps["unicodeKeyboard"] = True #隱藏鍵盤,在設定了 unicodeKeyboard 關鍵字的 Unicode 測試結束後,重置輸入法到原有狀態。 #如果單獨使用,將會被忽略。默認值 false caps["resetKeyboard"] = True #自動確認警告 caps["autoAcceptAlerts"] = True #會話前重置應用狀態 caps["noReset"] = True #設置命令超時時間 caps["newCommandTimeout"] = 6000 #創建driver對象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #獲取個人中心頁面元素 personInfo = driver.find_element_by_id("content_rb_mine") personInfo.click() time.sleep(3) #獲取"點擊登錄"按鈕元素 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) #獲取登錄按鈕,並點擊登錄按鈕 loginButton = driver.find_element_by_id("btnLogin") loginButton.click() time.sleep(3) #退出app driver.close_app() 示例4: 進入平面設計模塊,然後選擇第一個課程,然後一直返回到首頁 #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要啓動的Activity名稱 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系統類 caps["platformName"] = "Android" #系統版本 caps["platformVersion"] = "6" #設置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 輸入法,支持中文 caps["unicodeKeyboard"] = True #隱藏鍵盤,在設定了 unicodeKeyboard 關鍵字的 Unicode 測試結束後,重置輸入法到原有狀態。 #如果單獨使用,將會被忽略。默認值 false caps["resetKeyboard"] = True #自動確認警告 caps["autoAcceptAlerts"] = True #會話前重置應用狀態 caps["noReset"] = True #設置命令超時時間 caps["newCommandTimeout"] = 6000 #創建driver對象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #獲取平面設計元素對象 pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1] pm.click() time.sleep(3) #獲取平面設計下的第一個課程 course = driver.find_elements_by_xpath("//*[@class='android.widget.ImageView']")[1] course .click() time.sleep(3) #也可以直接用圖標下的文本定位 #course = driver.find_element_by_android_uiautomator('new UiSelector().text("Illustrator普通班課程(錄播)")') #獲取當前課程頁面的返回按鈕 course_back = driver.find_element_by_id("com.xsteach.appedu:id/iv_back") course_back.click() time.sleep(3) #獲取平面設計頁面的返回按鈕 pm_back = driver.find_elements_by_xpath("//*[@class='android.widget.ImageView']")[0] pm_back.click() 由於以上兩個元素的id和class都不唯一,需要先獲取到所有的元素,然後再取某一個, 並且第一個課程的index都是0,此時只好先獲取到所有的元素;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章