【发布时间】:2023-03-20 09:54:01
【问题描述】:
我一直在 nwjs/node.js 中开发一个浏览器自动化应用程序,它使用数据驱动的 DSL 指令。
我决定通过我的 package.json 中的以下依赖项为 chromedriver 和 selenium webdriver 使用 npm 包:
"dependencies": {
"selenium-webdriver": "~3.0.0-beta-2",
"chromedriver": "~2.23.1"
}
一切都很顺利,直到最近应用程序在启动 chromedriver 时停止工作:
var webdriver = require("selenium-webdriver");
var driver = new webdriver.Builder().forBrowser('chrome').build();
以下是在我的 Macbook 上终端运行时出现的错误:
/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/promise.js:654
throw error;
^
SessionNotCreatedError: session not created exception
from unknown error: Runtime.evaluate missing 'wasThrown'
(Session info: chrome=54.0.2840.71)
(Driver info: chromedriver=2.23.409710 (0c4084804897ac45b5ff65a690ec6583b97225c0),platform=Mac OS X 10.11.5 x86_64)
at WebDriverError (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/error.js:27:5)
at SessionNotCreatedError (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/error.js:214:5)
at Object.checkLegacyResponse (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/error.js:505:15)
at parseHttpResponse (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/http.js:396:13)
at doSend.then.response (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/http.js:328:11)
at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.createSession()
at Function.createSession (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:366:24)
at Driver (/Users/matthewsanders/test1/node_modules/selenium-webdriver/chrome.js:804:38)
at Builder.build (/Users/matthewsanders/test1/node_modules/selenium-webdriver/index.js:546:16)
at Object.<anonymous> (/Users/matthewsanders/test1/index.js:4:59)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
From: Task: WebDriver.navigate().to(http://www.google.com)
at Driver.schedule (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:414:17)
at Navigation.to (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:1042:25)
at Driver.get (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:832:28)
at Object.<anonymous> (/Users/matthewsanders/test1/index.js:6:8)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
我还针对我当时制作的几个测试应用程序进行了测试,以确保这不是我在项目中引入的问题。
然后我在下载geckodriver 后尝试在forBrowser 方法中使用“firefox”,效果很好。
看起来好像 chromedriver 的某种自动更新破坏了我的项目。我注意到有关 stackoverflow 的其他几个与类似错误相关的问题,尽管没有一个包含 Runtime.evaluate missing 'wasThrown' 错误,这似乎表明我的理论可能是正确的。
我可以直接切换到 geckodriver,但我不确定我是否会遇到类似的问题。
我想这里真正的问题是......
如何禁用自动更新以保持此应用程序作为独立项目运行?
同样,这并不是一个不断更新的测试套件,而是一个由自定义语言驱动的浏览器自动化应用程序。它既可以通过托管的 node.js 实例作为自动化解决方案运行,也可以作为运行 nwjs 的操作员驱动的 gui 应用程序运行。
编辑:
到目前为止,我已经找到了一种很有前途的方法。如果我觉得它符合我的喜好,我会添加一个答案。
Selenium Documentation 包含有关如何自定义 chromedriver 选项的信息。我已经下载了Chromium 的一个版本并使用这个逻辑来连接它:
var chrome = require("selenium-webdriver/chrome");
var service = new chrome.ServiceBuilder().build();
var options = new chrome.Options();
options.setChromeBinaryPath("PATH/TO/MY/CHROMIUM");
var driver = new chrome.Driver(options, service);
注意:在 mac 上,您必须提供应用程序包中实际可执行文件的路径,例如:'Chromium.app/Contents/MacOS/Chromium'。
到目前为止,我使用的是 Chromium 而不是 Chrome,版本仍然不正确,但我确实验证了它与我在没有设置路径的情况下运行的不同。从理论上讲,如果我能够可靠地冻结自动更新过程,同时仍然独立打包应用程序,我应该能够以相同的方式运行 Chrome。如果这不起作用,我可能会求助于使用 Chromium。
【问题讨论】:
-
我似乎只需要更新 chromedriver 以匹配更新后的 Chrome。最新版本是 2.25,你的是 2.23。
-
感谢您的回复。这正是我想要避免的。 chromedriver 只是使用我的原生 chrome 吗?我可以将它指向一个固定版本吗?我需要在此处进行“设置并忘记它”设置,因为这将被打包为应用程序,除非 DSL 更改,否则不需要更新。
-
还有另一个问题似乎表明我可以做我想做的事情here
-
这次您可以更新
ChromeDriver以匹配您当前的 Chrome 版本(因为我不知道无法降级 Chrome 或获取较旧的安装程序),然后阻止 Chrome从升级。您可以通过转到 Chrome 安装文件夹并删除更新文件夹来做到这一点。 -
是的...但是我如何打包所有依赖项,以便下一个人在他们的系统上使用该应用程序时不会发生这种情况?
标签: node.js selenium selenium-webdriver selenium-chromedriver nwjs