Appium常用的3种元素定位方式
🍎以最右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()
本文作者:测试蔡坨坨
本文链接:https://www.cnblogs.com/caituotuo/p/14181992.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步