开年不顺,现在公司要求 iOS Android 二合一,由原生改为 Dcloud 开发,新版发包后要修改之前的元素定位,但是发现把原来的元素 ID 改成新的 ID 之后无法定位。
举个栗子:
老版的登陆和注册的定位是这样的:_login_locator = (By.ID, 'com.avictc.xxx:id/login') _register_locator = (By.ID, 'com.avictc.xxx:id/register'),久经考验,一直没问题;
新版的登陆和注册的定位改成了这样:_login_locator = (By.ID, 'btnLogin') _register_locator = (By.ID, 'btnReg');

问题:
ID 修改成新的之后便一直无法定位,APP 页面结构和 appium 打印的 log 是这样的:

使用 ID 无法定位之后,我改用了 XPATH 定位:_register_locator = (By.XPATH, '//android.view.View[@text="注册"]') 或者 _login_img_locator = (By.XPATH, '//android.view.View[@resource-id="btnLogin"]') 便可以定位了;

有点想不通,这 ID 为什么就定位不了呢?

===================================================================================

新的发现:

Android APP 的代码都是由 html 转换过来的,我们的应用目前是 三端合一,刚刚去了 web 端看了下,发现 web 端的元素属性是这样的:

我现在就只想呵呵,压根就没有 ID 属性,html 转换成 Android 元素的时候 将 class 属性识别成了 ID 属性,这应该是问题的根本原因了。

那么,这玩意到底是 Dcloud 的锅,还是 appium 的锅???

===================================================================================

又有新的发现,html 和转换成 app 的元素都有 ID 属性时,仍然无法使用 ID 定位,只能使用 XPATH;
(By.XPATH, '//android.view.View[@resource-id="KBCon"]')


↙↙↙阅读原文可查看相关链接,并与作者交流