我在电子桌面应用程序中使用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),一切看起来都很好:
我做了更多的调试,发现可能是这样的:
webElement.getAttribute('style')
是有时导致了我的错误。当我删除上面的内容时(当然还有.then()
和.catch
之后),错误停止发生。但是我不知道获取webElement的内联样式可能与拒绝连接错误有关。
答案 0 :(得分:2)
您使用了以下功能:
capabilities.setPageLoadStrategy('eager');
之前,在几个质量检查中,我们讨论了将PageLoadStrategy
用作 ChromeDriver 和 Chrome 的 eager
:
结论是,根据WebDriver Status,您将根据{中的内容在 ChromeDriver 中找到所有 WebDriver命令的列表及其当前支持。 {3}}。一旦从各个方面完成了实现后, PageLoadStrategy.EAGER 势必会存在于 Chrome驱动程序中。
类似的讨论也活跃在bugs.chromium.org
和groups.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');
一些相关的讨论: