node.js - 如何使用Selenium chromedriver而不强制更新?

标签 node.js selenium selenium-webdriver selenium-chromedriver nwjs

我一直在 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 缺少 'wasThrown' 错误,这似乎表明我的理论可能是正确的。

可以直接切换到 geckodriver,但我不确定以后是否会遇到类似的问题。

我想这里真正的问题是......

如何禁用自动更新以使该应用程序作为独立项目运行?

同样,这并不是一个不断更新的测试套件,而是一个由自定义语言驱动的浏览器自动化应用程序。它既可以通过托管的 Node.js 实例作为自动化解决方案运行,也可以作为使用 nwjs 运行的运算符(operator)驱动的 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。

最佳答案

另一个解决方案,与 @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();

关于node.js - 如何使用Selenium chromedriver而不强制更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40288651/

相关文章:

node.js - 如何控制 Node express.js应用程序中排队请求的最大数量?

node.js - NodeJS + Express 慢慢消耗越来越多的 CPU

python - 使用 Tor 和 Selenium 获得新的身份。出现错误 "IncorrectSocketType: unable to use the control socket"

css - 以下 HTML 源的 CSS 选择器可能是什么

python - 在 python selenium 中切换窗口时出错

c# - .SendKeys(Keys.Enter) 和.Click() 之间的区别?

javascript - Node : Connect router middleware

node.js - 在 Node JS 中同时使用 JWT 和 session 进行身份验证系统

python - 将 cookie 加载到 Python 请求 session 时出错

Java 'Email Sending Code' > 已知异常(索引 : 14, 大小 : 14)?