#encoding=utf-8 ''' ''' #driver新建 driver=webdriver.Remote('http://localhost:4723/wd/hub',caps) #關閉driver driver.quit() #find_element_by_id box=driver.find_element_by_id('com.xsteach.appedu:id/rl_home_top_search') box=driver.find_element_by_id('rl_home_top_search') #class_name driver.find_element_by_class_name('android.widget.TextView') #這個方式獲取到的是一個列表 driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')[2] #xpath driver.find_element_by_xpath("//android.widget.RadioButton[@text='個人中心']") #text 同className方式,結果是一個list driver.find_elements_by_android_uiautomator('new UiSelector().text("個人中心")') #textContains 不是list driver.find_element_by_android_uiautomator('new UiSelector().textContains("中心")').click() #正則匹配 不是list driver.find_element_by_android_uiautomator('new UiSelector().textMatches(".*的課程.*")').click() #*******************webview定位類似frame的操作方式**************** #link_text driver.find_element_by_link_text('新聞') driver.find_element_by_name('') #android原生頁面沒有name屬性 #find_element(by,value) from selenium.webdriver.common.by import By driver.find_element(By.ID,'kw') cateid_locator=(By.ID,"ag2") driver.find_element(*cateid_locator).click() #*******************by的相關操作***************** By.ID 相當於by_id By.CLASS_NAME 相當於by_class_name By.XPATH 相當於by_xpath By.NAME 相當於by_name By.TAG_NAME 相當於by_tag_name By.CSS_SELECTOR 相當於by_css_selector By.LINK_TEXT 相當於by_link_text #find_elements_by_class_name 返回列表 driver.find_elements_by_class_name("android.widget.TextView")[10].click() #先找到元素一 再繼續查找元素二 driver.find_element_by_class_name(“xxx”).find_element_by_name(“yyy") #清空clear driver.find_element_by_id('editText').clear() #***************左右上下滑動屏幕(x*3/4,y/4,x/4,y/4)************ #表示起始點坐標、終點坐標,參照點左上角 #左滑 x=driver.get_window_size()['width'] y=driver.get_window_size()['height'] driver.swipe(x*3/4,y/4,x/4,y/4) #右滑 driver.swipe(x/4,y/4,x*3/4,y/4) #下滑(與上滑有可能反了) driver.swipe(x/4,y/4,x/4,y*3/4) #上滑 driver.swipe(x/4,y*3/4,x/4,y/4) #**********TouchAction 類似ActionChains********** #滑動頁面(解鎖密碼可以用) 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() #***********獲取界面屬性,控件屬性********** #當前的activity driver.current_activity #屏幕高寬,字典 driver.get_window_size() #獲取控件的文本 mobile_name.get_attribute('text') 或者mobile_name.text #獲取控件類型 mobile_name.get_attribute('className') #控件是否顯示 mobile_name.is_displayed()或者 mobile_name.get_attribute('displayed') #獲得控件的位置 mobile_name.location #獲得控件的大小 mobile_name.size #截屏 driver.get_screenshot_as_file(filepath) #斷言 assert '建築設計' in driver.page_source #*********鍵盤事件*********** #模擬點擊返回鍵 driver.press_keycode(4) appium可以借助pc端selenium的物理按鍵代碼來操作。 driver.press_keycode() 括號內填入pc端鍵盤的代號 #鍵盤事件操作 driver.keyevent(66) #電話鍵 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 ************************小例子************************* #某教育app的例子 from appium import webdriver import time caps = {} caps["appPackage"] = "com.xsteach.appedu" caps["appActivity"] = "com.xsteach.appedu.StartActivity" caps["platformName"] = "Android" caps["platformVersion"] = '6.0.1' caps["deviceName"] = '3HX0217115011233' caps["unicodeKeyboard"] = True caps["autoAcceptAlerts"] = True #對權限彈窗進行授權 caps["resetKeyboard"] = True caps["noReset"] = True caps["newCommandTimeout"]=6000 driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) #獲取手機屏幕大小,返回字典 {'width': 720, 'height': 1280} size = driver.get_window_size() print(size) print(driver.is_app_installed("com.xsteach.appedu")) #關閉app driver.close_app() driver.quit() #***************************模擬某教育APP 搜索操作************************** from appium import webdriver import time caps = {} caps["appPackage"] = "com.xsteach.appedu" caps["appActivity"] = "com.xsteach.appedu.StartActivity" caps["platformName"] = "Android" caps["platformVersion"] = '8' caps["deviceName"] = '3HX0217115011233' caps["unicodeKeyboard"] = True caps["autoAcceptAlerts"] = True #對權限彈窗進行授權 caps["resetKeyboard"] = True caps["noReset"] = True caps["newCommandTimeout"]=6000 driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) #獲取手機大小{'width': 1080, 'height': 1808} size = driver.get_window_size() print(size) # 查看指定包名的app是否已經按照 print(driver.is_app_installed("com.xsteach.appedu")) #driver.start_activity('com.xsteach.appedu', '.StartActivity') # 打印一下當前頁面的activity print(driver.current_activity) time.sleep(5) uList = driver.find_elements_by_android_uiautomator("new UiSelector().text(\"個人中心\")") print(uList[0].text) box=driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search") box.click() time.sleep(2) box=driver.find_element_by_id("com.xsteach.appedu:id/editText") time.sleep(2) box.send_keys("python") 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() #2、也可以跳過某些場景,達到某個頁面 # element = driver.find_element_by_android_uiautomator('new UiSelector().text("新用戶")') # element.click() print(driver.current_activity) ele = driver.start_activity('com.xsteach.appedu', '.StartActivity') print(driver.current_activity) time.sleep(5) box=driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search") box.click() time.sleep(2) box=driver.find_element_by_id("editText") time.sleep(1) box.send_keys("設計") time.sleep(3) box.clear() box.send_keys("編程") driver.find_element_by_id("tv_Text").click() ******************************登錄的完整例子******************************* from appium import webdriver import time import os caps = {} caps["appPackage"] = "com.xsteach.appedu" caps["appActivity"] = "com.xsteach.appedu.StartActivity" caps["platformName"] = "Android" caps["platformVersion"] = '8' caps["deviceName"] = '3HX0217115011233' caps["unicodeKeyboard"] = True caps["autoAcceptAlerts"] = True #對權限彈窗進行授權 caps["resetKeyboard"] = True caps["noReset"] = True caps["newCommandTimeout"]=6000 driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) #等待5秒 driver.implicitly_wait(5) person_center =driver.find_element_by_id("content_rb_mine") #person_center = driver.find_elements_by_android_uiautomator("new UiSelector().text(\"+個人中心\")") person_center.click() log_in = driver.find_element_by_id("tvLogin") log_in.click() driver.find_element_by_id("etUser").send_keys("fosterwu") driver.find_element_by_id("etPwd").send_keys("gloryroad123") driver.find_element_by_id("btnLogin").click() time.sleep(3) driver.close_app() *****************************chrome百度搜索的一個例子*************************** #注意chrome 與chromedriver的版本匹配問題 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md #chromedriver版本替換 http://blog.sina.com.cn/s/blog_6a8557730102y17x.html from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait import time,os url='https://www.baidu.com' desired_caps = { 'platformName': 'Android', 'deviceName': '3HX0217115011233', 'platformVersion': '8', 'noReset': True, 'browserName':'Chrome', "newCommandTimeout": "6000" } driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) print('瀏覽器啟動成功') driver.get("http://www.baidu.com") #time.sleep(2) #華為手機,會彈出個權限的系統提示框,執行兩次回車動作可以取消掉。 driver.keyevent(66) driver.keyevent(66) try: WebDriverWait(driver,10,1).until(lambda x:x.find_element_by_xpath("//input[@id='index-kw']")).send_keys("光榮之路") #xpath 定位如何獲取到的 time.sleep(5) driver.keyevent(66) except Exception as err: pass driver.keyevent(66) time.sleep(5) assert "光榮之路" in driver.page_source driver.close_app() https://www.cnblogs.com/helenMemery/p/7346485.html desired_caps['recreateChromeDriverSessions'] = True啟動時,這個參數也加上,他這是每到一個webview頁面就重新創建一個driver,要不然定位找不到 1.手機端打開需要獲取的webview頁面 2. pc端chrome瀏覽器地址欄中輸入:chrome://inspect/#devices,定位元素 但是需要翻牆,如果能翻牆,就可以加載出來 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md : 這個是appium在GitHub上對webview和chromedriver版本的說明 報stableObject異常時候,加個sleep. 切換webview的操作,沒有查到怎么切換回去,可以先記錄一下 之前的contexts,再切回之前的 網上查到了這個: self.driver.switch_to.context() 如果是從App轉到web的話()填"WEBVIEW_1", 如果web轉到App的話填"NATIVE_APP" contexts = driver.contexts print contexts c = contexts[1] print c driver.switch_to.context(c) now = driver.current_context print (now)