Protractor: 元素浏览器在 Node 8 上不起作用

创建于 2017-06-01  ·  65评论  ·  资料来源: angular/protractor

错误报告

  • 节点版本: 8.0.0
  • 量角器版本: 5.1.2
  • 角度版本: n/a
  • 浏览器: Chrome / chromedriver 2.29.0
  • 操作系统和版本Mac Sierra 10.12.5
  • 您的量角器配置文件n/a

安装 node v8.0.0 和 npm v5.0.0,全局重新安装量角器并运行webdriver-manager update ,我无法运行protractor --elementExplorer因为我收到以下错误:

protractor --elementExplorer
(node:76684) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
[11:04:10] I/hosted - Using the selenium server at http://localhost:4444/wd/hub
[11:04:11] I/protractor -
[11:04:11] I/protractor - ------- Element Explorer -------
[11:04:11] I/protractor - Starting WebDriver debugger in a child process. Element Explorer is still beta, please report issues at github.com/angular/protractor
[11:04:11] I/protractor -
[11:04:11] I/protractor - Type <tab> to see a list of locator strategies.
[11:04:11] I/protractor - Use the `list` helper function to find elements by strategy:
[11:04:11] I/protractor -   e.g., list(by.binding('')) gets all bindings.
[11:04:11] I/protractor -
module.js:487
    throw err;
    ^

Error: Cannot find module '_debugger'
    at Function.Module._resolveFilename (module.js:485:15)
    at Function.Module._load (module.js:437:25)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/protractor/built/debugger/debuggerCommons.js:1:82)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)

如果我恢复到节点 7.10.0,则不会出现此错误。

PRs plz! needs investigation

最有用的评论

团队是否有计划使用检查 API 或其他方法使此功能再次运行?

所有65条评论

我认为我们目前没有针对节点 8 进行测试,因此这可能会被破坏是有道理的。 感谢您提出这个问题!

我会在接下来的几天内尝试深入研究这个问题,但非常欢迎解决这个问题的 PR!

_debugger 和旧的 CLI 调试器在 Node 8 中被删除: https :

有任何更新吗?

我们能否知道 Node 8 支持的计划是什么? :)

Node v8 将在 10 月进入 LTS,也许我们可以获得更新?

https://github.com/nodejs/LTS#lts -schedule1

根据https://nodejs.org/en/docs/guides/debugging-getting-started/#legacy -debugger ,
node.js 团队正在将用户迁移到新的检查 API。

团队是否有计划使用检查 API 或其他方法使此功能再次运行?

我已经开始研究这个了。 以下是关于更新如何工作的一系列猜测:

据我所知,更改需要在debuggerCommons.js 中发生

而不是require('_debugger');它需要使用require('inspector');此处的文档)。 然后您可以打开检查器,创建一个会话,连接到它,然后使用session.postChrome DevTools 协议发送消息以添加断点。

当我有时间时,我会在 PR 上取得成功。

@phenomnomnominal嘿,太好了! 我可以知道你什么时候可以做 PR 吗? 由于此功能非常有用,如果可以尽快创建它会很棒。 它将大大加快我们的发展。
谢谢!

@phenomnomnominal嗨,我们最近计划支持 node 8.0,你目前解决这个问题的计划是什么?

只有我上面概述的。 我打算今晚破解它。

@phenomnomnominal太好了,非常感谢!

@phenomnomnominal嗨,到目前为止有任何更新吗?

我开始尝试,但是在尝试运行测试时遇到了 Selenium 问题(有什么提示吗?)。 星期二晚上我会有更多的时间。 新 API 完全不同,但我认为不会出现任何实际问题。

好,多谢。 我应该在周一之后有一些时间,也许在那之后我也可以研究一下。

我有……某处? 事实证明,调试调试器并不像我希望的那么简单。 @qiyigg你有机会看什么吗?

我今天去研究一下,谢谢!

今晚我也有更多的时间,我们可以稍后比较笔记。

您好,上周在这个问题上有什么进展吗? 它仍在发生。

对于量角器调试器/资源管理器,我们决定不在节点 8 中支持它。

  1. Protractor debugger/explorer 主要用于调试控制流中的测试; 但是控制流是我们不鼓励的(特别是我们在节点 8 中有原生的 async/await)并且最终会被弃用。
  2. 经过调查,我们发现它可能需要花费很多精力来修复它,并且根据原因 1 不值得这样做。
  3. 我们正在使用原生 async/await 和 chrome 检查器工具为节点 8 提供新的调试文档,这将提供比原始调试器更好的体验。
  4. @phenomnomnominal如果您对此有一些突破,我们想对其进行审查。 谢谢你的努力。

