Appium自动化测试遇到的chromedriver/chrome坑

 

前言

    app的webview自动化是依赖于chromedriver的,并且每个app的webview版本号都不太一样,这就导致了每次都需要重新去下载对应的chromedriver版本。如何根据当前的webdriver版本去匹配对应chromedriver版本,这是一个难题。

    根据官方文档翻译过来看,版本不匹配的话一般会报错:

An unknown server-side error occurred while processing the command.

Original error: unknown error: Chrome version must be >= 55.0.2883.0

Chrome driver启动

用chrome浏览器运行自动化测试用例时,如果报这样的错误selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing value

可以这样来解决:指定chromedriver.exe驱动绝对路径

  driver = webdriver.Chrome(r'e:\xxx\chromedriver.exe')

常遇错误

    我们在使用native和h5混合的应用程序测试时,可能会遇到报错

E:\ProgramFiles(x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py:1031:

UserWarning: name used for saved screenshot does not match file type. It should end with a `.png` extension。

"type. It should end with a `.png` extension", UserWarning)

..['NATIVE_APP', 'WEBVIEW_chrome', 'WEBVIEW_com.android.browser']

NATIVE_APP

Doctor my center Test Over.

E

=====================================================

ERROR: test_e_AboutContact (__main__.center)

----------------------------------------------------------------------

Traceback (most recent call last):

File "E:/ATS/TCyDoctorNew/test_case/test_dir/test_4doctormycenter.py", line 371, in test_e_AboutChengyiContact driver.switch_to.context('WEBVIEW_com.android.browser')

File"E:\ProgramFiles(x86)\Python\Python37\lib\site-packages\appium\webdriver\switch_to.py", line 31, in context

self._driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {'name': context_name})

File"E:\ProgramFiles(x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute

self.error_handler.check_response(response)

File"E:\ProgramFiles(x86)\Python\Python37\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response raise wde

File"E:\ProgramFiles(x86)\Python\Python37\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response

super(MobileErrorHandler, self).check_response(response)

File "E:\Program Files (x86)\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response

raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '55.0.2883'. See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details.

----------------------------------------------------------------------

Ran 3 tests in 66.001s

FAILED (errors=1)

Process finished with exit code 0

    我们来看报错信息,第一个是warning,是指截图的格式最好是png,这个与本文无关我们先忽略,关键看第二个错误,它主要缘于“No Chromedriver found that can automate Chrome '55.0.2883”,

在appium日志里也能看到详情

 

了解chromedriver

    通过管理Chromedriver, Appium支持安卓网页和支持谷歌的混合app的自动化。通过npm package安装的总是绑定最新的chromedriver。

    但是,每一版chromedriver的更新会支持最小的新增谷歌的版本,所以早期的版本不能再跟绑定的版本兼容。这时在appium server日志里会有类似的错误:

An unknown server-side error occurred while processing the command.

Original error: unknown error: Chrome version must be >= 55.0.2883.0

    为解决这个问题,appium可以通过加上—chromedriver_version属性配置使用特定的chromedriver版本,比如

npm install appium –chromedriver_version="2.16"

或者在CHROMEDRIVER_VERSION环境变量指定版本,如

CHROMEDRIVER_VERSION=2.20 npm install appium

这也能得到最新的版本。最后,还可以被指定在运行时,通过—chromedriver-executable 服务器标识与chromedriver执行路径手动下载,比如

appium --chromedriver-executable /path/to/my/chromedriver

chromedriver/chrome兼容

下面是chromedriver与最小的chrome版本对应表:

版本

最小谷歌版本

Chromedriver链接

2.44

69.0.3497.0

v2.44

2.43

69.0.3497.0

v2.43

2.42

68.0.3440.0

v2.42

2.41

67.0.3360.0

v2.41

2.40

66.0.3359.0

v2.40

2.39

66.0.3359.0

v2.39

2.38

65.0.3325.0

v2.38

2.37

64.0.3282.0

v2.37

2.36

63.0.3239.0

v2.36

2.35

62.0.3202.0

v2.35

2.34

61.0.3163.0

v2.34

2.33

60.0.3112.0

v2.33

2.32

59.0.3071.0

v2.32

2.31

58.0.3029.0

v2.31

2.30

58.0.3029.0

v2.30

2.29

57.0.2987.0

v2.29

2.28

55.0.2883.0

v2.28

2.27

54.0.2840.0

v2.27

2.26

53.0.2785.0

v2.26

2.25

53.0.2785.0

v2.25

2.24

52.0.2743.0

v2.24

2.23

51.0.2704.0

v2.23

2.22

49.0.2623.0

v2.22

2.21

46.0.2490.0

v2.21

2.20

43.0.2357.0

v2.20

2.19

43.0.2357.0

v2.19

2.18

43.0.2357.0

v2.18

2.17

42.0.2311.0

v2.17

2.16

42.0.2311.0

v2.16

2.15

40.0.2214.0

v2.15

2.14

39.0.2171.0

v2.14

2.13

38.0.2125.0

v2.13

2.12

36.0.1985.0

v2.12

2.11

36.0.1985.0

v2.11

2.10

33.0.1751.0

v2.10

2.9

31.0.1650.59

v2.9

2.8

30.0.1573.2

v2.8

2.7

30.0.1573.2

v2.7

2.6

29.0.1545.0

v2.6

2.5

29.0.1545.0

v2.5

2.4

29.0.1545.0

v2.4

2.3

28.0.1500.0

v2.3

2.2

27.0.1453.0

v2.2

2.1

27.0.1453.0

v2.1

2.0

27.0.1453.0

v2.0

自动查找匹配的chromedriver

从Appium1.8.0开始,appium可以得到这个正确的基于chrome的chromedriver版本。当appium发布时,appium与chromedriver绑定,更多chromedriver版本可供下载到appium的安装文件里(不建议这样做,因为更新appium时将会删除它们)。

当一个appium版本发布,最新的chromedriver版本可以被获取,可以通过chromedriver与最小chrome版本映射关系,得到映射的绝对路径文件。这个文件内容必须做成json对象,例如

{

  "2.42": "63.0.3239",

  "2.41": "62.0.3202"

}

安装网络问题

    当appium安装时需要下载chromedriver,所以会遇到安装失败的网络问题。

默认下chromedriver从https://chromedriver.storage.googleapis.com/ 获取。使用chromedrivre的npm镜像配置chromedriver_cdnurl。

npm install appium-chromedriver --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver

或者在你的.npmrc文件增加属性

chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver

另一种选择是使用Path环境变量CHROMEDRIVER_CDNURL

CHROMEDRIVER_CDNURL=http://npm.taobao.org/mirrors/chromedriver npm install appium-chromedriver

在国内,可以用cnpm~

首先,安装cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

 

输入cnpm -v,显示cnpm不是内部或外部命令,也不是可运行命令或批处理文件。

cnpm默认会安装在C:\Users\admin\AppData\Roaming\npm个人用户路径下。所以追溯到这个文件夹,在这里可以执行cnpm –v,因此推测没有把cnpm路径加入到path系统环境变量中。

添加到path后,再关闭打开cmd,执行cnpm –v命令,

 

解决这个之后执行安装chromedriver

cnpm install -g appium --chromedriver_version="2.28" --chromedriver_cdnurl=http://npm.taobao.org/mirrors/chromedriver

 

上一篇:Python项目实践--环境准备03 Scrapy + Selenium Chrome工作环境


下一篇:chromedriver与chrome最新版本对应表 转自-河岸上的酸菜鱼 简书地址-https://www.jianshu.com/u/bbea92f78aca