appium webdriver 基本操作及小例子等


#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)

 


免責聲明!

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



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