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
下面是具体的操作步骤
通过访问 chrome://inspect 安卓手机连接到电脑,可以查到当前 App 使用的 WebView 版本
从https://npm.taobao.org/mirrors/chromedriver
下载对应版本的 chromedriver 到本地,并添加到 PATH 中。
不同版本对应的 chromedriver 的版本可以在这里看到
https://npm.taobao.org/mirrors/chromedriver/2.37/notes.txt
下载正确的 chromedriver 版本就好了
手动安装额外的依赖库
pip install selenium
从https://github.com/NetEaseGame/ATX/blob/master/atx/ext/chromedriver.py
将代码复制到本地,也保存为chromedriver.py
,并对相关的代码进行修改
只要改这 5 行就可以了
用 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
这个就有用了,具体操作看下面。
由于 chromedriver.py 的使用需要用到 adb 要想在手机不连接电脑的情况下,实现操作还需要对手机进行操作
操作步骤:
adb devices
看是否能列出该设备)。
adb tcpip 5555
uiautomator2 init
之后安装的小汽车可以看到手机的 ip
adb connect <device-ip-address>
这里的 <device-ip-address>
就是上一步中找到的设备 IP 地址。
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
可以代码层面实现下,只是懒得去想了 先分享出来再说。。。。。