元素定位(调试环境:appium-server+inspector+模拟器)

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy as By

创建一个 UiAutomator2Options 对象

options = UiAutomator2Options()
options.platform_name = "Android"
options.platform_version = "5.1.1"
options.device_name = "127.0.0.1:62001"
options.app_package = "com.zhao.myreader"
options.app_activity = "com.zhao.myreader.ui.home.MainActivity" # adb shell dumpsys activity activities | findstr "ActivityRecord" | findstr "com.zhao.myreader"

url = "http://127.0.0.1:4723/wd/hub"

最新版本Appium-Python-Client

driver = webdriver.Remote(url, options=options)

driver即为会话对象

两种定位方式

一、属性定位
1、content_desc
driver.find_element(By.ACCESSIBILITY_ID, "书城").click()
2、class_name & tag_name
driver.find_element(By.CLASS_NAME, "android.widget.TextView")
3、resource-id(安卓)
driver.find_element(By.ID, "com.zhao.myreader:id/civ_avatar")
4、name(IOS)
driver.find_element(By.ID, "com.zhao.myreader:id/iv_search")

二、路径定位
1、xpath
1.1 绝对路径 app的默认顶层为hierarchy
"/hierarchy/android.widget.FrameLayout/android.widget.Linearlayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout"
上面的这个xpath定位方式的值,/为层级的标识符
层级的标识符之间的内容为标签名
注意事项:最后一个层级,没有标识符结尾
总结,上面的这种xpath定位方式,是绝对路径的定位方式;
1.2 使用适当的属性进行辅助
'//*[@resource-id="com.zhao.myreader:id/rl_common_title"]'
上面的xpath定位方式的值:
//表示忽略测层级关系
表示匹配所有的标签名
[]是一个辅助标识语其里面的内容,就为辅助的属性及其值的内内容
上面的内容等同于:'//android.widget.RelativeLayout[@resounrce-id="com.zhao.myreader:id/rl_common_title"]
多个属性加and
通过相对路径或者绝对路径然后加上属性信息进行过滤筛选

2、css selector 不建议使用(使用过程中下级标签名会被误认为css属性名,导致无法找到元素。)
'>android.widget.RelativeLayout[resource-id="com.zhao.myreader:id/rl_common_title"]'
css selector中,">"为层级标识符
然后在cssselector属性过滤中,不需要@符号;
css selector中class的属性值,为css属性名,可以不通过[classs="abc"],可以表示为".abc";在class的属性值中,如
果存在空格即表示class的属性值为多个css属性名(class="abc abb adc"),通不过csselector表示可以为:
abc.abb.add
css selector中id的属性值,可以不通过[id="edf"],可以标识为"#edf";
总结:class属性的值,我们可以使用"."代替内部css的属性名,即代替[class="xxx"]的表达式;对于id属性,我们可以使用 # 代替[id="xx"]的表达式

三、 一些特殊情况 遇到定位时元素会出现多个
解决方法一: 直接用绝对路径
解决方法二: 元素内定位(找到你要定位的元素-》向上找-》找到拥有唯一或者特殊属性的元素,且还包裹着要定位的元素)
xpath = "//*[@resourceid='com.zhao.myreader:id/rv_book_list']/android.widget.LinearLayout"
ele= driver.find_elements(By.XPATH, xpath)
ele[1].find_element(By.ID, "com.zhao.myreader:id/tv_book_name")

四、元素操作
1、点击
driver.find_element(By.ID, "com.zhao.myreader:id/iv_search").click()
2、输入
driver.find_element(By.ID, "com.zhao.myreader:id/et_search_key").send_keys("ccftd")
3、获取文本
ele_text = driver.find_element(By.ID, "com.zhao.myreader:id/tv_book_desc").text
4、截图
value = "书城"
driver.find_element(By.ACCESSIBILITY_ID, f"{value}").screenshot(f"截图显示元素{value}.png")

五、appium系统操作
1、返回
driver.back()
2、滑动
driver.swipe(x1,y1,x2,y2)
3、截图
driver.save_screenshot("整体截图.png")

appium server 是作为⼀个服务存在;
appium inspector 是⼀个客户端,将命令发送给了 appium server,然后由appium
server 将命令转化为移动设备的操作命令,从⽽实现移动设备实现⾃动化操作;
Appium-python-client 也是⼀个客户端,我们运⾏Appium-Python-Client所⽣成的代
码时,其本质,也是将代码发送给了appium server,appiumserver 将命令转化为移
动设备的操作命令;从⽽实现移动设备实现⾃动化操作;

posted @   ccFTD  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示