你有什么类型的 ETA 吗? 我们在我工作的地方为它争分夺秒。 试图教一些人有关 e2e 测试的知识,但我们没有办法进入调试模式并在发生故障的上下文中实际执行代码。 如果有其他方法可以做到这一点,请告诉我。

@KellyR-STCU
你好,
对于 node 版本 < 8,您可以使用原始调试过程/工具。
对于 node 版本 >=8,你可以遵循新的调试流程,它使用 Node.js 原生的 async/await 来处理异步调用(这样我们就不需要依赖控制流和旧的调试器),并使用 chrome 检查器(或任何其他节点调试器)进行调试

我们有一些文档来描述如何使用原生 async/await 和 chrome 检查器进行调试
禁用控制流的调试
如何使用异步/等待

希望能帮助到你

@qiyigg elementExplorer怎么样?

@monkpit出于同样的原因,它在 Node 8 中不起作用。 我们没有完全替代它,但是您可以在调试时打开和使用chrome开发工具,它不会像我们之前遇到的量角器调试冲突。

@qiyigg好的,因为

该解决方案也有点问题,因为它需要重写现有测试,因为“您不能混合使用 async/await 和控制流”。 如果您可以指定每次测试采用哪种方法以便切换不需要更新所有现有测试,那就太好了。

@uriah-上升
是的,我不得不承认这不是一个完美的解决方案。 但正如我上面提到的,控制流最终会被删除。 将我们的测试转换为 async/await 是我们应该逐渐做的事情,它确实给了我们更好的调试体验。
我想你可以做的一种方法是为新测试设置一个单独的测试配置,然后逐渐转换它们。

@qiyigg是否有一些指南或文档如何转换为 async/await?

他提供的这两个链接中的信息非常好,标题为禁用控制流的调试
如何使用异步/等待

第二个可能更像是一步一步的转换。

在 Node 8 上遇到browser.pause()问题后。

我遵循了禁用控制流

我没有在浏览器中运行node --inspect-brk bin/protractor <config_file>并进行调试,而是在终端中使用node inspect $(which protractor) <config_file>后跟debug> cont

现在我有browser.pause()等价物。

即使用debugger代替browser.pause()

只是为了检查:我们有一个大型量角器代码库,不能一次转换为 async/await。 解决这个问题的一个好方法是首先使用承诺链接来转换所有“异步”量角器操作,对吗? 无论是否启用控制流,这种方式都应该起作用。
谢谢 !

无论是否启用控制流,Promise 链都将起作用,但有时它有点混乱,您可能希望有一天将其改回 async/await?
所以我的建议是现在有两个单独的配置,将新的测试/转换后的测试放入禁用 control_flow 的新配置中并逐渐摆脱旧的

