opeatx 的 uiautomator2 可以实现在不连接数据线的环境下实现 UI 自动化,但是好像对 app 内的 webview 还没有很好得支持。
在论坛里搜相关的帖子发现@codeskyblue 在 atx 项目中已经实现了对 Android Webview 的支持
https://testerhome.com/topics/7232

看了看源码,发现用 uiautomator2 应该也是可以来操作 Webview 的
把实践的步骤写出来供大家参考:
uiautomator2 的安装及配置就不介绍了可以看之前论坛的帖子:
https://testerhome.com/topics/12521
https://testerhome.com/topics/11357

下面是具体的操作步骤

1、环境安装及准备

chromedriver 的选择及安装

通过访问 chrome://inspect 安卓手机连接到电脑,可以查到当前 App 使用的 WebView 版本

https://npm.taobao.org/mirrors/chromedriver
下载对应版本的 chromedriver 到本地,并添加到 PATH 中。

不同版本对应的 chromedriver 的版本可以在这里看到
https://npm.taobao.org/mirrors/chromedriver/2.37/notes.txt

下载正确的 chromedriver 版本就好了

安装 selenium

手动安装额外的依赖库
pip install selenium

2、下载 chromedriver.py 并修改相关代码

https://github.com/NetEaseGame/ATX/blob/master/atx/ext/chromedriver.py
将代码复制到本地,也保存为chromedriver.py,并对相关的代码进行修改

只要改这 5 行就可以了

3、使用

用 macac 的 demo 演示的 apk 来测试一下看看,apk 下载地址:
https://npmcdn.com/android-app-bootstrap@latest/android_app_bootstrap/build/outputs/apk/android_app_bootstrap-debug.apk

在手机有线连接电脑的情况下,执行以下代码

import time
import uiautomator2 as u2
from chromedriver import ChromeDriver   #将chromedriver.py和该脚本放在同一目录下

d = u2.connect()
d.app_start('com.github.android_app_bootstrap')
d(text='Login').click()
d(text='Baidu').click()
time.sleep(3)
driver = ChromeDriver(d).driver()
driver.find_element_by_id('index-kw').click()
driver.find_element_by_id('index-kw').send_keys('Python')
driver.find_element_by_id('index-bn').click()
driver.quit()

在手机连接在电脑的情况下,上述的代码可以直接跑成功了,说明使用 uiautomator2 也是可以对 Webview 实现操作的嘛。
不过有个问题,selenium 调用的时候是要获取 devices 的。连线的时候d.serial可以直接获取到,但是数据线断了的时候怎么办呢?
这时候,chromedriver.py中增加的devices_ip这个就有用了,具体操作看下面。

4、手机 adb tcpip 实现 adb 无线连接

由于 chromedriver.py 的使用需要用到 adb 要想在手机不连接电脑的情况下,实现操作还需要对手机进行操作
操作步骤:

  1. 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
  2. 将设备与电脑通过 USB 线连接。 应确保连接成功(可运行 adb devices 看是否能列出该设备)。
  3. 让设备在 5555 端口监听 TCP/IP 连接: adb tcpip 5555
  4. 断开 USB 连接。
  5. 找到设备的 IP 地址。 一般能在「设置」-「关于手机」-「状态信息」-「IP 地址」找到,uiautomator2 init之后安装的小汽车可以看到手机的 ip
  6. 通过 IP 地址连接设备。 adb connect <device-ip-address> 这里的 <device-ip-address> 就是上一步中找到的设备 IP 地址。
  7. 确认连接状态,在 USB 断开的状态下执行 adb devices 如果能看到 <device-ip-address>:5555 device 说明连接成功。

如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 adb connect <device-ip-address> 那一步;
如果还是不行的话,通过 adb kill-server 重新启动 adb 然后从头再来一次试试。

拔掉数据线 修改代码再来一次

确保在拔掉数据线后 执行adb devices能够发现设备<device-ip-address>:5555 device
修改代码,再次执行看看

import time
import uiautomator2 as u2
from chromedriver import ChromeDriver   #将chromedriver.py和该脚本放在同一目录下

d = u2.connect('10.33.103.214')  #手机的ip 为10.33.103.214
d.app_start('com.github.android_app_bootstrap')
d(text='Login').click()
d(text='Baidu').click()
time.sleep(3)
driver = ChromeDriver(d).driver(device_ip='10.33.103.214:5555') #增加device_ip参数
driver.find_element_by_id('index-kw').click()
driver.find_element_by_id('index-kw').send_keys('Python')
driver.find_element_by_id('index-bn').click()
driver.quit()

后面步骤的adb tcpip可以代码层面实现下,只是懒得去想了 先分享出来再说。。。。。

结果展示:


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