Appium+Python-元素定位(常用定位)


  前面已經介紹了環境搭建和入門實例,為了更深入的學習,需要熟練掌握各種元素定位方法,以便於應用到具體的實例場景,本章主要涉及到的內容有;

  • find_element_by_id

  • find_element_by_class_name

  • find_element_by_accessibility_id
  • find_element_by_xpath

  • find_element_by_android_uiautomator

  • driver.tap

一、通過id定位元素(find_element_by_id)

  對應的字段是resrouce-id,一般會優先用id定位,但id有時候並不唯一,使用前要判斷下id是否唯一,如圖1
# id定位到首頁
driver.find_element_by_id("com.taobao.taobao:id/iv_image").click()  

(圖1:id定位到首頁)

二、通過ClassName定位元素(find_element_by_class_name)

   對應的字段是class,clsaa屬性決定了界面元素的類型,如果要查找某種類型的界面元素,且該類型界面元素在當前界面中只有一個,則可以使用此方法,但是by_class_name使用頻率不是很高,因為很容易出現多個元素的class是一樣的一。如圖2

# class定位到輸入框
driver.find_element_by_class_name("android.widget.EditText").click() 

(圖2:class定位到輸入框)

三、通過content-desc定位元素(find_element_by_accessibility_id)

  對應的字段是content-desc,content-desc屬性是用來描述該元素的作用,如果要查詢的界面元素的content-desc在當前界面唯一,則可以使用此方法,大部分情況下,該字段為空,如圖3

# content-desc定位到搜索按鈕
driver.find_element_by_accessibility_id('搜索').click()  

(圖3:content-desc定位到搜索按鈕)

四、通過xpath定位元素(find_element_by_xpath)

  當以上方法都無法定位到具體元素時,可以采用xpath方法定位元素,xpath有點強大,這里就不一一貼圖了,比較特殊的場景會適當貼圖。

1、如果元素text是唯一的,可以通過text文本定位

#當頁面的text判斷出是唯一
driver.find_element_by_xpath("//*[@text='評價']").click()

2、如果元素id是唯一的,也可以id屬性定位

# id定位確定
driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/confirm_text']").click() 

3、通過text和id聯合定位

# id和text組合定位到評價頁
driver.find_element_by_xpth("//*[@resource-id='com.taobao.taobao:id/taodetail_nav_bar_tab_text'][@text='評價']").click()

4、class屬性唯一的話,同樣可以通過class屬性定位,有兩種方法

# 第1種方法
driver.find_element_by_xpath("//android.widget.EditText").click()

# 第2種方法
driver.find_element_by_xpath("//*[@class='android.widget.EditText']").click()

5、通過content-desc屬性定位,contains是模糊匹配的定位方法,對於一個元素的id或者text不是固定的,但有一部分是固定的,這種就可以模糊匹配。

# 第1種:匹配text,模糊定位到寶貝評價
driver.find_element_by_xpath("//*[contains(@text,'寶貝評價')]").click()

# 第2種:匹配content-desc,模糊定位到返回
driver.find_element_by_xpath("//*[contains(@content-desc,'返回')]").click()

# 第3種:匹配class,模糊定位到輸入框
driver.find_element_by_xpath("//*[contains(@class, 'android.widget.EditText')]").click()

# 第4種:匹配到id,模糊定位到輸入框
driver.find_element_by_xpath("//*[contains(@resource-id, 'com.taobao.taobao:id/searchEdit')]").click()

6、組合定位

如果一個元素有2個屬性,通過xpath也可以同時匹配2個屬性,text, resource-id,class ,index,content-desc這些屬性都能任意組合定位

# id和class屬性   定位搜索框
id_class = '//android.widget.EditText[@resource-id="com.taobao.taobao:id/home_searchedit"]'
driver.find_element_by_xpath(id_class).click()# text和index屬性  定位登錄/注冊
desc_class = '//*[@text="注冊/登錄" and @index="1"]'
driver.find_element_by_xpath(desc_class).click()# class和text屬性  定位輸入手機號
class_text = '//android.widget.EditText[@text="請輸入手機號碼"]'
driver.find_element_by_xpath(class_text).send_keys("512200893")# class和desc  定位幫助
id_desc = '//*[contains(@resource-id, "aliuser_menu_item_help") and @content-desc="幫助"]'
driver.find_element_by_xpath(id_desc).click()

7、層級定位

1)如果一個元素,它除了class屬性(class屬性肯定會有),其它屬性啥都沒有,這種情況用上面方法就不適用了,這個時候可以找他父元素,通過父親定位兒子

