Android定位元素與操作

來源:互聯網
上載者:User

標籤:視窗   元素   volume   endcall   tom   電源鍵   width   AC   會話   

 

一、常用識別元素的工具uiautomator:Android SDK內建的一個工具,在tools目錄下monitor:Android SDK內建的一個工具,在tools目錄下Appium Inspector:Appium內建的一個功能,只有mac下可以使用該功能 下面是用monitor抓取到的頁面元素  下面使用Appium Inspector定位的元素  二、元素定位   1.格式:find_element_by_定位方式(value)  通過id定位(取resource-id的值):driver.find_element_by_id("com.wuba.zhuanzhuan:id/azo")也可以直接用id後面的內容driver.find_element_by_id("azo")  通過class_name定位(取class的內容)driver.find_element_by_class_name("android.widget.RelativeLayout")  通過xpath定位(取xpath得內容)driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.XXX")  通過text定位(需要使用uiautomator的定位方式,使用text的內容)driver.find_elements_by_android_uiautomator("new UiSelector().text(\"+關注\")") 使用這裡需要注意一下,通過text定位的結果是個list,不能直接click。所以如果要點擊需要取數組的值,比如下面是點擊找到的第一個元素driver.find_elements_by_android_uiautomator("new UiSelector().text(\"+關注\")")[0].click()  通過css_selector定位(webview)只適用於webview的html頁面,繼承自webdriver,與pc版本的UI測試一致driver.find_element_by_css_selector()  通過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()   2.定位元素的另一種寫法: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,"ag2") 這個操作的好處是可以直接把操作的by和value放到一個元組裡,然後調用通用方法來傳參獲得元素結果cateid=(By.ID,"ag2")driver.find_element(*cateid).click()  by的操作可以是:By.ID   相當於by_idBy.CLASS_NAME  相當於by_class_nameBy.XPATH   相當於by_xpathBy.NAME   相當於by_nameBy.TAG_NAME   相當於by_tag_nameBy.CSS_SELECTOR  相當於by_css_selectorBy.LINK_TEXT  相當於by_link_text   3.find_elements_by_定位方式(value)返回元素數組用法與find_element_by_方式(value)一致,但是返回一個數組。可以通過數組的索引來訪問具體的某個結果 例如:通過class_name定位到多個元素,我想點擊第一個元素driver.find_elements_by_class_name("android.widget.RelativeLayout )[0].click()  4.返回元素數組的另一種寫法: find_elements(by,value)用法與find_element(by,value)一致,但是返回一個數組。可以通過數組的索引來訪問具體的某個結果 例如:通過class_name定位到多個元素,我想點擊第一個元素driver.find_elements(By.CLASS_NAME,"android.widget.RelativeLayout )[0].click()  5.通過元素定位元素可以先找到某個元素,然後再進一步定位元素find_element_by_class_xpath(“xxx”).find_element_by_name(“yyy")   三、元素操作 找到元素後可以對元素進行的操作,例如上面講的進一步定位元素  1.click()//點擊操作也可以用tab實現點擊操作driver.find_element_by_id("com.wuba.zhuanzhuan:id/ae8").click()  2.clear()//清空輸入框內容driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").clear()  3.send(xx)//輸入框內輸入內容driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").send_keys("test content")  4.text//獲得元素的text內容print(driver.find_element_by_xpath(" //android.widget.LinearLayout[1]//xxx").text)   四、觸摸操作  1.driver.tap([座標],持續點擊時間)除了定位到元素的點擊外,也可以通過tab實現座標的點擊driver.tap(driver.tap([(216,1776)],2))  2.TouchAction(driver)TouchAction對象包含(tab)、press(短按)、move_to(滑動到某個座標)等方法 通過TouchAction對象,添加tap、move_to等操作,然後perform()執行,可以實現解鎖螢幕等功能 規範中的可用事件有: * 短按 (press)
 * 釋放 (release)
 * 移動到 (moveTo)
 * 點擊 (tap)
 * 等待 (wait)
 * 長按 (longPress)
 * 取消 (cancel) * 執行 (perform)  例如:一個多次滑屏的例子:action=TouchAction(driver)action.press(x=220,y=700).move_to(x=840, y=700).move_to(x=220, y=1530).move_to(x=840, y=1530).release().perform()可以通過wait()等待操作  3.MultiAction()//多點觸控通過MultiAction().add()添加多個TouchAction操作,最後調用perform()一起執行這些操作action0 = TouchAction().tap(el)action1 = TouchAction().tap(el)MultiAction().add(action0).add(action1).perform()  4.driver.swipe(x1, y1, x2, y2,duration)   //從座標(x1,x2)滑動到座標(x2,y2),duration非必填項,滑動時間(滑動的座標不能超過螢幕的寬高)可以通過【driver.get_window_size()】命令獲得視窗高和寬,結果為{‘width‘: 1080, ‘height‘: 1776} 一個滑鼠向上下左右活動的例子如下:#獲得螢幕大小寬和高
