前面已經介紹了環境搭建和入門實例,為了更深入的學習,需要熟練掌握各種元素定位方法,以便於應用到具體的實例場景,本章主要涉及到的內容有;
-
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定位)
好了,元素定位就講完啦,下一節請期待....