通过管理Chromedriver
驱动实例以及必要的代理命令,Uiautomator2
(后文简称UIA2
)支持移动端的Chrome
或Chromium
网页的自动化测试,也支持使用基于Chrome web
视图的混合app
的自动化测试(示例参考这里)。
默认情况下UIA2
驱动在原生上下文中启动,意味着大部分的REST API
命令可以直接被转发到 appium-uiautomator2-server。appium-uiautomator2-server
在自动化测试过程中运行在被测设备中,并且将UIA2
转发过来的API
命令翻译成恰当的Android
底层UiAutomator
框架调用。通常情况下,只有一个原生上下文,可以有多个web
上下文。每一个web
上下文可能包含0
个或多个页面/窗口。如果想要默认启动web
上下文,可以在会话启动的时设置browserName
能力参数值或使能appium:autoWebview
能力参数。
当被测设备上打开浏览器或web
视图时候,就可以检测到web
上下文。如果一个上下文切换到web
上下文,那么UIA2
驱动会为web
上下文启动一个Chromedriver
实例,并将大部分命令转发到Chromedriver
实例。注意必须正确配置和调试web
视图,以便能连接它、或获取可用的上下文列表名称。特定的web
视图是否可用,可以用Chrome Remote Debugger轻易的验证,在会话期间可以实现不同上下文的转换。
绑定到UIA2
驱动的appium-chromedriver包通常会尝试下载最新的Chromedriver
版本。Google
要求使用的Chromedriver
版本必须总是和浏览器或web
视图引擎版本匹配。如果版本不匹配,那么Chromedriver
会创建失败,并且会出现类似下面的错误提示信息,对于版本兼容性,参考1、Chromedriver/Chrome
兼容性:
An unknown server-side error occurred while processing the command.
Original error: unknown error: Chrome version must be >= 55.0.2883.0
有几种方式为UIA2
提供指定的Chromedriver
版本:
-
当安装
UIA2
驱动时在安装
UIA2
驱动时,可以通过CHROMEDRIVER_VERSION
环境变量指定Chromedriver
版本:CHROMEDRIVER_VERSION=2.20 appium install driver uiautomator2
-
当启动会话时(手动指定
Chromedriver
)可以通过能力参数
appium:chromedriverExecutable
指定Chromedriver
的版本,需要为该参数提供一个匹配的Chromedriver
可执行文件的全路径,需要手动将该文件下载到Appium
服务端运行的机器上。 -
当启动会话时(自动发现
Chromedriver
)当
Chromedriver
在被测设备上不存在时,UIA2
驱动会尝试检测Chrome
引擎版本并下载匹配的Chromedriver
。具体请参考2、自动发现兼容的Chromedriver
。
1、Chromedriver/Chrome
兼容性
从2.46
版本开始,Google
改变了Chromedriver
版本命名规则,因此现在Chromedriver
主版本号和web
/浏览器的主版本号相关,可以实现自动化。
如果Chromedriver
主版本号大于等于73
,可以参考 Version Selection找到匹配的浏览器版本。
如果Chromedriver
主版本号是73
以下,那么可以通过如下方式找到最小匹配的浏览器版本:获取到Chromium
的源码,找到发布的提交记录,检查文件src/chrome/test/chromedriver/chrome/version.cc
中的kMinimumSupportedChromeVersion
变量(可以使用命令git log --pretty=format:'%h | %s%d' | grep -i "Release Chromedriver version"
)。
完整的Chromedriver
发布列表见Chromedriver Storage。Chromedriver
版本和匹配的最小Chrome
浏览器版本的映射关系见文件https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json。
2、自动发现兼容的Chromedriver
UIA2
驱动可以在测试时为浏览器/web
选择正确的Chromedriver
。appium-chromedriver
只会绑定最新发布的Chromedriver
版本,可以下载多个Chromedriver
版本并放置在同一个目录,并通过配置能力参数appium:chromedriverExecutableDir
指定该目录。
通过能力参数appium:chromedriverChromeMappingFile
,可以定制Chromedriver
与最小匹配的浏览器版版本映射关系。只需要为该能力参数指定一个文件的全路径,其内容为JSON
对象,如下形式:
{
"2.42": "63.0.3239",
"2.41": "62.0.3202"
}
可以从官方自动下载Chromedriver
到appium:chromedriverExecutableDir
指定的目录,并将映射关系自动存储到appium:chromedriverChromeMappingFile
,只需要:在启动appium
服务端的时候,使能chromedriver_autodownload
特性,命令如下:
appium server --allow-insecure chromedriver_autodownload
3、Chromedriver
下载问题疑难解答
当安装UIA2
驱动时,它会自动下载Chromedriver
,因此可能由于网络或者其他问题导致安装失败,可能有如下方式来解决。
- 指定非官方镜像下载地址
默认会从https://chromedriver.storage.googleapis.com/
获取Chromedriver
,也可以使用CHROMEDRIVER_CDNURL
环境变量指定镜像地址:
CHROMEDRIVER_CDNURL=https://npmmirror.com/mirrors/chromedriver appium driver install uiautomator2
备注:要让上述配置镜像地址的方式生效,可能需要调整网络代理获防火墙配置。
-
跳过
Chromedriver
的下载通过设置
APPIUM_SKIP_CHROMEDRIVER_INSTALL
环境变量跳过Chromedriver
的下载:APPIUM_SKIP_CHROMEDRIVER_INSTALL=1 appium driver install uiautomator2
4、web
上下文的W3C
支持
Chromedriver
在75
版本之前是不遵循W3C
标准的。如果遇到代理命令错误,需要更新Chromedriver
版本,老的Android
设备无法使用新的Chromedriver
版本,如果为Chromedriver
强制使用Mobile JSON Wire Protocol
,可以避免这个错误,方法是将appium:chromeOptions
能力参数设置为{'w3c': False}
。
Chromedriver
在主版本号75
及以后默认使用W3C
模式,可以使用上述方式切换到Mobile JSON Wire Protocol
,但是不建议这样做,因为Mobile JSON Wire Protocol
最终会被Chromedriver
完全放弃。
Chromedriver
的W3C
支持历史可以在 downloads section中找到。
网友评论