最近在学习 appium + Python,在元素定位的时候用到了 xpath,心中充满疑惑,搜寻了很多资料还是没有完全明白,请大家帮忙答疑解惑,感谢!
前提:
想要打开手机中的设置 app,找到"语言和输入法",进入切换语言。但是设置中的列表元素,id 和 classname 都相同,所以想到使用 xpath。
疑问:
1. 相同元素在不同页面时,对应的 xpath 是不一样的吗? (比如设置中的 “语言和输入法”,上下滑动页面时,它会在页面的不同位置,它的 xpath 也会不同吗?如果不同,那在不同分辨率的手机上,元素就定位不到啦?这个不就和坐标定位一样了? 很是疑惑 )
2. 像这种 id 和 classname 都相同的元素,如何滑动页面,寻找到对应元素呢?之前有尝试过 text,但如果切换语言,对应的 text 也会改变
3. 如果运行过程中 app 发生了 crash,怎么发现并让代码继续执行呢? 难道要每执行一步,都写 try... except...吗?
暂时遇到这几个问题,已经纠结了很久了,感谢回答!
直接调用 setting,然后进入语言和输入法,再进行设置,这样的操作比较死,并且不同设备之间脚本复用度也不好,最好还是直接调用接口设置语言,XTest 有这样的接口可以直接调用,非常方便,感兴趣可以尝试一下。
对的,我也一直在疑问有没有直接设置语言的接口? 你说的 Xtest 我会去了解一下,谢谢你~
如截图,因为我的想法是找到"语言和输入法"这个元素并点击,所以要向下滑动屏幕。所以滑动屏幕的时候,元素就会在屏幕的不同位置。
因为系统支持的语言太多,每一次改变语言,"语言和输入法"都会被翻译成对应国家的语言,所以对每个 text 写用例有点麻烦~
我认为元素在不在当前屏幕范围没有关系,只要在当前控制器就没问题,你打开桌面就可以看到,可以检索到不在当前屏幕范围内的图标。这类情况下的查找元素,我觉得可以有两个方法,
如 1 中的图,它只显示当前页面元素的路径。所以滑动页面,元素的路径也会改变,xpath 也会改变吗? 我还是很疑惑
你说的两种方法,我有想过。但也是我在文中提问的,如何滑动页面,寻找到对应元素呢?
滑动界面,寻找对应元素?这些元素本身就是你提前预设好的把,你看元素前面的数字,就代表了位置,是不会跟着滑动改变的,建议你先去尝试一下
你可以用个 while 循环,flag="true" whiel(flag=="true"): try: driver.find_element_by_name("语言和设置") driver.find_element_by_name("语言和设置").click() flag="false" except: 滑动屏幕(这个具体我就不写了)
那你自己尝试下,一进入设置,“语言和输入法” 不在当前页面,那你先滑动下屏幕,比如滑动 900(更可靠有效的方法是先计算一个选项的高 H 所占多少像素,然后滑动多少个 H 就可见了,这样就不需要考虑不同手机的分辨率导致滑动相关的问题了)它就可见了,到时你再用 xpath(有可用 resourceId+index 定位),这种情况,就不应该考虑会有其他因素导致列表排序的不同了
手机端最好不要用 xpath 直接获取某一个元素,区别于 web 端的层级更明显。对于 id 或 class 一致的人建议用 find elements by 这样找出来的是一个集合,再通过遍历判断 value 值是你要的那个元素
对于崩溃问题 程序崩了 你见程序有自启动回到最后的界面吗?除非你做守护进程
class 和 id 是未改变,可是你说 “再通过遍历判断 value 值是你要的那个元素”,这时就用不了了啊,还请指教。
我说通过遍历判断 value 值去找元素思路,至于你目前碰到的情况因为你的 value 值是变的,那这时你在判断 value 时就不能只是一个条件了,需要写 or,判断中文 or 判断英文 只要一个 value 对上就是你要找的元素。
楼主找到更好的解决办法了吗?求指教