美文网首页
Appium UiAutomator2驱动:混合模式

Appium UiAutomator2驱动:混合模式

作者: Domibaba | 来源:发表于2023-08-22 23:43 被阅读0次

通过管理Chromedriver驱动实例以及必要的代理命令,Uiautomator2(后文简称UIA2)支持移动端的ChromeChromium网页的自动化测试,也支持使用基于Chrome web视图的混合app的自动化测试(示例参考这里)。

默认情况下UIA2驱动在原生上下文中启动,意味着大部分的REST API命令可以直接被转发到 appium-uiautomator2-serverappium-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 StorageChromedriver版本和匹配的最小Chrome浏览器版本的映射关系见文件https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json

2、自动发现兼容的Chromedriver

UIA2驱动可以在测试时为浏览器/web选择正确的Chromedriverappium-chromedriver只会绑定最新发布的Chromedriver版本,可以下载多个Chromedriver版本并放置在同一个目录,并通过配置能力参数appium:chromedriverExecutableDir指定该目录。

通过能力参数appium:chromedriverChromeMappingFile,可以定制Chromedriver与最小匹配的浏览器版版本映射关系。只需要为该能力参数指定一个文件的全路径,其内容为JSON对象,如下形式:

{
 "2.42": "63.0.3239",
 "2.41": "62.0.3202"
}

可以从官方自动下载Chromedriverappium: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支持

Chromedriver75版本之前是不遵循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完全放弃。

ChromedriverW3C支持历史可以在 downloads section中找到。

相关文章

网友评论

      本文标题:Appium UiAutomator2驱动:混合模式

      本文链接:https://www.haomeiwen.com/subject/ucxpmdtx.html