问题是我们在测试之间共享了很多函数,所以如果我们将这些函数迁移到 async await,我们将破坏所有使用它们并且尚未迁移到 async await 的测试(提示:很多)。 如果我们保留同一个函数的两个版本,我们就有可能让它们发生分歧。
所以在我看来,要么我们在移动到 async/await 之前将所有内容移动到 promise 链接作为中间步骤,要么我们设置 babel 来转换我们的测试代码库(使用类似的东西:https://stackoverflow.com/questions/ 28708975/transpile-async-await-proposal-with-babel-js ?),这样我们就可以编写 async/await 并将其转换为可以使用或不使用控制流运行的东西。
有谁知道以前是否这样做过?
无论如何,在自述文件中为大型代码库提供迁移路径似乎是个好主意......

说得有道理,其实我们最近也在考虑。
我曾与一个将大型代码库迁移到 async/await 的内部团队进行了交谈。
他们发现,如果他们将通用工具更改为 promise 链,并且他们已经放弃这样做,则会引入微妙的错误和竞争条件。
他们确实复制了一些常用的工具并将它们翻译成 async/await。 我不知道这是否是最好的解决方案,但正如你提到的,它会有一些发散风险
我们也在努力编写一些迁移工具以使其更容易,但这些工具可能无法在外部运行。

反正我们最近在做迁移计划,应该在不久的将来在某个地方给出一些迁移建议。

感谢您的回复,很高兴知道这是一个问题
被调查!
我认为创建一个具体问题来说明如何
迁移大型代码库,以便人们看到它正在被处理。

1 月 16 日 2018 19:58, “七一” [email protected]一个écrit:

说得有道理,其实我们最近也在考虑。
我曾与一个将大型代码库迁移到
异步/等待。
他们发现它会引入微妙的错误和竞争条件,如果他们
将 common utils 更改为 promise chain,他们已经放弃这样做了。
他们确实复制了一些常用的工具并将它们翻译成 async/await。 一世
不知道这是否是最好的解决方案,但正如你提到的,它会
有一些分歧风险
我们也在努力编写一些迁移工具以使其更容易,但是
这些工具可能无法在外部使用。

反正我们最近在做迁移计划,应该给一些
在不久的将来某个地方的移民建议。


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/angular/protractor/issues/4307#issuecomment-358068096
或静音线程
https://github.com/notifications/unsubscribe-auth/AHHOgiLEdFS-xZVcOKmO1EB-CID53cryks5tLPFagaJpZM4NtM1n
.

嗨,大家好! 有什么解决方法吗?

protractor - 5.2.2
nodejs - 9.3
protractor --elementExplorer
(node:72438) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
[19:15:43] I/local - Starting selenium standalone server...
[19:15:44] I/local - Selenium standalone server started at http://172.29.148.101:58279/wd/hub
[19:15:45] I/protractor -
[19:15:45] I/protractor - ------- Element Explorer -------
[19:15:45] I/protractor - Starting WebDriver debugger in a child process. Element Explorer is still beta, please report issues at github.com/angular/protractor
[19:15:45] I/protractor -
[19:15:45] I/protractor - Type <tab> to see a list of locator strategies.
[19:15:45] I/protractor - Use the `list` helper function to find elements by strategy:
[19:15:45] I/protractor -   e.g., list(by.binding('')) gets all bindings.
[19:15:45] I/protractor -
module.js:557
    throw err;
    ^

Error: Cannot find module '_debugger'
    at Function.Module._resolveFilename (module.js:555:15)
    at Function.Module._load (module.js:482:25)
    at Module.require (module.js:604:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/usr/local/lib/node_modules/protractor/built/debugger/debuggerCommons.js:1:82)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
[19:15:45] I/local - Shutting down selenium standalone server.
MB-219751:~ olekh$ 

还体验了Error: Cannot find module '_debugger' ,OSX。

这个问题已经开放了将近一年。 还是没有进展?

@ajklotz我可以确认它仍然只适用于 Node 7。我一直在使用nvm在 Node 版本之间切换以使用元素资源管理器。 这很痛苦,但它有效!

@ajklotz @monkpit @mraible如果您能够使用 Node 8 或更高版本运行,我建议您尝试执行以下操作:

  1. 观看此视频“量角器:新希望” https://youtu.be/6aPfHrSl0Qk?t=1051 ,特别是17:31左右开始
  2. 切换到使用 Node 8 或更高版本
  3. 将您的测试转换为使用 ES2017 async/await 关键字: https :
  4. SELENIUM_PROMISE_MANAGER: false,到您的 protractor.conf.js
  5. 使用新的debugger函数并使用 chrome 检查器进行调试: https :

我已经用我自己的量角器测试完成了这个并确认它有效。

@ajklotz @monkpit @mraible这是我将量角器测试转换为使用 async/await 的示例: https :

任何返回 Promise 的东西,你都会在它前面贴一个await ,例如:

  • .click()
  • .browser.wait()
  • .browser.get()
  • .getText()

如果函数调用了await ,则函数签名前必须有async

如果你用async调用一个函数,那么你必须await它。

这需要一段时间,但一旦你做到了,它就会起作用。

@rodrigc我的测试区域已经在使用 async/await,这个问题的关键是从命令行,除非你使用节点 7,否则protractor --elementExplorer不起作用。

FWIW,似乎像async/await这样的语言功能应该无关紧要。 也许作为权宜之计的交换是有道理的,但量角器并不意味着对这种风格的依赖。

@monkpit是的,你是完全正确的。 您的问题的根本原因是在这一行: https : _debugger模块,其中在 node8 上不可用。 因此,任何使用debuggerCommons.js都不能在 node8 上工作,包括elementExplorer

因此,如果您想使用 node8 或更高版本并使用量角器进行调试,关键是使用async/await并按照以下步骤操作: https :

旧的调试工具不起作用。

要么它不会得到修复(没关系,我可以使用变通方法),要么它会更新为使用节点 8+(这也很好)。 但我很想看到官方的回应。

@monkpit

我认为答案就在@qiyigg 的这条评论中。

对于量角器调试器/资源管理器,我们决定在节点 8 中不支持它...

根据我在与@qiyigg 交谈时从

我现在要关闭这个问题。 它仍然可以讨论。

@qiyigg我已经开始将新的debugger与 chrome 检查器和 node8 一起使用,并且运行良好。

量角器团队能否开始将使用debuggerCommon.js的旧调试代码的文档标记为DEPRECATED ? 我同意@monkpit 的观点,现在代码不适用于 node8,但它没有被标记为已弃用。 如果这个旧的调试代码永远不会被 node8 修复,那么最终应该删除它。

如果您查看调试文档,我们已经提到调试器无法在 Node 8 上运行
https://github.com/angular/protractor/blob/master/docs/debugging.md#enabled -control-flow
“注意:量角器调试器和元素浏览器不能用于 Node.js 8+”

要记住的一件事是:不是每个人都在使用 Node 8+,我们不能说调试器已被弃用并强制每个人都使用 async/await(尽管我们会在 google 内部这样做)。

显然,迁移到 Node 8+ 和 async/await 有很多好处,我们最终应该迁移到它,但这并不是一件容易的事,因为我们必须更改大量现有代码。 我们在 google 内部正在研究这个,并尝试积累更多关于迁移(甚至迁移工具)的经验,希望它最终也能帮助 google 以外的用户。

我认为我们现在可以做的是让这个错误更清楚,比如说,抛出一个异常:Node 8+ 不支持元素资源管理器/调试器,而不是“错误:找不到模块 '_debugger'”,一个 PR 会很欢迎。

@qiyigg我建议用粗体全部大写发出警告。 在那个页面上有点难以理解,因为有很多单词。

我对新的调试器非常满意,因为我可以使用 intellij 来运行我的测试。 这比元素浏览器(我更喜欢)要好得多,但使用我的 IDE 来调试测试是一个巨大的胜利。

@qiyigg我在一家生产大型品酒的公司工作。 因为我们将所有 UI 更改为使用 Angular(欢呼!),所以我们决定使用 Protractor 进行 UI E2E 测试(也欢呼)。 除了这些 E2E 测试之外,我们还有真正的端到端测试,可在实际运行的系统上运行。 该测试系统的所有测试用例都在 Microsft TFS 测试框架中指定,我们使用 DSL 来编写它们。 这个 DSL 通过一个交互式启动的量角器(元素浏览器)加载我们为 UI 编写的页面对象,并调用它们的方法来执行它的测试。

到目前为止,一切都很好,你会说,我们有数千个这样的测试,它们真正“作为用户”运行。 我从这次谈话中得出的结论是,元素资源管理器随新节点一起被删除(并且新节点是升级 Angular 所必需的)。 这也意味着我们的整个测试基地会突然停止工作。

我通过 async / wait 获得了更改,我们显然将重写我们的页面对象以支持它,但是没有真正的替代方法来远程插入量角器命令,对吗? 我将始终必须传入仅调用“调试器”的“测试”,然后直接与 chrome 通信以在我的页面对象上调用命令,然后运行到下一个“调试器”调用,然后我可能必须运行在一个while循环中。

不支持这样的场景吗? 他们不会吗? 或者我只是遗漏了什么......对我来说,调试测试/代码中的错误与远程指导测试命令完全不同。 后者是元素资源管理器用来促进的东西:)

