需要为 Protractor 降级 chromedriver 以匹配更早的 Chrome 版本
Need to downgrade chromedriver for Protractor to match earlier Chrome version
我目前正在尝试为我将为其进行质量检查的应用程序正确获取一些现有的 Protractor 测试 运行。但是,看起来我需要使用早期版本的 chromedriver 才能与我正在使用的 Chrome 版本同步 (71.x),但我不确定如何让 Protractor 使用不同的版本版本,因为它总是下载 v76。为什么我需要这样做?上下文如下。
从存储库中提取代码后,我根据之前开发人员留下的说明在“/e2e”目录中做了一个 "npm install",并使用 [= 通过 webdriver-manager 更新了一些东西27=] 当 运行ning Selenium 时,我收到 "Invalid or corrupt jar file" 错误,这显然是 4.0.0-alpha-1 和 alpha-2 版本的问题,因此我将 Selenium 降级为独立版本 3.141 .59.
这一直有效,直到我意识到当 运行 进行测试时,该应用程序没有将浏览器识别为 Chrome 并且未通过测试(它需要 Chrome 到 运行) 尽管肯定是 运行ning Chrome。因此,我不得不将本地计算机的 Chrome 版本降级以匹配我的更新提取的 chromedriver 版本 - 我相信它是 运行ning chromedriver v75 而我是 运行ning v76我的本地机器。
一位 QA 同事告诉我,我应该 运行ning Chrome v71.x 因为这就是我们用于发布管道的内容。因此,我卸载了 Chrome 并获得了 Chrome v71.x,确保禁用了自动更新。这意味着我需要获取与此匹配的 chromedriver 版本,从我在网上进行的挖掘来看,它似乎是 v2.46。
现在,谈谈我的核心问题。每次我尝试通过 webdriver-manager 更新内容时,它总是会下载最新版本的 chromedriver (v76),而且我不知道如何让量角器使用早期版本。我已经手动下载了 chromedriver 2.46 - 我猜我需要以某种方式将它指向这个版本,但是弄乱配置 json 文件并没有给我带来任何运气,我还没有在网上找到好的答案。
感谢任何帮助,因为我对这一切的工作原理还很陌生。
作为参考,这是我尝试 运行 我的规格时弹出的错误类型:
[08:25:41] E/launcher - SessionNotCreatedError: session not created: This
version of ChromeDriver only supports Chrome version 76
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-
14T08:25:53'
System info: host: 'xxxxxxxx', ip: 'xxxxxxxx', os.name: 'Windows
8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_40'
Driver info: driver.version: unknown
你的 npm 模块将有一个名为 webdriver-manager 的文件夹。这里将出现所有二进制 ex chromedriver。
地点:
/node_modules/protractor/bin/webdriver-manager
现在执行以下步骤
更新 webdriver-manager
现在转到该文件夹并根据您的 OS 删除 chromedriver 二进制文件,即 chromedriver.exe(Windows) 并替换为
它将降级您将从此处下载的相同版本,确保 exe 的名称应与以前相同 单击
这里
运行你的测试
或
下载特定版本的(例如)chromedriver:
webdriver-manager update --versions.chrome 2.46
webdriver-manager start --versions.chrome 2.46
这是一个经常出现的问题,我通过检查本地 chrome 的版本来解决这个问题,然后我只更新到 package.json 中的那个版本,然后执行 npm i。更新 webdriver-manager 并没有解决我的问题,它下载了正确的 chrome 二进制文件但没有使用它。所以"npm i"帮我解决了。
所以我需要在构建过程中以编程方式执行此操作。我们将 Jenkins 用于我们的 CI 流程。
这就是我们 Jenkinsfile 的相关部分的样子。使用 webdriver-manager update 在 npm install 之后安装匹配的驱动程序版本。 grep 语句捕获浏览器版本的前三个字段。这需要附加到 chromedriver url 到 return 匹配驱动程序的四字段版本。
...
stages {
stage('Install') {
steps {
sh 'google-chrome --version'
sh 'npm --version'
sh 'node --version'
sh 'yes | npm i'
script {
env.chromeVersion = sh (
script: "google-chrome --version | grep -Po 'Chrome \K[^\.](\d+\.){2}\d+'",
returnStdout: true
).trim()
}
echo "chromeVersion: ${env.chromeVersion}"
script {
env.chromeDriverVersion = sh (
script: "curl https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${env.chromeVersion}",
returnStdout: true
).trim()
}
echo "chromeDriverVersion: ${env.chromeDriverVersion}"
sh ("./node_modules/webdriver-manager/bin/webdriver-manager update --versions.chrome ${env.chromeDriverVersion}")
}
}
...
另一个关键部分是更新测试 运行 指示量角器在安装后不更新驱动程序。这是我们 package.json
的相关部分
{
"name": "ourProduct",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"e2e": "ng e2e --webdriverUpdate=false"
},
然后在我们的 Jenkinsfile 中,我们是 运行 测试。
...
stage('Run Tests') {
steps {
sh 'npm run e2e'
}
}
...
我目前正在尝试为我将为其进行质量检查的应用程序正确获取一些现有的 Protractor 测试 运行。但是,看起来我需要使用早期版本的 chromedriver 才能与我正在使用的 Chrome 版本同步 (71.x),但我不确定如何让 Protractor 使用不同的版本版本,因为它总是下载 v76。为什么我需要这样做?上下文如下。
从存储库中提取代码后,我根据之前开发人员留下的说明在“/e2e”目录中做了一个 "npm install",并使用 [= 通过 webdriver-manager 更新了一些东西27=] 当 运行ning Selenium 时,我收到 "Invalid or corrupt jar file" 错误,这显然是 4.0.0-alpha-1 和 alpha-2 版本的问题,因此我将 Selenium 降级为独立版本 3.141 .59.
这一直有效,直到我意识到当 运行 进行测试时,该应用程序没有将浏览器识别为 Chrome 并且未通过测试(它需要 Chrome 到 运行) 尽管肯定是 运行ning Chrome。因此,我不得不将本地计算机的 Chrome 版本降级以匹配我的更新提取的 chromedriver 版本 - 我相信它是 运行ning chromedriver v75 而我是 运行ning v76我的本地机器。
一位 QA 同事告诉我,我应该 运行ning Chrome v71.x 因为这就是我们用于发布管道的内容。因此,我卸载了 Chrome 并获得了 Chrome v71.x,确保禁用了自动更新。这意味着我需要获取与此匹配的 chromedriver 版本,从我在网上进行的挖掘来看,它似乎是 v2.46。
现在,谈谈我的核心问题。每次我尝试通过 webdriver-manager 更新内容时,它总是会下载最新版本的 chromedriver (v76),而且我不知道如何让量角器使用早期版本。我已经手动下载了 chromedriver 2.46 - 我猜我需要以某种方式将它指向这个版本,但是弄乱配置 json 文件并没有给我带来任何运气,我还没有在网上找到好的答案。
感谢任何帮助,因为我对这一切的工作原理还很陌生。
作为参考,这是我尝试 运行 我的规格时弹出的错误类型:
[08:25:41] E/launcher - SessionNotCreatedError: session not created: This
version of ChromeDriver only supports Chrome version 76
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-
14T08:25:53'
System info: host: 'xxxxxxxx', ip: 'xxxxxxxx', os.name: 'Windows
8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_40'
Driver info: driver.version: unknown
你的 npm 模块将有一个名为 webdriver-manager 的文件夹。这里将出现所有二进制 ex chromedriver。
地点:
/node_modules/protractor/bin/webdriver-manager
现在执行以下步骤
更新 webdriver-manager
现在转到该文件夹并根据您的 OS 删除 chromedriver 二进制文件,即 chromedriver.exe(Windows) 并替换为 它将降级您将从此处下载的相同版本,确保 exe 的名称应与以前相同 单击 这里
运行你的测试
或
下载特定版本的(例如)chromedriver:
webdriver-manager update --versions.chrome 2.46
webdriver-manager start --versions.chrome 2.46
这是一个经常出现的问题,我通过检查本地 chrome 的版本来解决这个问题,然后我只更新到 package.json 中的那个版本,然后执行 npm i。更新 webdriver-manager 并没有解决我的问题,它下载了正确的 chrome 二进制文件但没有使用它。所以"npm i"帮我解决了。
所以我需要在构建过程中以编程方式执行此操作。我们将 Jenkins 用于我们的 CI 流程。
这就是我们 Jenkinsfile 的相关部分的样子。使用 webdriver-manager update 在 npm install 之后安装匹配的驱动程序版本。 grep 语句捕获浏览器版本的前三个字段。这需要附加到 chromedriver url 到 return 匹配驱动程序的四字段版本。
...
stages {
stage('Install') {
steps {
sh 'google-chrome --version'
sh 'npm --version'
sh 'node --version'
sh 'yes | npm i'
script {
env.chromeVersion = sh (
script: "google-chrome --version | grep -Po 'Chrome \K[^\.](\d+\.){2}\d+'",
returnStdout: true
).trim()
}
echo "chromeVersion: ${env.chromeVersion}"
script {
env.chromeDriverVersion = sh (
script: "curl https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${env.chromeVersion}",
returnStdout: true
).trim()
}
echo "chromeDriverVersion: ${env.chromeDriverVersion}"
sh ("./node_modules/webdriver-manager/bin/webdriver-manager update --versions.chrome ${env.chromeDriverVersion}")
}
}
...
另一个关键部分是更新测试 运行 指示量角器在安装后不更新驱动程序。这是我们 package.json
的相关部分{
"name": "ourProduct",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"e2e": "ng e2e --webdriverUpdate=false"
},
然后在我们的 Jenkinsfile 中,我们是 运行 测试。
...
stage('Run Tests') {
steps {
sh 'npm run e2e'
}
}
...