Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 5x 5x 5x 1x 1x 1x 4x 4x 4x 4x 4x 1x 3x 1x 1x 2x 4x |
/**
*
* This command helps you to debug your integration tests. It stops the running browser and gives
* you time to jump into it and check the state of your application (e.g. using dev tools).
* Your terminal transforms into a [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop)
* interface that will allow you to try out certain commands, find elements and test actions on
* them.
*
* [](https://webdriver.io/img/repl.gif)
*
* If you run the WDIO testrunner make sure you increase the timeout property of the test framework
* you are using (e.g. Mocha or Jasmine) in order to prevent test termination due to a test timeout.
* Also avoid executing the command with multiple capabilities running at the same time.
*
* <iframe width="560" height="315" src="https://www.youtube.com/embed/xWwP-3B_YyE" frameborder="0" allowfullscreen></iframe>
*
* <example>
:debug.js
it('should demonstrate the debug command', () => {
$('#input').setValue('FOO')
browser.debug() // jumping into the browser and change value of #input to 'BAR'
const value = $('#input').getValue()
console.log(value) // outputs: "BAR"
})
* </example>
*
* @alias browser.debug
* @type utility
*
*/
import serializeError from 'serialize-error'
import WDIORepl from '@wdio/repl'
export default function debug(commandTimeout = 5000) {
const repl = new WDIORepl()
const { introMessage } = WDIORepl
/**
* run repl in standalone mode
*/
if (!process.env.WDIO_WORKER) {
// eslint-disable-next-line
console.log(WDIORepl.introMessage)
const context = {
browser: this,
driver: this,
$: ::this.$,
$$: ::this.$$
}
return repl.start(context)
}
/**
* register worker process as debugger target
*/
process._debugProcess(process.pid)
/**
* initialise repl in testrunner
*/
process.send({
origin: 'debugger',
name: 'start',
params: { commandTimeout, introMessage }
})
let commandResolve = /* istanbul ignore next */ () => {}
process.on('message', (m) => {
if (m.origin !== 'debugger') {
return
}
if (m.name === 'stop') {
process._debugEnd(process.pid)
return commandResolve()
}
/* istanbul ignore if */
if (m.name === 'eval') {
repl.eval(m.content.cmd, global, null, (e, result) => {
if (e) {
process.send({
origin: 'debugger',
name: 'result',
params: {
error: true,
...serializeError(e)
}
})
}
/**
* try to do some smart serializations
*/
if (typeof result === 'function') {
result = `[Function: ${result.name}]`
}
process.send({
origin: 'debugger',
name: 'result',
params: { result }
})
})
}
})
return new Promise((resolve) => (commandResolve = resolve))
}
|