为了至少分享我当前的解决方案是什么,我编写了这个测试,这是我使用量角器运行的唯一系统测试(CompletableFuture 显然是一个辅助类):

jasmine.DEFAULT_TIMEOUT_INTERVAL = 3600000; // arbitrary large timeout
(global as any).systemTestsDone = new CompletablePromise<void>();

describe('TestHelper', () => {
  it('should provide a way to interactively run tests', async () => {
    await (global as any).systemTestsDone;
  });
});
node --inspect .\node_modules\protractor\bin\protractor .\systemTests\protractor.conf.js

然后,当我连接作为测试规范和页面对象之间桥梁的 (C#) WS 客户端时,此测试将继续运行。 这个桥然后指示浏览器加载页面对象并开始执行测试。

我发送给浏览器的最后一个命令当然是

global.systemTestsDone.complete()

以便测试正常完成。 我不认为这真的很糟糕,唯一奇怪的是我现在必须滥用测试才能进入交互模式。 如果更多的人缺少这样的功能,再次将它包含在量角器中可能是个好主意。 我不是指整个 devtools 协议,而是在您使用 chrome 或 Visual Studio 代码的控制台作为“元素浏览器”时让量角器保持运行的选项。

添加@vikerman ,他将接管 Protractor 的东西。

@vikerman我应该根据上述评论提出功能请求吗?

简而言之,我想要在量角器中拥有的(因为--elementExplorer不再使用最近的 node.js 版本)是一种模式,它只启动量角器,忽略规范文件并一直运行直到一些手动方法调用(类似于protractor.exit() ?)。 我们可以在这种模式下使用node --inspect启动量角器,加载一些页面对象并将外部测试运行器连接到调试器协议并以交互方式运行测试。

如果有人解决这个问题,那就太好了。 我目前正在使用 nvm 作为解决方法。
我使用 nvm 安装节点 7.10.1 并从那里启动 elementExplorer。
有点蹩脚的解决方法,但它现在有效

我降级到节点 v6 以使其正常工作,现在我无法运行我的 Angular 6 应用程序,因为 Angular 6+ 不支持节点 6。 看起来 Angular 现在的目标节点 >= 8.9.0。

是否有一个很好的解决方法,我可以遵循它来获得量角器 REPL,而不必运行两个版本的节点?

我在控制台中遇到了同样的错误。 我正在遵循此处给出的这些说明
https://github.com/angular/protractor/blob/master/docs/debugging.md#enabled -control-flow

但仍然出现同样的错误👎

那么这是 browser.pause() / browser.debugger() 的结束吗? 看来我们应该远离控制流并使用节点调试器。
https://github.com/angular/protractor/blob/master/docs/debugging.md

使用 NVM 切换到节点版本 7.10.1 为我修复了 browser.pause() 问题。

我知道 async/await 是前进的方向,并且使用 Webstorm 调试带断点的测试绝对是无缝的,但是我觉得elementExplorer的缺失是它在
使用 nodejs 8+ 的给定调试过程,当检查器在断点处暂停时,来自控制台的命令不会解析 promise,我意识到这是违反直觉的,但这一切都意味着花费在编写/调试测试,并丢失了广泛使用的功能(按此线程上的响应数量计算)。
是否有计划替代量角器中旧的 elementExplorer 功能?

@ woppa684建议对我来说效果很好。 谢谢@woppa684。 我刚刚移动到具有 repl-await 的节点 10+(因此您可以在控制台中等待)

添加了我所有的配置文件以供参考,希望对某人有所帮助:

特殊的交互式调试规范——interactive.e2e.ts

import { LoginPage } from './src/pages/login.po';
import { AppPage } from './src/pages/app.po';
import { SwitchProfileSideSheet } from './src/side-sheets/switch-profile-side-sheet.po';
import { sel } from '../src/testing/get-component';

const login = new LoginPage();
const app = new AppPage();
const switchProfileSideSheet = new SwitchProfileSideSheet();

// add my own page objects to the global object so I can use them interactively.
global['sel'] = sel;
global['po'] = {
  login,
  app,
  switchProfileSideSheet,
};

(global as any).systemTestsDone = new Promise(function(_resolve, _reject) {
  global['finishInteractiveDebug'] = _resolve;
});

describe('TestHelper', () => {
  it('should provide a way to interactively run tests', async () => {
    await (global as any).systemTestsDone;
  });
});

包.json

    "e2e-interactive": "node --experimental-repl-await --inspect-brk ./node_modules/.bin/protractor ./e2e/protractor.interactive.conf",

量角器.interactive.conf.js

// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

// standard protractor config
const baseConfig = require('./protractor.conf');
const configCopy = Object.assign({}, baseConfig.config);

const oneDayInMilliSeconds = 1000 * 60 * 60 * 24;
// set timeout to a huge number
// so it's not an issue when we pause in the debugger
configCopy.allScriptsTimeout = oneDayInMilliSeconds;
configCopy.jasmineNodeOpts.defaultTimeoutInterval = oneDayInMilliSeconds;
// just load our interactive specs
configCopy.specs = ['./interactive.e2e.ts'];

console.log('interactive config', configCopy);
exports.config = configCopy;

我使用browser.sleep(100000)而不是browser.pause()

此页面是否有帮助?
0 / 5 - 0 等级