browser.pause()和browser.enterRepl()之间有什么区别?

ale*_*cxe 23 javascript selenium angularjs selenium-webdriver protractor

在量角器中,有以下browser.pause()功能:

pause用于调试webdriver测试的Beta(不稳定)函数.在测试中使用browser.pause()从控制流中的那一点进入量角器调试器.

element(by.id('foo')).click();
browser.pause();
// Execution will stop before the next click action.
element(by.id('bar')).click();
Run Code Online (Sandbox Code Playgroud)

而且,还有一个鲜为人知的 - browser.enterRepl():

Beta(不稳定)enterRepl函数,用于从控制流中的任何点进入repl循环.在测试中使用browser.enterRepl().不需要更改命令行(无需添加'debug').

element(by.id('foo')).click();
browser.enterRepl();
// Execution will stop before the next click action.
element(by.id('bar')).click();
Run Code Online (Sandbox Code Playgroud)

从提供的文档和示例中可以清楚地看出它们都用于调试测试.但是,目前尚不清楚,两者之间有什么区别.

我们何时应该使用pause()何时enterRepl()

Mic*_*nov 34

它在一般的文档中有解释,但我会试着深入一点.

Protractor有两种调试模式:DebuggerReplCommandRepl.

这里的Repl代表Read-eval-print-loop,这通常意味着无论您键入什么命令,它都会立即在当前上下文中进行评估,并立即为您提供结果.例如,在控制台Chrome开发者工具是有点儿REPL对于Chrome的执行的JavaScript/DOM,或当您运行node在终端,你会得到一个REPLNode.js的的JavaScript方面-你可以输入命令并得到结果.


使用时,browser.pause()您正在激活DebuggerRepl.它为您提供了一个Repl,您可以在其中执行此模式的命令.您通常会在终端中看到此命令列表:

press c to continue to the next webdriver command
press d to continue to the next debugger statement
type "repl" to enter interactive mode
type "exit" to break out of interactive mode
press ^C to exit
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用c命令转到下一个WebDriver命令,或者使用命令跳转到browser.pause()测试中的下一个语句d.它们会在您使用时立即执行.因此,此模式基本上允许您跳过页面状态并探索结果.(注意:此模式提供了更多命令 ;它们确实有效,但我不确定它们的输出含义是什么,以及它们对Protractor用户是否有用.)


使用时,browser.enterRepl()您正在激活CommandRepl模式.它允许您使用您将在测试中使用的Protractor方法,但是在交互模式下.您可以访问element,browserprotractor对象,所以你可以运行,例如:

> $('.hello').getText();
> 'World'
Run Code Online (Sandbox Code Playgroud)

它会立即打印出结果,因此它是一个沙盒,您可以在其中查询当前页面状态的DOM 并查看结果.

您可能已经注意到,browser.pause()命令列表有一行:

type "repl" to enter interactive mode
Run Code Online (Sandbox Code Playgroud)

这意味着当您处于DebuggerRepl模式时,您可以执行repl命令以激活您刚刚运行的当前页面状态的CommandRepl模式,这样您就可以像使用刚才那样使用DOM .您可以使用该命令返回DebuggerRepl模式.但是如果您使用了进入CommandRepl模式,则无法切换到DebuggerRepl模式.browser.pause()browser.enterRepl()exitbrowser.enterRepl()

此外,可以使用名为elementExplorer的功能激活CommandRepl模式.它可以在没有任何笔试的情况下使用; 它只是在CommandRepl模式下打开一个URL .


TL;博士

总而言之,我相信它们应该根据它们的调用方式使用.

browser.pause() - 我希望浏览器在那个地方完全停顿,这样我就可以看到页面上发生了什么.然后,根据我的命令,我希望它跳转到下一个状态,这样我就可以看到这里发生了什么.如果我需要更多的信息,目前的状态,我可以运行repl,并使用量角器API(browser,element,protractor)进行调查.我可以然后exit这种模式继续跳过状态.

browser.enterRepl()-我想浏览器在那个地方正好暂停,让我调查使用页面量角器API(browser,element,protractor)向右走,我也不需要能够在页面的状态之间跳跃.

  • 这是一个非常好的解释!非常感谢!在这里创建了一个跟进问题:https://github.com/angular/protractor/issues/2349. (2认同)
  • 对于任何想要了解的人,可以在[这里]找到Michael描述的`elementExplorer`功能(https://github.com/angular/protractor/blob/master/docs/debugging.md#testing-out-protractor-交互).基本上,在你的控制台中运行`protractor --elementExplorer`,使用`browser.get('http://(url).com')`来加载一个网页,然后使用常规命令('element'将Protractor加入到你内心的内容中(by.css('a')).click()`等等. (2认同)