🍎以最右App為例
.apk文件網盤地址:
鏈接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q
提取碼:0jqm
1.find_element_by_id / find_elements_by_id
# -*- coding:utf-8 -*-
# 作者:IT小學生蔡坨坨
# 時間:2020/12/18 22:00
import os
import unittest
import time
from appium import webdriver
class AndroidTests(unittest.TestCase):
def setUp(self):
""" 初始化 """
desired_caps = {} # 定義一個desired_caps字典
desired_caps['platformName'] = 'Android' # 平台名稱 Android或iOS
desired_caps['platformVersion'] = '10' # 系統版本號 設置->關於手機->Android版本 10
desired_caps['deviceName'] = 'Android Emulator' # 設備名稱,一般寫Android Emulator就行
desired_caps['noReset'] = 'True' # 不重置
# 獲取appPackage和appActivity
# 打開cmd
# 輸入adb shell dumpsys activity top | findstr "ACTIVITY"
# ACTIVITY cn.xiaochuankeji.tieba/.ui.base.SplashActivity 9df8d05 pid=27957
desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba' # app的包名,cn.xiaochuankeji.tieba
desired_caps['appActivity'] = '.ui.base.SplashActivity' # app首個活動界面,.ui.base.SplashActivity
# 輸入中文
# desired_caps['unicodeKeyboard'] = 'True' # 安裝appium自帶輸入法
# desired_caps['resetKeyboard'] = 'True' # 重置鍵盤,修改默認輸入法
# Appium REST http interface listener started on 0.0.0.0:4723
# Appium Server 地址及端口號
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def tearDown(self):
# self.driver.quit()
print("執行結束!")
def test_by_id(self):
self.driver.implicitly_wait(60)
# demo01: find_element_by_id,如果id相同,則默認定位第一個
# 場景:點擊關注按鈕,切換至關注頁面
ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/title")
print(ele.text)
ele.click()
time.sleep(2)
# demo02:
# 場景:點擊話題按鈕,切換到話題頁面
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/topic").click()
time.sleep(3)
# demo03:
# 場景:點擊×號,退出話題頁面,返回關注頁面
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ic_search_b").click()
time.sleep(2)
# demo04: find_elements_by_id
# 場景:點擊圖文按鈕,切換至圖文頁面
# 獲取所有di為cn.xiaochuankeji.tieba:id/title的控件
ele = self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/title")
# 通過一個循環,確認要定位的控件是第幾個
for i in range(0, len(ele)):
print("第" + str(i) + "個" + "是" + ele[i].text, end=" ") # 第0個是關注 第1個是推薦 第2個是視頻 第3個是圖文 執行結束!
# 點擊圖文,圖文控件的索引為3
ele[3].click()
# demo05:
# 場景:點擊第一條帖子的用戶頭像
self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/avatar_view_avatar")[0].click()
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
unittest.TextTestRunner(verbosity=2).run(suite)
2.find_element_by_class_name / find_elements_by_class_name
def test_by_class_name(self):
time.sleep(8)
self.driver.implicitly_wait(60)
# demo01:通過find_element_by_class_name定位TextView控件
# 若有多個class_name相同,則默認定位第一個
# 場景:點擊關注按鈕,切換至關注頁面
ele = self.driver.find_element_by_class_name('android.widget.TextView')
time.sleep(3)
print(ele.text)
# 點擊關注按鈕
ele.click()
time.sleep(5)
# demo02:通過find_elements_by_class_name定位TextView控件
# 場景:點擊圖文按鈕,切換到關注頁面
# find_elements_by_class_name找到所有TextView控件
ele = self.driver.find_elements_by_class_name('android.widget.TextView')
# 通過一個循環獲取控件的索引號
for i in range(0, len(ele)):
print("第" + str(i) + "個" + "是" + ele[i].text)
ele[3].click() # 點擊圖文
time.sleep(3)
"""
返回結果:
第0個是關注
第1個是推薦
第2個是視頻
第3個是圖文
......
執行完成!
"""
# demo03: 通過通過find_elements_by_class_name定位ImageView控件
# 場景:點擊話題圖標,進入話題頁面
self.driver.find_elements_by_class_name("android.widget.ImageView")[1].click()
time.sleep(2)
# demo04:
# 場景:點擊×號退出話題頁面
self.driver.find_elements_by_class_name("android.widget.ImageView")[2].click()
time.sleep(3)
# demo05: 通過find_elements_by_class_name定位View控件
# 場景:點擊查看第一條帖子的詳情
self.driver.find_elements_by_class_name("android.view.View")[2].click()
3.find_elements_by_xpath / find_element_by_xpath
def test_xpath(self):
time.sleep(8)
self.driver.implicitly_wait(60)
# demo01: xpath通過id定位單個元素
# 場景:定位關注按鈕,並點擊
self.driver.by_xpath(
"//android.widget.TextView[@resource-id='cn.xiaochuankeji.tieba:id/title']").click()
time.sleep(3)
# demo02: xpath通過id定位多個元素
# 定位話題按鈕,並點擊
# 盡量不要用find_elements_by_xpath,查找多個元素后還需要用索引定位
ele = self.driver.find_elements_by_xpath(
"//android.widget.ImageView[@resource-id='cn.xiaochuankeji.tieba:id/topic']")
ele[0].click()
time.sleep(2)
# demo03: xpath通過text文本定位,控件屬性android.widget.ImageView
# 點擊創建
self.driver.find_element_by_xpath("//android.widget.TextView[@text='創建']").click()
time.sleep(2)
# demo04: xpath通過text文本定位,無控件屬性
# 點擊關閉
self.driver.find_element_by_xpath("//*[@text='關閉']").click()
time.sleep(2)
# 返回到關注頁面
self.driver.keyevent(4)
# 點擊下方最中間的+號按鈕,進入話題編輯頁面
self.driver.find_elements_by_xpath(
'//android.widget.ImageView[@resource-id="cn.xiaochuankeji.tieba:id/iconTabItem"]')[2].click()
time.sleep(3)
# demo05: xpath通過class查找單個元素
# 點擊創建話題中的android.widget.EditText
self.driver.find_element_by_xpath("//*[@class='android.widget.EditText']")
# 按一次返回鍵隱藏鍵盤
self.driver.keyevent(4)
time.sleep(1)
# 再按一次返回鍵
self.driver.keyevent(4)
time.sleep(2)
# 點擊不保留
self.driver.find_element_by_xpath("//*[@text='不保留']").click()
time.sleep(2)
# demo06:
# 組合定位,多個屬性,用and定位
# 定位視頻按鈕,並點擊
self.driver.find_element_by_xpath("//*[@resource-id='cn.xiaochuankeji.tieba:id/title' and @text='視頻']").click()
time.sleep(2)
# demo07:
# 通過層級定位,父級找子級,只有一個子級
# 定位搜索按鈕
self.driver.find_element_by_xpath(
"//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView").click()
time.sleep(2)
self.driver.keyevent(4)
time.sleep(2)
# demo08:
# 通過層級關系,父級找子級,有多個子級,則需要加上索引,索引從1開始
self.driver.find_element_by_xpath(
"//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView[1]").click()
time.sleep(2)
self.driver.keyevent(4)
time.sleep(3)
# demo09:
# 子級定位父級
# 定位 圖文 按鈕
self.driver.find_element_by_xpath("//android.widget.TextView[@text='圖文']/..").click()
time.sleep(2)
# demo10:
# 定位最右按鈕上的文案信息,先找到父級的父級,再找到父級的兄弟級的子級
self.driver.find_element_by_xpath(
"//*[@text='最右']/../../android.view.ViewGroup[2]/android.widget.ImageView").click()