今天给各位分享appium定位不到元素的知识,其中也会对appium定位不到元素的原因进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、appium+python+android,运行登录代码时报错 :无法使用给定的搜索参数在页面上找到元素
- 2、appium使用xpath定位元素并点击,为什么查找不到元素呢
- 3、python-appium提示无法定位元素,添加uiautomator2后运行报错
- 4、appium findelementsbyid怎么定位不到元素的
- 5、Appium《元素定位和UiAutomator表达式》
- 6、appium v1.13.0使用问题记录
appium+python+android,运行登录代码时报错 :无法使用给定的搜索参数在页面上找到元素
解决问题
问题描述:Eclipse下缺少org.eclipse.jdt.junit相关的插件,造成用junit运行测试用例的时候,报空指针的错误!!!
网上查看了一下JDT相关的东西,发现中能是我这个Eclipse下载的是ADT版本的,当时用来做Appium python版和Robotium的测试的。这个版本的Eclipse没有SDK。于是去网上下载了一个eclipse-jee-luna-SR1-win32-x86_64,解压后,再按Appium java环境搭建的方法配置了一下,写了个Demo再次运行,成功!!
顺便,android提供的的eclipes无法使用junit4,也需要重新下载。望采纳。
appium使用xpath定位元素并点击,为什么查找不到元素呢
这样定位会报错。xpath是按照树的层级一层一层识别元素。在uiautomatorviewer,识别到的元素前缀都是从0开始,而转换成xpath,是需要从1开始的,类似第一个层级,第二个层级
driver.findElementByXPath(
"//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.EditText[1]");
改写下定位元素到1,继续调试下
python-appium提示无法定位元素,添加uiautomator2后运行报错
首先 npm install appium-uiautomator2-driver 目前装的是最新版2.37 但是发现与android 的chrome不匹配 然后就下载了 2.36的
chromedriver 版本对应关系 url
然后再次运行 果然又报错 那就继续找原因
appium findelementsbyid怎么定位不到元素的
安卓设备没有找到适合的方法,尝试用Appium Inspector,但是使用了当前最新的“AppiumForWindows-1.2.3.1”没有看到这个属性,且Inspector在Windows下面非常的不稳定,很容易crash。真心期望Appium团队尽快解决这个问题
iOS设备倒可以用Appium Inspector获得
个人建议可以尝试先用view显示的文本作为name看是否能拿到该控件,按照我个人的经验一般都是会成功的,所以我很怀疑安卓上面控件的name是否就等于text。如果确实还是不行的话就只好放弃用name了。或者等待Appium后来的稳定的inspector发布后看是否可以获得控件的name。喎�"" target="_blank" class="keylink"vcD4KPHA+1eK49re9t6jU2kFwcGl1bTEuMNauuvPG5Mq10tG+rbn9yrG2+NKqsbtmaW5kRWxlbWVudEJ5QWNjZXNzaWJpbGl0eUlkyKG0+rXDwcujrLK71qq1wM6qyrLDtLu5xNy199PDo6yyws/rysdBcHBpdW3NxbbTz+uxo8H00ru2qLXEvObI3dDU0tTGvbusuf22yLDJoaPH67Lpv7Sjumh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2Jsb2IvbWFzdGVyL2RvY3MvZW4vYWR2YW5jZWQtY29uY2VwdHMvbWlncmF0aW5nLXRvLTEtMC5tZDwvcD4KPGgxPjIuIGZpbmRFbGVtZW50QnlBbmRyb2lkVUlBdXRvbWF0b3I8L2gxPgo8aDI+Mi4xIMq+wP08L2gyPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;" el = driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")"); assertThat(el.getText(),equalTo("Add note"));
Appium《元素定位和UiAutomator表达式》
一、常见属性的用法
二、通过截图就可以看到元素的属性,那怎么元素定位呢?
三、问题
xpath 相对定位:如果相对定位中这个元素是有 id 的,这个 id 是唯一的,xpath 定位中优先通过 id 来定位。
class 属性对应的值是元素类型(是一个文本视图工具),Web 自动化中元素类型代表 Input、image、button 这样的标签名。
「resource-id 是唯一的,但是在 App 页面中并不绝对唯一。大部分情况下是唯一的,小部分情况下是重复的。」
如果一个页面中,元素的样式非常像,那很有可能它们的 id 就是一样的。UIAutomator Viewer 这个自带的工具是不能看出这个 id 是不是绝对唯一的。
「假设 resource-id 是唯一的,用相对定位这样定位:」
和 Web 自动化一样的玩法: 元素类型[@属性名称=属性值]
这里的 class 不是 Web 网页中的 class 属性了,这里代表它的标签名和元素类型(它是一个图片、一个文字、链接还是一个按钮呢?学会区分)。
如果 resource-id 不是唯一的,那么上面那个表达式是不够的,还会追加到上层的 Linearlayout 、 RelativeLayout 、包括祖先里面的一些层级都会放进来。
如果没有安装“升级 uiaumatorview-添加元素定位”就只能靠自己来判断。看下其它和它长得很像、元素的格式、风格、样式、页面布局都和它一模一样的元素,看下各位的 id 是否全都是一样的。
如果用了“升级 uiaumatorview-添加元素定位”,可以根据它的表达式自己来判断。
任何一个元素一定会有个 class,因为它是一个类别。Linearlayout 是一样的,布局也是安卓的控件,所以也会有控件名称、控件类型。
以下这些东西只有 2 个值,False 和 True。
以上这些属性在很多情况下是没有用的,但是在关键的时刻是很有用的。
例如想筛选当前页面中可以滚动的元素,通过 scrollable 等于 True 来过滤。
和 Web 自动化一样的,都是通过元素属性来定位,而且比 Web 自动化简单。
App 中只支持 5 种元素定位方式。虽然继承了 Web 自动化的元素定位,它之所以继承呢,是用到了其中的一个部分。
1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 AccessibilityId 定位:content-desc
4、通过 AndroidUiAutomator 定位
5、通过 xpath 定位
1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 xpath 定位
有 find_element_by_id() 就有 find_elements_by_id()
可以找到多个,它的返回值一样是列表。它的返回对象一样是 Web element 。
在它的下面有个 find_element_by_id() 。它的方法和 Web 自动化是一样的。
虽然这里代表的是元素类型,但它同样是 class 属性。
这里有点区别,但是方法名还是没有区别的。这个 class 的属性其实没有多大用处,一个页面中肯定很多属性的值和它很像的。所以这种用法不多。
既然是类别,图片可能有好多种,输入框也有好多种,它代表的是一种元素的类型。
「Web 自动化中 xpath 定位是最常用的,但是 App 自动化中 xpath 是最不想用的。原因是它的效率太低了。」
「如果全部只用 xpath 定位,问题会比较大,能不用 xpath 就不用 xpath」 。
AccessibilityId 是移动端特有的定位方式。
这是之前看到的类,这个类当中除了继承了 Web 自动化之外,对于安卓有 2 种,其中一种是 ACCESSIBILITY_ID 。
如果通过这种方式定位,对应的方式就是:
此处应输入 content-desc 的值,但是这里是空的,所以不能通过它定位。
但是 find_element_by_accessibility_id() 是另外一种 id,代表它在当前这个页面中也是很独特的。只要它有值,基本上可以通过它来定位。
用的是安卓 UiAutomator 这个自动化框架中提供的元素定位方式。所以想用这种元素定位方式,就必须了解它到底是怎么做的。
UiAutomator 自动化库是 Java 语言写的,所以它的参数是 Java 代码。UiAutomator 自动化库提供了 text。而 「元素有文本内容就可以通过文本内容来定位。」
这个里面的参数就必须是 UiAutomator 当中提供的定位方式。UiAutomator 是 Java 实现的,那么它的定位类型肯定也是 Java 实现的。
UiAutomator 去定位元素的时候用的 UiSelector 类。Api 的官方文档:
Appium 中通过 driver.find_element 来找元素的,找到的结果对象是一个 WebEmemt 。
「但是括号里面,不同的定位类型你要输入不同的定位表达式。」
通过 UiSelector 找到元素,这是表达式。总有一个方法通过它来找吧?
那就是 UiObject。UiObject 对应到 WebEmemt。WebEmemt 有对元素的各种操作以及属性的获取。 「UiObject 就是 WebEmemt,有各种对元素的操作。」
通过 UiObject 对元素进行输入、点击等操作。
UiAutomator 是它自己的框架,所以对应的做了一套东西。UiSelector 这个类是用来表达元素定位的。UiAutomator 这里的参数就是 UiSelector 类定位表达式。
Public constructors 公共的构造函数,构造函数就是初始化函数。类初始化的时候,有时候 init 是有参数的,构建函数当中就告诉了你它有没有参数。
有的时候并不用一个变量去接收它。在 Web 自动化当中,直接 实例名称.方法 就可以了。
事实上只有一个变量,叫做 val。
清一色的返回值基本都是类本身。
如果是一个实例化对象,那它的返回值都是实例化对象。每一个实例化对象都可以有这么多方法。
.checkable(true) 返回值就是 new UiSelector() 。接下来可以通过别的方式组合起来。
「多种条件组合起来对元素进行定位。有些元素的 id 不是唯一的,但是文本是唯一的。可以纯粹通过文本,也可以 id 和文本一起定位。」
「人家这里是“字符串”,在 Java 中单引号和双引号是有区别的。如果在 Java 中是字符串,只能用双引号,不然就是报错。」
new UiSelector().checkable(true).resourceId(“保密”)
通过 2 个属性来定位的,一个是 checkable()。
一个是 resourceId()。两者都要满足才能符合我的定位表达。
匹配到正则表达式的元素也可以。
textstartswith:以什么开头的一个字符串。
如果你的文本很长,可以定义以什么开头,也可以实现部分匹配。只不过这个部分匹配是有要求的,必须以什么开头。
这 4 种方式都可以用的,参数全是字符串。
除了 text 是文本性质的,content-desc 也是文本性质的。
className:匹配一个控件的类型。
控件类型也属于控件的属性。大家都叫做控件,但是你叫这个名字,我叫那个名字。
UiAutomator 自动化库提供了各种属性。只要学会表达式,然后能自己判断用什么样的类型来定位就好了。
使用 UiAutomator 中的 UiSelector 类来处理元素定位。
new UiSelector().函数名称(“定位表达式”)
字符串是双引号,布尔值就不是双引号了。
实际上只通过 text 定位就可以了。除了它叫做”我的“,这个页面也没有别人叫做”我的“了。
「如果通过 id 定位、ClassName 定位、AccessibilityId 定位这前 3 种方式都没有让你唯一定位到元素,那就用第 4 种呀!」
第 4 种其实效率很高的,因为是人家框架自己的定位方式呀,都不需要转换。第 5 种 xpath 定位,写法其实和 Web 自动化的 xpath 定位的写法一样。xpath 能干的事,第 4 种方式就能全部搞定了。
以上 5 种都搞不定的情况下,就需要用坐标了。但是坐标不太稳定,除非实在没有办法了才用坐标,坐标比 xpath 还差劲。
一般的 app 都有 id,如果你测得 app 没有 id,那就去给开发提意见,把 id 加上。
app 自动化相对来说比较简单。如果把“uiaumatorview 升级版”装上了,所有的定位表达式就直接拷贝就好了。
「不需要调试也不需要考虑上下级关系,如果是比较规范的 app,通过 id 来定位就可以了。」
和 Web 自动化的写法一样。4 大属性都一样(点击、输入、获取元素的文本内容、获取元素的属性)。函数名称一样,操作方式也一样。需要等待,等待方法也和 Web 自动化一样。
一对(或一个)标签包含的范围:其实可以理解为元素为一个容器,而这容器里面包含了标签。
这里的一对标签: 就是开始和结束标签。
范围:就是从开始标签 到结束标签 下面那个矩形框架就是这里的范围。
Appium 的 bug 比较多,需要换个版本试下,不要装太老的或者最新的。隔 2-3 个版本换个试下。和操作系统也有关系,有时 win7 不行,win10 就可以。
在 cmd 命令行中启动 uiautomatorviewer.exe,命令行有的时候可以看出来是什么错误导致。一般是有冲突。还有看看你的安装包装全了没有,比如 jdk、环境变量有没有配置正确之类的。
appium v1.13.0使用问题记录
1.Command 'E\:\\Development\\Android\\SDK\\platform-tools\\adb.exe -P 5037 -s 127.0.0.1\:62001 shell getprop ro.build.version.release' exited with code 3221226356'; Stderr: ''; Code: '3221226356
原因:adb版本问题,在cmd执行adb version命令发现adb的版本为29.0.0-XXXX
解决方法:升级adb版本,可通过Android studiotoolssdk managerAppearanceBehavior System Setting Android SDKSDK tools升级Android SDK Platform-Tools 到29.0.2,adb版本即升级成功,问题解决
2.页面从首页切换到第二个页面后,无法定位元素,使用self.driver.page_source方法获取页面信息无反应。使用XPATH="//*"查找元素。发现得到的元素是首页的元素
原因:Android 7.0切换Activity的bug,需要使用UiAutomator2测试
解决方法:self.desired_caps['automationName'] ='UiAutomator2'
3.切换UiAutomator2后,adb.exe -P 5037 -s 1d6f926c shell pm install /data/local/tmp/appium_cache/56abf1bf10f6562619a2dd8fb060718e27c4cb28.apk命令执行失败
原因:手动在cmd执行命令,返回Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.uiautomator2.server without first uninstalling],但实际上手机上找不到该apk。使用adb shell pm list packages 发现package: io.appium.uiautomator2.server
解决方法:手动执行adb uninstall package: io.appium.uiautomator2.server卸载
appium定位不到元素的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于appium定位不到元素的原因、appium定位不到元素的信息别忘了在本站进行查找喔。
2、本站永久网址:https://www.yuanmacun.com
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
源码村资源网 » appium定位不到元素(appium定位不到元素的原因)