Ошибка веб-драйвера Selenium: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:9515 - PullRequest
1 голос
/ 16 марта 2019

Я использую селен NodeJS в своем электронном настольном приложении.

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

Я следовал электронной документации об использовании селена внутри электронного приложения, и у меня есть код, подобный этому:

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/.

Запуск ChromeDriver 69.0.3497.106 (857b284701ddf7bef0f14fa76416cf7ca786b411) на порту 9515
Только локальные подключенияразрешены.

Теперь, когда я запускаю весь код, он иногда работает правильно, но иногда он выдает ошибку в терминале, в котором I npm run dev электронное приложение:

Ошибка: ECONNREFUSEDconnect ECONNREFUSED 127.0.0.1:9515

Я прочитал несколько похожих SO вопросов, но ни один из них не помог.Я не очень понимаю, как это возможно, что какой-то кусок кода иногда работает и иногда вызывает ошибку.

Я также проверил порты 9515 (chromedriver) и 9080 (электронный узелJS) после получения ошибки ивсе выглядит хорошо:

alt


Я сделал еще несколько отладок и обнаружил, что , вероятно, это:

webElement.getAttribute('style')

- это иногда , вызывающее мою ошибку.Когда я удаляю выше (а также .then() и .catch после этого конечно) ошибка перестает происходить.Однако я не знаю, как получение встроенных стилей webElement может иметь отношение к отказано в соединении ошибка.

1 Ответ

2 голосов
/ 22 марта 2019

Вы использовали следующую возможность:

capabilities.setPageLoadStrategy('eager');

Ранее, в нескольких QA мы обсуждали о PageLoadStrategy как eager для ChromeDriver и Chrome :

В соответствии с WebDriver Status вы найдете список всех команд WebDriver и их текущая поддержка в ChromeDriver , основанная на спецификации WebDriver .Когда реализация завершена со всех сторон PageLoadStrategy.EAGER обязательно будет присутствовать в Chrome Driver .

Подобные обсуждения также были активнымина нескольких потоках в bugs.chromium.org и groups.google.com следующим образом:

Если вы посмотрите page_load_strategy.cc 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, который вы видите, поскольку фиктивные элементы / iframes могут небыли сгенерированы / созданы / отрисованы полностью в соответствии с Браузером Chrome Журналы запуска:

[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'; ..."
}

Эта проблема inturn вызывает строку:

webElement.getAttribute('style')

, чтобы вызвать фактическуюошибка.


Решение

Для более чистого теста вам может понадобиться PageLoadStrategy как normal вместо:

capabilities.setPageLoadStrategy('normal');

Outro

Некоторые соответствующие обсуждения:

...