为什么 Android View Client 返回的视图高于我尝试 select 的视图?

Why is Android View Client returning the view above the view I'm trying to select?

(编辑:以下问题似乎只发生在我的三星 S10e 上。我刚回到家并尝试 Android 在 Pixel phone 上查看客户端,我没有遇到任何问题。 )

我正在为时差计算器 android 应用程序 Entrain. Using the culebra tool 自动输入过程,我可以在屏幕上找到每个视图。但是当我在视图上使用 ViewClient.touch() 方法时,程序会触及屏幕上紧靠其上方的视图。

例如,culebra 将这 2 个视图列为应用主菜单上的最后一个视图:

edu_umich_entrain___id_mainTableItem = vc.findViewWithTextOrRaise(u'Update Settings')
edu_umich_entrain___id_mainTableItem = vc.findViewWithTextOrRaise(u'Extras')

所以我写了这段代码来触摸 'Extras' 项:

vc = ViewClient(device, serialno)
vc.findViewWithTextOrRaise(u"Extras", root = 'ROOT').touch()

但它触及 'Update Settings' 视图。 (我触摸的任何其他视图也是如此。)

我尝试使用 findViewByIdOrRaise() 方法查找视图,但我得到了相同的结果。我试过 culebra GUI tool 但是当我点击 GUI 上的任何地方时它会冻结。

我编写了类似的脚本来自动化其他 android 应用程序(Lutron、IAquaLink、Ankidroid),它们都运行良好。

两个视图的坐标不重叠,正如 getCoords 显示的那样:

print(vc.findViewWithTextOrRaise(u'Update Settings').getCoords())
print(vc.findViewWithTextOrRaise(u'Extras').getCoords())

((195, 1380), (945, 1566))
((195, 1575), (945, 1761))

如果我计算并触摸 'Extras' 视图的中心:

coords = vc.findViewWithTextOrRaise(u'Extras').getCoords()
x = (coords[1][0] + coords[0][0]) / 2
y = (coords[1][1] + coords[0][1]) / 2
vc.touch(x, y)

它仍然触及更高的 'Update Settings' 视图。

如果我在中心点的y轴上加100,它最终会触及正确的视图。现在,我将这样做作为解决方法。

coords = vc.findViewWithTextOrRaise(u'Extras').getCoords()
x = (coords[1][0] + coords[0][0]) / 2
y = (coords[1][1] + coords[0][1]) / 2 + 100
vc.touch(x, y)

很遗憾,我没有三星 S10e 可以测试。

尽管如此,您可能会发现这些技巧很有用(我使用的是 Pixel)。

可以获取视图的边界运行

$ dump --bounds

例如

      android.widget.LinearLayout   ((0, 1210), (1080, 1381))
         android.widget.ImageView edu.umich.entrain:id/img  ((0, 1210), (171, 1381))
         android.widget.TextView edu.umich.entrain:id/mainTableItem Update Settings ((171, 1210), (827, 1362))
         android.widget.ImageView edu.umich.entrain:id/img2  ((827, 1210), (958, 1341))
      android.widget.LinearLayout   ((0, 1381), (1080, 1552))
         android.widget.ImageView edu.umich.entrain:id/img  ((0, 1381), (171, 1552))
         android.widget.TextView edu.umich.entrain:id/mainTableItem Extras ((171, 1381), (827, 1533))
         android.widget.ImageView edu.umich.entrain:id/img2  ((827, 1381), (958, 1512))

如果您想实际 单独查看 每个视图,您可以使用

$ mkdir imgs
$ dump --save-view-screenshots=$PWD/imgs/

完成后,目录包含每个视图的屏幕截图,例如

这样你就可以确定在 AVC/culebra.

获得的范围内是否有偏移量或其他东西

最后,如果由于某种原因您必须应用取决于您的设备型号或供应商的解决方法,您可以执行类似

的操作
...
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
...
if device.getProperty('ro.product.vendor.model') == 'Pixel':
   # do something for pixel
   ...

希望对您有所帮助。