#如果一個父元素下,有多個相同class的兒子時候,可以通過xpath的索引去取對應第幾個,xpath是從1開始數的
loc_class='//*[@resource-id="com.taobao.taobao:id/libsf_srp_header_list_recycler"]/android.widget.RelativeLayout[2]'
driver.find_element_by_xpath(loc_class).click()

2)相反的,也可以通過兒子定位父親

# 通過子元素定位父元素
# 方法一: ..
sun_fa1 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/..'
c = driver.find_element_by_xpath(sun_fa1).tag_name
print(c)

# 方法二  parent::*
sun_fa2 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/parent::*'
d = driver.find_element_by_xpath(sun_fa1).tag_name
print(d)

# 方法三 parent::android.widget.LinearLayout
sun_fa3 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/parent::android.widget.LinearLayout'
e = driver.find_element_by_xpath(sun_fa1).tag_name
print(e)

3)通過子元素,先找到父元素,再找父元素下的子元素,同樣可以進行兄弟元素定位,如圖4、圖5

# 用法一:兄弟元素//android.widget.Button[@text='一鍵操作'],通過兄弟元素定位自己(篩選功能)android.widget.Button
driver.find_element_by_xpath("//android.widget.Button[@text='一鍵操作']/../android.widget.Button").click()

 

 

(圖4:兄弟元素定位,因為淘寶沒有合適的例子,截圖的應用是企業微信的應用)

# 用法二:根據兄弟元素定位到自己,再往下找
 driver.find_element_by_xpath("//android.view.View[contains(@text,'地址')]/../android.view.View/android.widget.Image").click()

(圖5:用法二的兄弟元素定位)

4)通過層級關系,一層一層的往下找,同樣可以通過爺爺元素,定位到孫子元素,如圖6

#爺爺元素id:container---第二個android.view.View兒子---第一個孫子android.view.View
driver.find_element_by_xpath("//*[@resource-id='container']/android.view.View[2]/android.view.View[1]").click()

 

(圖6:爺爺元素定位到孫子元素)

五、通過AndroidUiAutomator定位元素(find_element_by_android_uiautomator)

  AndroidUIAutomator是一個強有力的元素定位方式,它是通過Android UIAutomator類庫去找元素,可以選擇id、name、className作為傳入的字符串。有很多用法,類似xpath,也不一一貼圖了。

1、通過id定位

# 通過id定位到商品
ui_id='new UiSelector().resourceId("com.taobao.taobao:id/goodsimage")'
driver.find_element_by_android_uiautomator(ui_id).click()

2、通過text定位

# 通過text定位加入購物車按鈕
ui_text='new UiSelector().text("加入購物車")'
driver.find_element_by_android_uiautomator(ui_text).click()

3、通過class定位,如圖7

#classname 復數定位,通過class定位某個商品
ui_class='new UiSelector().className("android.widget.RelativeLayout")' 
driver.find_element_by_android_uiautomator(ui_class[1]).click()

 

(圖7:class復數定位)

4、組合定位,一般組合用id,class,text這三個屬性

# 第1種:id和text組合定位到加入購物車
id_text='resourceId("com.taobao.taobao:id/detail_main_sys_button").text("加入購物車")'
driver.find_element_by_android_uiautomator(id_text).click()

# 第2種:class和text組合定位到加入購物車
class_text = 'className("android.widget.TextView").text("加入購物車")'
driver.find_element_by_android_uiautomator(class_text).click()

5、description也是用contenet-des屬性定位

# 通過content-desc定位到返回
ui_content_desc='new UiSelector().description("返回")' 
driver.find_element_by_android_uiautomator(ui_content_desc)

6、父子定位childSelector,有時候不能直接定位某個元素,但是它的父元素很好定位,這時候就先定位父元素,通過父元素找兒子

#父子關系childSelector
son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小說"))'
driver.find_element_by_android_uiautomator(son).click()

6、兄弟定位fromParent,有時候父元素不好定位,但是跟他相鄰的兄弟元素很好定位,這時候就可以通過兄弟元素,找到同一父級元素下的子元素

#兄弟關系fromParent
brother = 'resourceId("com.baidu.yuedu:id/lefttitle").fromParent(text("圖書"))'
driver.find_element_by_android_uiautomator(brother).click()

六、通過tap定位元素(driver.tap)

  tap(self, positions, duration=None):模擬手指點擊(最多五個手指),可設置按住時間長度(毫秒),如圖8

- positions - list類型,里面對象是元組,最多五個。如:[(100, 20), (100, 60)]
    
- duration - 持續時間,單位毫秒,如:500
# tap坐標方式定位到運動
driver.tap([(720,72),(1080,216)],500)

 (圖8:tap定位)

 

  好了,元素定位就講完啦,下一節請期待....

 


免責聲明!

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



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