我一直在nwjs / node.js中开发一个浏览器自动化应用程序,它使用数据驱动的DSL指令。
我决定通过我的package.json中的以下依赖项将npm包用于chromedriver和selenium webdriver:
"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)
我测试了我当时制作的几个测试应用程序,以确保它不是我在项目中引入的问题。
然后我尝试使用&#39; firefox&#39;下载geckodriver后,在forBrowser
方法中,效果非常好。
似乎chromedriver的某种自动更新破坏了我的项目。我注意到有关类似错误的stackoverflow的其他几个问题,虽然它们都没有包含Runtime.evaluate missing 'wasThrown'
错误,这似乎表明我的理论可能是正确的。
我 COULD 只需继续并切换到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上,您必须提供应用包中的实际可执行文件的路径:&#39; Chromium.app/Contents/MacOS/Chromium'。
到目前为止,我使用的是Chromium而不是Chrome,版本仍然不正确,但我确认它与我正在运行的不同而没有设置路径。理论上,如果我能够可靠地冻结自动更新过程,同时仍然可以独立打包应用程序,那么我应该能够以相同的方式运行Chrome。如果不起作用,我可能只会使用Chromium。
答案 0 :(得分:1)
另一个与@Matthew Sanders建议非常接近的解决方案是使用Chromium进行以下设置
var webdriver = require("selenium-webdriver");
var chrome = require("selenium-webdriver/chrome");
var options = new chrome.Options().setChromeBinaryPath("/usr/bin/chromium-browser")
// options.headless()
var driver = new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
答案 1 :(得分:0)
如何使用Selenium chromedriver而不必强制更新?
停用自动浏览器更新。
通过让自动更新发生,您可能会遇到使用Chromedriver的Chrome版本不同的机会。 Firefox和Geckodriver也会出现同样的情况。
最好有一个更受控制的升级过程。当您准备好更新时,请手动将更新到最新的chrome和chromedriver版本。
答案 2 :(得分:0)
您可以将docker与selenium hub一起使用,以设置独立于已安装浏览器的隔离环境。集线器有不同的浏览器,但是之前使用过chrome,我建议如下:
https://hub.docker.com/r/selenium/standalone-chrome/
安装docker后,可以使用
启动服务器docker run -d -p 4444:4444 selenium/standalone-chrome:latest
然后您可以通过端口4444连接到它。
当一切正常并且正在运行时,请确保您的webdriver使用远程selenium hub,只需在代码中告知它:
var webdriver = require("selenium-webdriver");
var driver = new webdriver.Builder()
.forBrowser('chrome')
.usingServer('http://localhost:4444/wd/hub')
.build();
编辑:
正如@sircapsalot指出的那样,您可以自行构建图片来指定您的版本https://github.com/SeleniumHQ/docker-selenium/wiki/Building-your-own-images#specify-chromedriver-and-chrome-versions
答案 3 :(得分:0)
我能够通过使用Chromium来解决我的问题,但是,我做了测试以确保它也适用于Chrome。 Chrome的问题在于您无法轻松找到旧版本,并且可以(并且确实)更改使用更新版本禁用自动更新的方式。有一些建议用于禁用Chrome中的自动更新,有些建议比其他更有效。
我决定按照网站上的指南下载以前版本的Chromium(在这种情况下,它使用版本44作为示例):
- 查看http://googlechromereleases.blogspot.com/search/label/Stable%20updates 最后一次&#34; 44。&#34;被提到了。
- 在Position Lookup
中循环播放该版本的历史记录(&#34; 44.0.2403.157&#34;)- 在这种情况下,它返回&#34; 330231&#34;的基准位置。这是在2015年5月发布44版本的承诺。*
- 打开continuous builds archive
- 点击您的平台(Linux / Mac / Win)
- 粘贴&#34; 330231&#34;进入顶部的过滤器字段并等待所有结果到XHR。
醇>
注意:有时数字不匹配,您必须滚动列表到您看到的下一个最低匹配。在我的情况下,我不得不回去几场比赛找到一份工作副本。
这里有一个二进制文件是使用它的javascript逻辑(更多信息可以在Selenium Docs中找到):
// get the webdriver for future operations
var webdriver = require("selenium-webdriver");
// configure the chromedriver
var chrome = require("selenium-webdriver/chrome");
// here I get the path of chromedriver to avoid using path variables
var path = new require("chromedriver").path;
var service = new chrome.ServiceBuilder(path).build();
var options = new chrome.Options();
// Note: on mac you need to reach in the .app folder
options.setChromeBinaryPath("Chromium.app/Contents/MacOS/Chromium");
var driver = new chrome.Driver(options, service);