def getSize(driver):
    x = driver.get_window_size()[‘width‘]
    y = driver.get_window_size()[‘height‘]
    return (x, y)

#螢幕向上滑動
def swipeUp(driver,t=1000):
    l = getSize(driver)
    x1 = int(l[0] * 0.5)    #x座標
    y1 = int(l[1] * 0.75)   #起始y座標
    y2 = int(l[1] * 0.25)   #終點y座標
    driver.swipe(x1, y1, x1, y2,t)

#螢幕向下滑動
def swipeDown(driver,t=1000):
    l = getSize(driver)
    x1 = int(l[0] * 0.5)  #x座標
    y1 = int(l[1] * 0.25)   #起始y座標
    y2 = int(l[1] * 0.75)   #終點y座標
    driver.swipe(x1, y1, x1, y2,t)
#螢幕向左滑動
def swipLeft(driver,t):
    l=getSize(driver)
    x1=int(l[0]*0.75)
    y1=int(l[1]*0.5)
    x2=int(l[0]*0.05)
    driver.swipe(x1,y1,x2,y1,t)
#螢幕向右滑動
def swipRight(driver,t=1000):
    l=getSize(driver)
    x1=int(l[0]*0.05)
    y1=int(l[1]*0.5)
    x2=int(l[0]*0.75)    driver.swipe(x1,y1,x2,y1,t) #調用向下滑動的方法swipeDown(driver)   五、系統按鍵事件   press_keycode(AndroidKeyCode)//發送按鍵事件例如:點擊home鍵,home鍵的KeyCode是3driver.press_keycode(3)  鍵名                  描述       索引值
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可以查看下面的部落格:http://blog.csdn.net/crisschan/article/details/50419963   六、driver的一些比較重要操作  1.reset()//重設app這時候driver會重設,相當於卸載重裝應用。所以本機快取會失效driver.reset()  2.start_activity(包名,activity名)//啟動app的某一個activity例如:driver.start_activity("com.wuba.zhuanzhuan","./presentation.view.activity.LaunchActivity") 啟動一個activity,這個activity必須是AndroidManifest.xml中有intent-filter的activity<intent-filter>    <action android:name="android.intent.action.MAIN"/>   <category android:name="android.intent.category.LAUNCHER"/></intent-filter> 這種啟動activity和driver的reset()不同的是  3.contexts//獲得所有contextsdriver.contexts 結果如下:[‘NATIVE_APP‘, ‘WEBVIEW_com.android.browser‘] NATIVE_APP:native的contextWEBVIEW_com.android.browser:webview的context,存放html的容器  4.current_context//查看當前的contextdriver.current_context  5.switch_to.context(context名)//切換contextdriver.switch_to.context("WEBVIEW_com.wuba.zhuanzhuan") NATIVE時不能定位WEBVIEW的內容,在WEBVIEW的context時不能定位NATIVE的內容。所以需要切換到對應的context中去進行操作  6.setNetworkConnection(bitmask掩碼)//設定網路類型例如:設定網路類型為只開wifidriver.set_network_connection(2)  網路的bitmask掩碼如下:| 值 (別名)           | 資料連線 | Wifi 串連 | 飛航模式 || ------------------ | ---- | ---- | ------------- || 0 (什麼都沒有)       | 0    | 0    | 0 || 1 (飛航模式)         | 0    | 0    | 1 || 2 (只有Wifi)        | 0    | 1    | 0 || 4 (只有資料連線)     | 1    | 0    | 0 || 6 (開啟所有網路)     | 1    | 1    | 0 |   7.scroll(起始元素,結束元素)driver.scroll(origin_el,destination_el)  8.獲得當前頁面的所有元素driver.page_source 這可以用來判斷元素是否存在,例如 assert "發布成功" in driver.page_source)  9.補充一些driver啟動時可能用到的項其實這些在上一篇啟動裡都有介紹,但是有些可能大家沒注意到的點再列一下。這些點也是我在測試中實際遇到的點  autoLaunch :Appium是否要自動啟動或安裝app,預設truedesired_caps[‘autoLaunch‘] = ‘false‘有的時候我不想讓appium每次都啟動app,想自己去啟動activity,那這個項這時就可以起作用了  noReset:在會話前是否重設app狀態。預設是falsedesired_caps[‘noReset‘] = ‘true‘   newCommandTimeout:設定未接收到新命令的逾時時間,預設60s如果60s內沒有接收到新命令,appium會自動中斷連線,如果我需要很長時間做driver之外的操作,可能延長接收新命令的逾時時間desired_caps["newCommandTimeout"]=1800 本文轉自:https://www.cnblogs.com/meitian/p/6103391.html

Android定位元素與操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.