Macaca 关于微信公众号webview 测试中遇到的元素识别问题,望高手解答

boafantasy · 2017年03月08日 · 最后由 boafantasy 回复于 2017年03月10日 · 1258 次阅读

先说现象

目前在华为 p7 上进行微信公众号的测试,刚开始写 python 代码的时候,使用如下代码

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['deviceName'] = 'huawei p7'
desired_caps['package'] = 'com.tencent.mm'
desired_caps['activity'] = '.ui.LauncherUI'
desired_caps['newCommandTimeout'] = '5000'
desired_caps['udid'] = '7N2RDQ1466012724'
desired_caps['unicodeKeyboard'] = 'True'
desired_caps['resetKeyboard'] = 'True'
desired_caps['androidProcess'] = 'com.tencent.mm:tool'

在进入到微信之后,微信应用是需要登录的,当然微信原生的元素都能定位到,这样写代码都能跑,除了一个小问题微信登录手机号有可能输入重复,如输入 “1234567” 可能变成 “1123445567”

driver.wait_for_element_by_name('通讯录', timeout=20000).click()
driver.wait_for_element_by_name('公众号', timeout=20000).click()
driver.wait_for_element_by_name('搜索', timeout=20000).click()
driver.wait_for_element_by_name('搜索').send_keys('九一')
driver.wait_for_element_by_name('xxxxx公众号', timeout=20000).click()
driver.wait_for_element_by_name('一级菜单').click()
driver.wait_for_element_by_name('二级菜单').click()

进入公众号之后,此时通过输出 driver.source 可以看到 dom 格式的元素,通过 class_name 等等就能够定位到公众号 webview 的元素了,此时我还窃喜,没有遇到切换 context 等问题,直接就识别了
本以为到这里就结束了,但是因为不是测试自己的 app,每次微信还要重新登录太麻烦了,而且华为的系统,每次打开应用还要提示一堆权限的设置,必须手点允许,要不然 init 都过不去

然后看到 cap 参数里面有一个 reuse 可以设置为 3,不重装 app,文档原文是这么写的

0: Erase the simulator and install the app. 1: (default) Uninstall the app and reinstall the app. 2: Only reinstall the app. 3: Keep the simulator and app after testing.

当我在 desired_caps 中加一个参数 reuse=3 的时候,果然启动的时候微信不需要登录了,进入就直接是登录好能看到聊天记录的界面,但是问题来了,当我按上面的代码进入到公众号之后,发现定位不到 webview 的元素了,这个时候输出 driver.source,发现输出的 dom 里面没有了之前的元素,输出的 dom 大概这样

<nodeindex="0"text=""resource-id="com.tencent.mm:id/d3q"class="android.widget.LinearLayout"package="com.tencent.mm"content-desc=""checkable="false"checked="false"clickable="false"enabled="true"focusable="false"focused="false"scrollable="false"long-clickable="false"password="false"selected="false"bounds="[0,219][1080,1776]"><nodeindex="0"text="网页由 www.xxxxxx.com 提供"resource-id="com.tencent.mm:id/d3r"class="android.widget.TextView"package="com.tencent.mm"content-desc=""checkable="false"checked="false"clickable="false"enabled="true"focusable="false"focused="false"scrollable="false"long-clickable="false"password="false"selected="false"bounds="[245,279][834,336]"/><nodeindex="1"text=""resource-id=""class="android.widget.LinearLayout"package="com.tencent.mm"content-desc=""checkable="false"checked="false"clickable="false"enabled="true"focusable="false"focused="false"scrollable="false"long-clickable="false"password="false"selected="false"bounds="[228,366][852,423]"><nodeindex="0"text=""resource-id=""class="android.widget.ImageView"package="com.tencent.mm"content-desc=""checkable="false"checked="false"clickable="false"enabled="true"focusable="false"focused="false"scrollable="false"long-clickable="false"password="false"selected="false"bounds="[228,373][267,415]"/><nodeindex="1"text="QQ浏览器X5内核提供技术支持"resource-id=""class="android.widget.TextView"package="com.tencent.mm"content-desc=""checkable="false"checked="false"clickable="false"enabled="true"focusable="false"focused="false"scrollable="false"long-clickable="false"password="false"selected="false"bounds="[282,366][852,423]"/>

当我把 reuse 调整成 1,再次 init,又好使了,但是华为又要提示输入一堆权限确认,走不下去了,我再次将 reuse 改为 3,尝试了切换 context,但是当我在任何时候输入 driver.contexts 的时候,macaca 直接报错,大体就是说 chrome not reachable,no driver found 之类的,如下图:

参考了一些其他人关于 webview 的文章,貌似也没有帮助,目前只能换其他手机没有权限提示的,然后用 reuse=1 来进行测试,但是这个问题感觉没搞清楚很难受,希望有人能解答,谢谢,下面是 macaca doctor 的信息,如果能解释下 reuse 具体的参数实现机制和差别就更好了

$ macaca doctor

  macaca-doctor version: 1.0.28


  Node.js checklist:

  node env: C:\Program Files\nodejs\node.exe
  node version: v6.2.0

  Android checklist:

  JAVA version is `1.8.0_91`
  JAVA_HOME is set to `C:\Program Files\Java\jdk1.8.0_91`
  ANDROID_HOME is set to `D:\Android\sdk\`
  Platforms is set to `D:\Android\sdk\platforms\android-24`
  Android tools is set to `D:\Android\sdk\tools\android.bat`
  ADB tool is set to `D:\Android\sdk\platform-tools\adb.exe`
  ANT_HOME is set to `D:\apache-ant-1.9.9`

  Installed driver list:

  android: 1.1.22
  chrome: 1.0.5
  electron: 1.1.5

补充一点:之前看到 github 上的 issue 有 webview 无法识别是因为 webview 没有加 debug 代码,但是微信公众号识别是这个问题吗?

共收到 1 条回复 时间 点赞

@xdf 大神求助

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