Appium 在 appium 使用 xpath,请问元素的 xpath 会改变吗?

memo · 2017年04月06日 · 最后由 Janet 回复于 2018年06月12日 · 2415 次阅读

最近在学习 appium + Python,在元素定位的时候用到了 xpath,心中充满疑惑,搜寻了很多资料还是没有完全明白,请大家帮忙答疑解惑,感谢!

前提:

想要打开手机中的设置 app,找到"语言和输入法",进入切换语言。但是设置中的列表元素,id 和 classname 都相同,所以想到使用 xpath。

疑问:

1. 相同元素在不同页面时,对应的 xpath 是不一样的吗? (比如设置中的 “语言和输入法”,上下滑动页面时,它会在页面的不同位置,它的 xpath 也会不同吗?如果不同,那在不同分辨率的手机上,元素就定位不到啦?这个不就和坐标定位一样了? 很是疑惑 😖 )

2. 像这种 id 和 classname 都相同的元素,如何滑动页面,寻找到对应元素呢?之前有尝试过 text,但如果切换语言,对应的 text 也会改变 😟

3. 如果运行过程中 app 发生了 crash,怎么发现并让代码继续执行呢? 难道要每执行一步,都写 try... except...吗?

暂时遇到这几个问题,已经纠结了很久了,感谢回答!

共收到 20 条回复 时间 点赞
匿名 #1 · 2017年04月06日

直接调用 setting,然后进入语言和输入法,再进行设置,这样的操作比较死,并且不同设备之间脚本复用度也不好,最好还是直接调用接口设置语言,XTest 有这样的接口可以直接调用,非常方便,感兴趣可以尝试一下。

  1. 相同元素在不同页面,这句话有歧义,从你的理解来说这个页面是不是在当前屏幕范围内,如果是这个定义,就算控件不在当前屏幕范围内,但是在当前控制器内,xpath 不会变动
  2. 你最好给个截图,id 被 classname 都相同的话再找其他方法吧,你提到了 text 会改变,不嫌麻烦的话可以对改变的 text 写用例
  3. appium 官方的示例里应该有相关的,每一个 Test 就算失败了也可以跑下一个
memo #19 · 2017年04月07日 Author

对的,我也一直在疑问有没有直接设置语言的接口? 你说的 Xtest 我会去了解一下,谢谢你~

memo #4 · 2017年04月07日 Author
fdeferf 回复
  1. 如截图,因为我的想法是找到"语言和输入法"这个元素并点击,所以要向下滑动屏幕。所以滑动屏幕的时候,元素就会在屏幕的不同位置。

  2. 因为系统支持的语言太多,每一次改变语言,"语言和输入法"都会被翻译成对应国家的语言,所以对每个 text 写用例有点麻烦~

memo 回复

我认为元素在不在当前屏幕范围没有关系,只要在当前控制器就没问题,你打开桌面就可以看到,可以检索到不在当前屏幕范围内的图标。这类情况下的查找元素,我觉得可以有两个方法,

  1. 取 classname 存到 List 中,再取 List 相应位置的元素
  2. 用 xpath
匿名 #6 · 2017年04月07日
memo 回复

不客气,有什么需要了解的可以直接回复,我们在做交流

memo #15 · 2017年04月07日 Author
fdeferf 回复

如 1 中的图,它只显示当前页面元素的路径。所以滑动页面,元素的路径也会改变,xpath 也会改变吗? 我还是很疑惑
你说的两种方法,我有想过。但也是我在文中提问的,如何滑动页面,寻找到对应元素呢?😟

memo 回复

滑动界面,寻找对应元素?这些元素本身就是你提前预设好的把,你看元素前面的数字,就代表了位置,是不会跟着滑动改变的,建议你先去尝试一下

memo #9 · 2017年04月07日 Author
fdeferf 回复

不太确定你说的是 index 吗? 我刚刚有附上新的截图,是不一样的

10楼 已删除

你可以用个 while 循环,flag="true" whiel(flag=="true"): try: driver.find_element_by_name("语言和设置") driver.find_element_by_name("语言和设置").click() flag="false" except: 滑动屏幕(这个具体我就不写了)

memo #10 · 2017年04月07日 Author
云敛晴空 回复

如我上面说的,“语言和输入法” 在切换语言后,它就被翻译成对应国家的语言了啊

memo 回复

那你自己尝试下,一进入设置,“语言和输入法” 不在当前页面,那你先滑动下屏幕,比如滑动 900(更可靠有效的方法是先计算一个选项的高 H 所占多少像素,然后滑动多少个 H 就可见了,这样就不需要考虑不同手机的分辨率导致滑动相关的问题了)它就可见了,到时你再用 xpath(有可用 resourceId+index 定位),这种情况,就不应该考虑会有其他因素导致列表排序的不同了

memo #8 · 2017年04月07日 Author
云敛晴空 回复

好的,谢谢! 只是好像在不同手机上,每一个选项的高 H 也是不一样的。 滑动的次数也会不一样

手机端最好不要用 xpath 直接获取某一个元素,区别于 web 端的层级更明显。对于 id 或 class 一致的人建议用 find elements by 这样找出来的是一个集合,再通过遍历判断 value 值是你要的那个元素

对于崩溃问题 程序崩了 你见程序有自启动回到最后的界面吗?除非你做守护进程

memo #17 · 2017年04月10日 Author
辣么丑 回复

你好,谢谢回复! 只是切换语言时 value 值会改变,所以才会想到说用 xpath。 能否解答一下我的疑问 1 ?

memo 回复

value 变了 class 和 id 又没变

memo #19 · 2017年04月11日 Author
辣么丑 回复

class 和 id 是未改变,可是你说 “再通过遍历判断 value 值是你要的那个元素”,这时就用不了了啊,还请指教。

memo 回复

我说通过遍历判断 value 值去找元素思路,至于你目前碰到的情况因为你的 value 值是变的,那这时你在判断 value 时就不能只是一个条件了,需要写 or,判断中文 or 判断英文 只要一个 value 对上就是你要找的元素。

楼主找到更好的解决办法了吗?求指教

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册