Appium新版本遇到的问题,不能通过 name 去定位元素抛 Message: Locator Strategy 'name' is not supported for this session
环境:
1、Appium: 1.15.1
2、Python: 3.7.0
3、Selenium: 3.141.0
4、IDE: Pycharm
5、PC:Windows 10
问题:在 Pycharm 中输入 driver.find_element_by_后可以直接联想出name这个,然后就通过这个name属性去定位界面元素,在运行时居然报 "Locator Strategy 'name' is not supported for this session",从这个错误来看,显然可以看出不是selenium的锅,要不然 pycharm 也不可能联想出来,那么这个很可能是 appium 不支持这个属性了,据说是从appium 1.5版本之后就不支持这个了,为了验证这个观点,到这个目录下:C:\Program Files\Appium\resources\app\node_modules\appium\node_modules\appium-android-driver\build\lib 找到 driver.js 打开如下,看到没它只支持下面五种属性
1 2 3 4 5 6 7 8 9 | class AndroidDriver extends _appiumBaseDriver.BaseDriver { constructor(opts = {}, shouldValidateCaps = true ) { super (opts, shouldValidateCaps); this .locatorStrategies = [ 'xpath' , 'id' , 'class name' , 'accessibility id' , '-android uiautomator' ]; this .desiredCapConstraints = _desiredCaps. default ; this .sessionChromedrivers = {}; this .jwpProxyActive = false ; this .jwpProxyAvoid = _lodash. default .clone(NO_PROXY); this .settings = new _appiumBaseDriver.DeviceSettings({ |
那么如果一定要用name这个属性来进行元素定位的话,那么如何操作呢,下面介绍两种方法:
1、修改driver.js文件,添加name到locatorStrategies里去,经验证这种方法不可行,仍然报同样错误,显然通过简单的修改这个方式不太可行
1 2 3 4 5 6 7 8 9 | class AndroidDriver extends _appiumBaseDriver.BaseDriver { constructor(opts = {}, shouldValidateCaps = true ) { super (opts, shouldValidateCaps); this .locatorStrategies = [ 'xpath' , 'id' , 'class name' , 'accessibility id' , '-android uiautomator' , 'name' ]; this .desiredCapConstraints = _desiredCaps. default ; this .sessionChromedrivers = {}; this .jwpProxyActive = false ; this .jwpProxyAvoid = _lodash. default .clone(NO_PROXY); this .settings = new _appiumBaseDriver.DeviceSettings({ |
1 driver.find_element_by_name("Browsing").click()
2、通过find_element_by_android_uiautomator这个来进行元素定位,这个是基于uiautomator原生的来支持,这个肯定是会支持界面中所有支持的元素定位,直接上脚本,这个是可以正常跑通的。
1 # -*- coding:utf-8 -*- 2 3 import unittest 4 import time 5 from appium import webdriver 6 from selenium.webdriver.common.by import By 7 from selenium.webdriver.support.ui import WebDriverWait 8 from selenium.webdriver.support import expected_conditions as EC 9 10 server = 'http://localhost:4723/wd/hub' 11 desired_capabilities = { 12 'platformName': 'Android', 13 'deviceName': 'abcdefg1234', 14 'appPackage': 'com.sina.weibo', 15 'appActivity': 'com.sina.weibo.VisitorMainTabActivity', 16 'autoGrantPermissions': True 17 } 18 19 driver = webdriver.Remote(server, desired_capabilities) 20 21 time.sleep(30) 22 23 driver.find_element_by_android_uiautomator("new UiSelector().text(\"Browsing\")").click()
建议:以后在写适用appium自动化框架的脚本时,凡是不能通过这几个属性['xpath', 'id', 'class name', 'accessibility id']直接定位元素的,都直接用 '-android uiautomator' 这个属性来进行定位,其实大家也能发现,前面那几个属性在uiautomator里面是全部包括的(xpath除外),下面把这几个对应关系列举如下:
driver.find_element_by_id("com.sina.weibo:id/tv_title_lookaround").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().resourceId(\"com.sina.weibo:id/tv_title_lookaround\")").click()
driver.find_element_by_name("Browsing").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().text(\"Browsing\")").click()
driver.find_element_by_accessibility_id("Browsing").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().description(\"Browsing\")").click()
driver.find_element_by_class_name("android.widget.TextView").click() <==> driver.find_element_by_android_uiautomator("new UiSelector().className(\"android.widget.TextView\")").click()
注:以上四个对应关系并没有一个一个去验证,只是根据自己的理解写出来,有错误的地方还请各路英雄好汉指出,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-12-04 分包收集 android 运行的 logcat 日志
2018-12-04 python分包写入文件,写入固定字节内容,当包达到指定大小时继续写入新文件