Selenium Webdriver错误:ECONNREFUSED连接ECONNREFUSED 127.0.0.1:9515

时间:2019-03-16 08:40:12

标签: node.js selenium google-chrome webdriver selenium-chromedriver

我在电子桌面应用程序中使用NodeJS硒。

"electron-chromedriver": "^4.0.0-beta.1",
"selenium-webdriver": "^4.0.0-alpha.1",

我在电子应用程序中关注了electron documentation about using selenium,并且我有这样的代码:

let chromeCapabilities = webdriver.Capabilities.chrome();
let chromeOptions = { 'args': ['--disable-infobars'] };
chromeCapabilities.set('chromeOptions', chromeOptions);
capabilities.setPageLoadStrategy('eager');

this.driver = new webdriver.Builder()
    .withCapabilities(chromeCapabilities)
    .usingServer('http://localhost:9515')
    .forBrowser('chrome')
    .build();

在上面的代码之后,有许诺链正在做许多不同的事情。

除了我正在chromedriver目录内的终端中运行./node_modules/.bin/命令。

  

在端口9515上启动ChromeDriver 69.0.3497.106(857b284701ddf7bef0f14fa76416cf7ca786b411)
  仅允许本地连接。

现在,当我运行整个代码时,它有时可以正常工作,但偶尔会在我npm run dev电子应用程序所在的终端中显示错误:

  

错误:ECONNREFUSED连接ECONNREFUSED 127.0.0.1:9515

我读了几个类似的SO问题,但没有一个有帮助。我不太了解某些代码有时可能工作并有时导致错误的可能性。

在出现错误后,我还检查了端口9515(chromedriver)和9080(电子nodeJS),一切看起来都很好:

alt


我做了更多的调试,发现可能是这样的:

webElement.getAttribute('style')

有时导致了我的错误。当我删除上面的内容时(当然还有.then().catch之后),错误停止发生。但是我不知道获取webElement的内联样式可能与拒绝连接错误有关。

1 个答案:

答案 0 :(得分:2)

您使用了以下功能:

capabilities.setPageLoadStrategy('eager');

之前,在几个质量检查中,我们讨论了将PageLoadStrategy用作 ChromeDriver Chrome eager

结论是,根据WebDriver Status,您将根据{中的内容在 ChromeDriver 中找到所有 WebDriver命令的列表及其当前支持。 {3}}。一旦从各个方面完成了实现后, PageLoadStrategy.EAGER 势必会存在于 Chrome驱动程序中。

类似的讨论也活跃在bugs.chromium.orggroups.google.com中的多个线程上,如下所示:

如果您查看Implement page load timeout API PageLoadStrategy是因为 eager 尚未实现:

#include "chrome/test/chromedriver/chrome/page_load_strategy.h"
#include "base/logging.h"
#include "chrome/test/chromedriver/chrome/navigation_tracker.h"
#include "chrome/test/chromedriver/chrome/non_blocking_navigation_tracker.h"
const char PageLoadStrategy::kNormal[] = "normal";
const char PageLoadStrategy::kNone[] = "none";
const char PageLoadStrategy::kEager[] = "eager";
PageLoadStrategy* PageLoadStrategy::Create(
    std::string strategy,
    DevToolsClient* client,
    const BrowserInfo* browser_info,
    const JavaScriptDialogManager* dialog_manager) {
  if (strategy == kNone) {
    return new NonBlockingNavigationTracker();
  } else if (strategy == kNormal) {
    return new NavigationTracker(client, browser_info, dialog_manager);
  } else {
    NOTREACHED() << "invalid strategy '" << strategy << "'";
    return nullptr;
  }
}

这可能是Error: ECONNREFUSED的根本原因,因为根据 Chrome浏览器虚拟元素/ iframe 可能未完全生成/创建/渲染 / em>启动日志:

[1517231304.270][DEBUG]: DEVTOOLS COMMAND Runtime.evaluate (id=11) {
   "expression": "var isLoaded = document.readyState == 'complete' ||    document.readyState == 'interactive';if (isLoaded) {  var frame = document.createElement('iframe');  frame.name = 'chromedriver dummy frame'; ..."
}

此问题依次导致以下行:

webElement.getAttribute('style')

导致实际错误。


解决方案

为了进行更清洁的测试,您可能需要将PageLoadStrategy用作 normal ,而不是:

capabilities.setPageLoadStrategy('normal');

Outro

一些相关的讨论: