8.0.0
5.1.2
n/a
Chrome / chromedriver 2.29.0
Mac Sierra 10.12.5
n/a
๋
ธ๋ 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์ผ๋ก ๋๋๋ฆฌ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ํ์ฌ ๋ ธ๋ 8์ ๋ํด ํ ์คํธํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ๊ณ ์ฅ๋ ์ ์๋ค๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ์ฌ๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋๋ ์์ผ๋ก ๋ฉฐ์น ์์ ์ด ๋ฌธ์ ๋ฅผ ํํค์น๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ด์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ PR์ ๋งค์ฐ ํ์๋ฐ์ ๊ฒ์ ๋๋ค!
_debugger ๋ฐ ๋ ๊ฑฐ์ CLI ๋๋ฒ๊ฑฐ๊ฐ ๋ ธ๋ 8์์ ์ ๊ฑฐ๋์์ต๋๋ค. https://github.com/nodejs/node/commit/90476ac6ee
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋ ธ๋ 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 ํ์ ์ฌ์ฉ์๋ฅผ ์๋ก์ด inspect API๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๊ณ ์์ต๋๋ค.
๊ฒ์ฌ API ๋๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ๋ค์ ์ํํ ๊ณํ์ด ์์ต๋๊น?
๋์ผํ ์ค๋ฅ https://github.com/node-inspector/node-inspector/issues/1025#issuecomment -339202842
๋ฒ์จ 4๊ฐ์
๋ํ https://stackoverflow.com/questions/44662442/node-inspector-not-starting
์ด๊ฒ์ ๋ํด ์์๋ณด๊ธฐ ์์ํ์ต๋๋ค. ๋ค์์ ์ ๋ฐ์ดํธ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ถ์ธก์ ๋๋ค.
๋ด๊ฐ ๋งํ ์์๋ ํ ๋ณ๊ฒฝ ์ฌํญ์ debuggerCommons.js ์์ ๋ฐ์ํด์ผํฉ๋๋ค.
require('_debugger');
๋์ require('inspector');
( ๋ฌธ์๋ ์ฌ๊ธฐ )๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ด๊ณ ์ธ์
์ ๋ง๋ค๊ณ ์ฐ๊ฒฐํ ๋ค์ session.post
๋ฐ Chrome DevTools ํ๋กํ ์ฝ ์ ์ฌ์ฉํ์ฌ ์ค๋จ์ ์ ์ถ๊ฐํ๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
์๊ฐ๋๋ฉด PR์ข ํด๋ด์ผ๊ฒ ์ต๋๋ค.
@phenomnominal ์ด์ผ ๋๋จํ๋ค! PR์ ํ ์ ์๋ ์๊ฐ์ ์ ์ ์์ต๋๊น? ์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ์ ์ฉํ๋ฏ๋ก ๊ณง ๋ง๋ค ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์ ๋ฐ์ ์ ๋งค์ฐ ๊ฐ์ํํ ๊ฒ์
๋๋ค.
๊ฐ์ฌ ํด์!
@phenomnominal ์๋ ํ์ธ์, ์ต๊ทผ์ ๋ ธ๋ 8.0์ ์ง์ํ ๊ณํ์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ฌ ๊ณํ์ ๋ฌด์์ ๋๊น?
์์์ ์ค๋ช ํ ๋ด์ฉ๋ง. ๋๋ ์ค๋ ์ ๋ ์ ๊ธ์์ ํ ๊ณํ์ด์๋ค.
@phenomnominal ๊ต์ฅ ํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค!
@phenomnominal ์๋ ํ์ธ์, ์ง๊ธ๊น์ง ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์์ํ์ง๋ง ํ ์คํธ๋ฅผ ์คํํ๋ ค๊ณ ํ ๋ Selenium์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค(ํ์ด ์์ต๋๊น?). ํ์์ผ ๋ฐค์ ์ข ๋ ์๊ฐ์ ๋ด๊ฒ ์ต๋๋ค. ์ API๋ ์๋นํ ๋ค๋ฅด์ง๋ง ์ค์ ๋ฌธ์ ๋ ์์๋์ง ์์ต๋๋ค.
๊ทธ๋, ์ ๋ง ๊ณ ๋ง์. ์์์ผ ์ดํ์ ์๊ฐ์ด ์ข ์์ ๊ฒ ๊ฐ์๋ฐ ๊ทธ ์ดํ์ ์์๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์์.
๋...์ด๋๊ฐ? ๋๋ฒ๊ฑฐ ๋๋ฒ๊น ์ด ๋ด๊ฐ ๊ธฐ๋ํ๋ ๊ฒ๋งํผ ๊ฐ๋จํ์ง ์๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. @qiyigg ๋ณผ ๊ธฐํ๊ฐ ์์๋์?
์ค๋ ์์๋ณด๊ฒ ์ต๋๋ค ๊ฐ์ฌํฉ๋๋ค!
์ค๋ ์ ๋ ์๋ ์๊ฐ์ด ์ข ๋ ์์ ๊ฒ์ ๋๋ค. ๋์ค์ ๋ฉ๋ชจ๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์, ์ง๋ ์ฃผ์ ์ด ๋ฌธ์ ์ ๋ํด ์ด๋ค ์ง์ ์ด ์์์ต๋๊น? ๊ทธ๊ฒ์ ์ฌ์ ํ โโ๋ฐ์ํ๊ณ ์์ต๋๋ค.
๊ฐ๋๊ธฐ ๋๋ฒ๊ฑฐ/ํ์๊ธฐ์ ๊ฒฝ์ฐ ๋ ธ๋ 8์์ ์ง์ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ด์ ๋ํ ETA๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ๋ด๊ฐ ์ผํ๋ ๊ณณ์์ ๊ทธ๊ฒ์ ์ํด ์กฐ๊ธ ์น๊ณ ์์ต๋๋ค. ์ผ๋ถ ์ฌ๋๋ค์๊ฒ e2 ํ ์คํ ์ ๋ํด ๊ฐ๋ฅด์น๋ ค๊ณ ํ๋ฉด ๋๋ฒ๊ทธ ๋ชจ๋๋ก ์ ํํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ปจํ ์คํธ์์ ์ค์ ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด ์ธ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
@KellyR-STCU
์๋
ํ์ธ์,
๋
ธ๋ ๋ฒ์ < 8์ ๊ฒฝ์ฐ ์๋ ๋๋ฒ๊น
ํ๋ก์ธ์ค/๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋
ธ๋ ๋ฒ์ ์ด >=8์ธ ๊ฒฝ์ฐ Node.js ๊ธฐ๋ณธ async/await๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ํธ์ถ์ ์ฒ๋ฆฌํ๋ ์๋ก์ด ๋๋ฒ๊น
ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด๊ณ (์ ์ด ํ๋ฆ ๋ฐ ์ด์ ๋๋ฒ๊ฑฐ์ ์์กดํ ํ์๊ฐ ์๋๋ก) chrome inspector( ๋๋ ๋ค๋ฅธ ๋
ธ๋ ๋๋ฒ๊ฑฐ) ๋๋ฒ๊ทธ
๋ค์ดํฐ๋ธ async/await ๋ฐ chrome inspector๋ก ๋๋ฒ๊น
ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ๋ฌธ์๊ฐ ์์ต๋๋ค.
์ ์ด ํ๋ฆ์ด ๋นํ์ฑํ๋ ๋๋ฒ๊น
๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@qiygg elementExplorer ๋ ์ด๋ป์ต๋๊น?
@monkpit ๊ฐ์ ์ด์ ๋ก ๋ ธ๋ 8์์๋ ์๋ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์์ ํ ๋์ฒดํ ์ ์์ง๋ง ๋๋ฒ๊น ํ๋ ๋์ ํฌ๋กฌ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ด๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ๊ณผ ๊ฐ์ด ๊ฐ๋๊ธฐ ๋๋ฒ๊น ๊ณผ ์ถฉ๋ํ์ง ์์ต๋๋ค.
@qiyigg ok,
์ด ์๋ฃจ์ ์ "async/await์ ์ ์ด ํ๋ฆ์ ํผํฉํ์ฌ ์ฌ์ฉํ ์ ์๊ธฐ" ๋๋ฌธ์ ๊ธฐ์กด ํ ์คํธ๋ฅผ ๋ค์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ๋ฌธ์ ์ด๊ธฐ๋ ํฉ๋๋ค. ์ ํ ์ ๊ธฐ์กด์ ๋ชจ๋ ํ ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋๋ก ํ ์คํธ๋ณ๋ก ์ทจํ ์ ๊ทผ ๋ฐฉ์์ ์ง์ ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@uriah-ascend
์, ๋๋ ๊ทธ๊ฒ์ด ์๋ฒฝํ ํด๊ฒฐ์ฑ
์ด ์๋๋ผ๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์์ ์ธ๊ธํ๋ฏ์ด ์ ์ด ํ๋ฆ์ ๊ฒฐ๊ตญ ์ ๊ฑฐ ๋ ๊ฒ์
๋๋ค. ํ
์คํธ๋ฅผ async/await๋ก ๋ณํํ๋ ๊ฒ์ ์ ์ง์ ์ผ๋ก ์ํํด์ผ ํ๋ ์์
์ด๋ฉฐ ๋ ๋์ ๋๋ฒ๊น
๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๋น์ ์ด ํ ์ ์๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋ก์ด ํ
์คํธ์ ๋ํด ๋ณ๋์ ํ
์คํธ ๊ตฌ์ฑ์ ๊ฐ๊ณ ์ ์ง์ ์ผ๋ก ๋ณํํ๋ ๊ฒ์
๋๋ค.
@qiyigg ๋น๋๊ธฐ/๋๊ธฐ๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ์ด๋๋ ๋ฌธ์๊ฐ ์์ต๋๊น?
๊ทธ๋ ์ ์ด ํ๋ฆ์ ๋นํ์ฑํ ํ๊ณ ์ป์์ต๋๋ค.
๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋ ๋ฒ์งธ ๊ฒ์ ์๋ง๋ ์ ํ์ ์ํ ๋จ๊ณ๋ณ ๋จ๊ณ์ผ ๊ฒ์ ๋๋ค.
๋
ธ๋ 8์์ browser.pause()
์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ
๋๋ Disabled Control Flow๋ฅผ ๋ฐ๋๋ค.
node --inspect-brk bin/protractor <config_file>
๋ฅผ ์คํํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฒ๊น
ํ๋ ๋์ ํฐ๋ฏธ๋์์ node inspect $(which protractor) <config_file>
๋ค์์ debug> cont
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด์ browser.pause()
์์ต๋๋ค.
์ฆ ์ฌ์ฉ debugger
๋์ ์ browser.pause()
ํ์ธํ๊ธฐ ์ํด: ํ ๋ฒ์ async/await๋ก ๋ณํํ ์ ์๋ ํฐ ๊ฐ๋๊ธฐ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์์ต๋๋ค. ์ด์ ๋ํ ์ข์ ๋ฐฉ๋ฒ์ ๋จผ์ ์ฝ์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ "๋น๋๊ธฐ" ๊ฐ๋๊ธฐ ์์
์ ๋ณํํ๋ ๊ฒ์
๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ ์ด ํ๋ฆ์ด ํ์ฑํ๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์๋ํด์ผ ํฉ๋๋ค.
๊ฐ์ฌ ํด์ !
Promise Chaining์ ์ ์ด ํ๋ฆ์ด ํ์ฑํ๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์๋ํ์ง๋ง ๋๋ก๋ ์ง์ ๋ถํ๊ณ ์ธ์ ๊ฐ ๋ค์ async/await๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ต๋๊น?
๊ทธ๋์ ๋ด ์ ์์ ์ง๊ธ ๋ ๊ฐ์ ๋ณ๋ ๊ตฌ์ฑ์ ๊ฐ๋ ๊ฒ์
๋๋ค. ์๋ก์ด ํ
์คํธ/๋ณํ๋ ํ
์คํธ๋ฅผ ์ ๊ตฌ์ฑ์ ๋ฃ์ด control_flow๋ฅผ ๋นํ์ฑํํ๊ณ ์ด์ ๊ตฌ์ฑ์ ์ ์ง์ ์ผ๋ก ์ ๊ฑฐํฉ๋๋ค.
๋ฌธ์ ๋ ํ
์คํธ ๊ฐ์ ๋ง์ ๊ธฐ๋ฅ์ ๊ณต์ ํ๋ฏ๋ก ์ด๋ฌํ ๊ธฐ๋ฅ์ async await๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ฉด ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ async await๋ก ๋ง์ด๊ทธ๋ ์ด์
๋์ง ์์ ๋ชจ๋ ํ
์คํธ๊ฐ ์ค๋จ๋๋ค๋ ๊ฒ์
๋๋ค(ํํธ: A LOT). ๊ทธ๋ฆฌ๊ณ ๋์ผํ ๊ธฐ๋ฅ์ ๋ ๊ฐ์ง ๋ฒ์ ์ ์ ์งํ๋ฉด ์๋ก ๋ค๋ฅผ ์ํ์ด ์์ต๋๋ค.
๊ทธ๋์ async/await๋ก ์ด๋ํ๊ธฐ ์ ์ ์ค๊ฐ ๋จ๊ณ๋ก ๋ชจ๋ ๊ฒ์ promise chaining์ผ๋ก ์ฎ๊ธฐ๊ฑฐ๋ ํ
์คํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ณํํ๋๋ก babel์ ์ค์ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค(์: https://stackoverflow.com/questions/ 28708975/transpile-async-await-proposal-with-babel-js ?), async/await๋ฅผ ์์ฑํ๊ณ ์ ์ด ํ๋ฆ์ด ์๊ฑฐ๋ ์์ด ์คํํ ์ ์๋ ๊ฒ์ผ๋ก ๋ณํ๋๋๋ก ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์ ์ ์ํ๋์๋์ง ์๋ ์ฌ๋์ด ์์ต๋๊น?
์ด์จ๋ readme์ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ๋ํ ๋ง์ด๊ทธ๋ ์ด์
๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค...
์ฌ์ค ์ฐ๋ฆฌ๋ ์ต๊ทผ์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค.
๋๊ท๋ชจ ์ฝ๋ ๊ธฐ๋ฐ์ async/await๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ด๋ถ ํ๊ณผ ์ด์ผ๊ธฐํ ์ ์ด ์์ต๋๋ค.
๊ทธ๋ค์ ๊ณตํต ์ ํธ๋ฆฌํฐ๋ฅผ ์ฝ์ ์ฒด์ธ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ด๋ฏธ ๊ทธ๋ ๊ฒํ๊ธฐ๋ฅผ ํฌ๊ธฐํ๋ฉด ๋ฏธ๋ฌํ ๋ฒ๊ทธ์ ๊ฒฝ์ ์กฐ๊ฑด์ด ๋์
๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทธ๋ค์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ณต์ฌํ์ฌ async/await๋ก ๋ณํํ์ต๋๋ค. ๊ทธ๊ฒ์ด ์ต์ ์ ํด๊ฒฐ์ฑ
์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋น์ ์ด ์ธ๊ธํ๋ฏ์ด ์ฝ๊ฐ์ ๋ฐ์ฐ ์ํ์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ํ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ง์ด๊ทธ๋ ์ด์
๋๊ตฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ง๋ง ๋๊ตฌ๋ ์ธ๋ถ์์ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
์ด์จ๋ , ์ฐ๋ฆฌ๋ ์ต๊ทผ ๋ง์ด๊ทธ๋ ์ด์ ๊ณํ์ ์ธ์ฐ๊ณ ์์ผ๋ฉฐ ๊ฐ๊น์ด ์ฅ๋์ ์ด๋๊ฐ์์ ๋ง์ด๊ทธ๋ ์ด์ ์กฐ์ธ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
๋ต๋ณํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์กฐ์ฌ ์ค!
๋ฐฉ๋ฒ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๋๋ค์ด ์์
์ค์ธ ๊ฒ์ ๋ณผ ์ ์๋๋ก ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํฉ๋๋ค.
Le 16 janv. 2018๋ 19์ 58๋ถ, "qiyi" [email protected] a รฉcrit :
์ฌ์ค ์ฐ๋ฆฌ๋ ์ต๊ทผ์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค.
๋๊ท๋ชจ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ค์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ด๋ถ ํ๊ณผ ์ด์ผ๊ธฐํ์ต๋๋ค.
๋น๋๊ธฐ/๊ธฐ๋ค๋ฆฝ๋๋ค.
๊ทธ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๋ฏธ๋ฌํ ๋ฒ๊ทธ์ ๊ฒฝ์ ์กฐ๊ฑด์ ๋์ ํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
common utils๋ฅผ promise chain์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ํฌ๊ธฐํ์ต๋๋ค.
๊ทธ๋ค์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ณต์ฌํ์ฌ async/await๋ก ๋ณํํ์ต๋๋ค. NS
๊ทธ๊ฒ์ด ์ต์ ์ ํด๊ฒฐ์ฑ ์ธ์ง๋ ๋ชจ๋ฅด์ง๋ง ๋น์ ์ด ์ธ๊ธํ๋ฏ์ด
์ฝ๊ฐ์ ๋ฐ์ฐ ์ํ์ด ์์ต๋๋ค
์ฐ๋ฆฌ๋ ๋ํ ๊ทธ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ง์ด๊ทธ๋ ์ด์ ๋๊ตฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ง๋ง,
๋๊ตฌ๋ ์ธ๋ถ์์ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.์ด์จ๋ , ์ฐ๋ฆฌ๋ ์ต๊ทผ ๋ง์ด๊ทธ๋ ์ด์ ๊ณํ์ ์งํ ์ค์ด๋ฉฐ ์ผ๋ถ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
๊ฐ๊น์ด ์ฅ๋์ ์ด๋๊ฐ์ ๋ง์ด๊ทธ๋ ์ด์ ์กฐ์ธ.โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ 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๋ ๊ฒฝํํ๊ณ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๊ฑฐ์ 1๋ ๋์ ๊ณต๊ฐ๋์์ต๋๋ค. ์์ง๋ ์ง์ ์ด ์์ต๋๊น?
@ajklotz ์ฌ์ ํ Node 7์์๋ง ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์์ ํ์๊ธฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด nvm ์ ์ฌ์ฉํ์ฌ Node ๋ฒ์ ๊ฐ์ ์ ํํ์ต๋๋ค. ๊ณ ํต์ค๋ฝ์ง๋ง ํจ๊ณผ๊ฐ ์์ต๋๋ค!
@ajklotz @monkpit @mraible Node 8 ์ด์์์ ์คํํ ์ ์๋ค๋ฉด ๋ค์์ ์๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
SELENIUM_PROMISE_MANAGER: false,
์ถ๊ฐdebugger
๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ํฌ๋กฌ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฒ๊ทธํ์ญ์์ค. https://github.com/angular/protractor/blob/master/docs/debugging.md#disabled -control-flow๋ด ์์ ์ ๊ฐ๋๊ธฐ ํ ์คํธ๋ก ์ด ์์ ์ ์ํํ์ผ๋ฉฐ ์๋ํ๋์ง ํ์ธํ์ต๋๋ค.
@ajklotz @monkpit @mraible ๋ค์์ ๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ๋๊ธฐ ํ ์คํธ๋ฅผ ๋ณํํ ์์ ๋๋ค. https://github.com/buildbot/buildbot/pull/4074/files
Promise๋ฅผ ๋ฐํํ๋ ๋ชจ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์์ await
๋ฅผ ๋ถ์
๋๋ค.
.click()
.browser.wait()
.browser.get()
.getText()
ํจ์์ await
ํธ์ถ์ด ์๋ ๊ฒฝ์ฐ ํจ์ ์๋ช
์์ async
๊ฐ ์์ด์ผ ํฉ๋๋ค.
async
๋ก ํจ์๋ฅผ ํธ์ถํ๋ฉด await
ํด์ผ ํฉ๋๋ค.
์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ์ง๋ง ์ผ๋จ ํด๋ณด๋ฉด ํจ๊ณผ๊ฐ ์์ต๋๋ค.
@rodrigc ์ด๋ฏธ async/await๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ด ํ
์คํธ ์์ญ์์ ์ด ๋ฌธ์ ์ ์์ ์ ๋
ธ๋ 7์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ช
๋ น์ค์์ protractor --elementExplorer
๊ฐ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
FWIW, async/await
์ ๊ฐ์ ์ธ์ด ๊ธฐ๋ฅ์ ์ด์จ๋ ๊ด๋ จ์ด ์์ด์ผ ํฉ๋๋ค. ์๋ง๋ ์์ ์์ ์ผ๋ก์์ ์ค์์ ์๋ฏธ๊ฐ ์์ง๋ง ๊ฐ๋๊ธฐ๋ ํด๋น ์คํ์ผ์ ๋ํ ์์กด์ฑ์ ์๋ฏธํ์ง ์์ต๋๋ค.
@monkpit ๋ค ์ ๋์ ์ผ๋ก ๋ง์ต๋๋ค. ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ https://github.com/angular/protractor/blob/master/lib/debugger/debuggerCommons.js#L1 ์ค์์ _debugger
๋ชจ๋์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์
๋๋ค. node8์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ elementExplorer
ํฌํจํ์ฌ debuggerCommons.js
๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒ์ node8์์ ์๋ํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ node8 ์ด์์ ์ฌ์ฉํ๊ณ ๊ฐ๋๊ธฐ๋ก ๋๋ฒ๊ทธํ๋ ค๋ฉด async/await
ํ๊ณ https://github.com/angular/protractor/blob/master/docs/ ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
์ด์ ๋๋ฒ๊น ํญ๋ชฉ์ด ์๋ํ์ง ์์ต๋๋ค.
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๊ฑฐ๋(๊ด์ฐฎ์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค) ๋ ธ๋ 8+๋ฅผ ์ฌ์ฉํ๋๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค(์ด๊ฒ๋ ๊ด์ฐฎ์). ํ์ง๋ง ์ด๋ค ์์ผ๋ก๋ ๊ณต์์ ์ธ ๋ต๋ณ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
@monkpit
๋ต์ @qiyigg์ ์ด ๋๊ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ๋๊ธฐ ๋๋ฒ๊ฑฐ/ํ์๊ธฐ์ ๊ฒฝ์ฐ ๋ ธ๋ 8์์ ์ง์ํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค...
@qiyigg์ ์ด์ผ๊ธฐ๋ฅผ ๋๋ด์ ๋ ๋ค์
์ง๊ธ์ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ฒ ์ต๋๋ค. ์์ง ๋ ผ์ ์ค์ ๋๋ค.
@qiyigg chrome inspector ๋ฐ node8์์ ์๋ก์ด debugger
๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๋๋ฐ ์ ์๋ํฉ๋๋ค.
๊ฐ๋๊ธฐ ํ์ debuggerCommon.js
๋ฅผ DEPRECATED ๋ก @monkpit์ ๋์ํ์ง๋ง ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ผ๋ก ํ์๋์ง๋ ์์ต๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ์ด ์ค๋๋ ๋๋ฒ๊น
์ฝ๋๋ node8๋ก ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ ์ญ์ ๋์ด์ผ ํฉ๋๋ค.
๋๋ฒ๊น
๋ฌธ์๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ ๋๋ฒ๊ฑฐ๊ฐ ๋
ธ๋ 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 ์ธ๋ถ ์ฌ์ฉ์์๊ฒ๋ ๋์์ด ๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ ์ด ์ค๋ฅ๋ฅผ ๋ ๋ช ํํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์์ธ๋ฅผ ๋์ง๋๋ค. "์ค๋ฅ: '_debugger' ๋ชจ๋์ ์ฐพ์ ์ ์์'" ๋์ Node 8+์ ๋ํด element explorer/debugger๊ฐ ์ง์๋์ง ์์ต๋๋ค. PR์ ๋งค์ฐ ํ์ํฉ๋๋ค.
@qiyigg ๊ฒฝ๊ณ ๋ฅผ ๊ตต๊ฒ ๋ชจ๋ ๋๋ฌธ์ ๋ก ํ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋จ์ด๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ด์ง์์ ํ์ ํ๊ธฐ๊ฐ ์ฝ๊ฐ ์ด๋ ต์ต๋๋ค.
intellij๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๋๋ฒ๊ฑฐ์ ์ ๋ง ๋ง์กฑํฉ๋๋ค. ์ด๊ฒ์ ์์ ํ์๊ธฐ(๋๋ ์คํ๋ ค ์ข์ํจ)๋ณด๋ค ํจ์ฌ ๋ซ์ง๋ง ํ ์คํธ๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ ์ํด ๋ด IDE๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํฐ ์น๋ฆฌ์ ๋๋ค.
@qiyigg ์ ๋
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ์์ฒ ๊ฐ์ ์ด๋ฌํ ํ ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ค์ ๋ก "์ฌ์ฉ์๋ก์" ์คํ๋ฉ๋๋ค. ์ด ๋ํ์์ ๋ด๊ฐ ๋ง๋ ๊ฒ์ ์์ ํ์๊ธฐ๊ฐ ์ ๋ ธ๋์ ํจ๊ป ์ญ์ ๋๋ค๋ ๊ฒ์ ๋๋ค(์ ๋ ธ๋๋ Angular๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ๋ฐ ํ์์ ๋๋ค). ์ด๊ฒ์ ๋ํ ๊ฐ์๊ธฐ ์ ์ฒด ํ ์คํธ ๊ธฐ๋ฐ์ด ์๋์ ๋ฉ์ถ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
async/wait๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์ป์๊ณ ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ํ์ด์ง ๊ฐ์ฒด๋ฅผ ๋ถ๋ช ํ ๋ค์ ์์ฑํ ๊ฒ์ด์ง๋ง ์๊ฒฉ์ผ๋ก ๊ฐ๋๊ธฐ ๋ช ๋ น์ ์ฝ์ ํ ์ ์๋ ์ค์ ๋์์ ์์ต๋๊น? ๋๋ ํญ์ "๋๋ฒ๊ฑฐ"๋ง ํธ์ถํ๋ "ํ ์คํธ"๋ฅผ ํต๊ณผํด์ผ ํ๊ณ ํฌ๋กฌ๊ณผ ์ง์ ํต์ ํ์ฌ ๋ด ํ์ด์ง ๊ฐ์ฒด์ ๋ํ ๋ช ๋ น์ ํธ์ถํ ๋ค์ ์๋ง๋ ์คํํด์ผ ํ ๋ค์ "๋๋ฒ๊ฑฐ" ํธ์ถ๋ก ์คํํด์ผ ํฉ๋๋ค. 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 ํ๋กํ ์ฝ์ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ ์๋ฅผ ๋ค์ด ํฌ๋กฌ ์ฝ์์ด๋ Visual Studio ์ฝ๋๋ฅผ "์์ ํ์๊ธฐ"๋ก ์ฌ์ฉํ๋ ๋์ ๊ฐ๋๊ธฐ๋ฅผ ๊ณ์ ์คํํ๋ ์ต์ ์ ์๋ฏธํฉ๋๋ค.
๊ฐ๋๊ธฐ๋ฅผ ์ธ์ํ @vikerman์ ์ถ๊ฐํฉ๋๋ค.
@vikerman ์ ๋๊ธ ์ค ๊ธฐ๋ฅ ์์ฒญ์ ํด์ผ ํ๋์?
๊ฐ๋จํ ๋งํด์, ๋ด๊ฐ ๊ฐ๋๊ธฐ์ ๊ฐ๊ณ ์ถ์ ๊ฒ์( --elementExplorer
๊ฐ ๋ ์ด์ ์ต๊ทผ node.js ๋ฒ์ ์์ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์) ๊ฐ๋๊ธฐ๋ฅผ ์์ํ๊ณ ์ฌ์ ํ์ผ์ ๋ฌด์ํ๊ณ ์๋ ๋ฉ์๋ ํธ์ถ์ด ์์ ๋๊น์ง ๊ณ์ ์คํ๋๋ ๋ชจ๋์
๋๋ค. ( protractor.exit()
?). ์ด ๋ชจ๋์์ node --inspect
๊ฐ๋๊ธฐ๋ฅผ ์์ํ๊ณ ์ผ๋ถ ํ์ด์ง ๊ฐ์ฒด๋ฅผ ๋ก๋ํ๊ณ ์ธ๋ถ ํ
์คํธ ์คํ๊ธฐ๋ฅผ ๋๋ฒ๊ฑฐ ํ๋กํ ์ฝ์ ์ฐ๊ฒฐํ๊ณ ๋ํ์์ผ๋ก ํ
์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ์ ๋ง ์ข์ ๊ฒ์
๋๋ค. ํ์ฌ nvm์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
nvm์ ์ฌ์ฉํ์ฌ ๋
ธ๋ 7.10.1์ ์ค์นํ๊ณ ๊ฑฐ๊ธฐ์์ elementExplorer๋ฅผ ์คํํฉ๋๋ค.
์ฝ๊ฐ์ ์ ๋ฆ๋ฐ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด์ง๋ง ์ง๊ธ์ ์๋ํฉ๋๋ค.
์ด ์์ ์ ์ํํ๊ธฐ ์ํด ๋ ธ๋ v6์ผ๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๋๋ฐ ์ด์ Angular 6+์์ ๋ ธ๋ 6์ด ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ Angular 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๊ฐ ์๋ค๊ณ ๋๋ผ๋ ๋ถ๋ถ์ elementor ํจํค์ง์์ ํ์ฅ๋ ์ฌ์ฉ์ผ๋ก ๋ถ๋ถ์ ๋ํ์์ผ๋ก ํ
์คํธํ๋ ์ฆ๊ฑฐ์ด ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ์ ์ฒด ํ
์คํธ๋ฅผ ์ฒ์๋ถํฐ ์คํํ๋ ๋์ ์ฆ์(๊ฒ์์ฃผ์์ฐฝ์์) ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
nodejs 8+์ ๋ํด ์ฃผ์ด์ง ๋๋ฒ๊น
ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์คํํฐ๊ฐ ์ค๋จ์ ์์ ์ผ์ ์ค์ง๋๋ ๋์ ์ฝ์์ ๋ช
๋ น์ด ์ฝ์์ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ๋๋ฒ๊น
ํ
์คํธ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ์์ค(์ด ์ค๋ ๋์ ์๋ต ์์ ๋ฐ๋ผ ๋ค๋ฆ).
๊ฐ๋๊ธฐ์์ ์ด์ elementExplorer ๊ธฐ๋ฅ์ ๋์ฒดํ ๊ณํ์ด ์์ต๋๊น?
@ woppa684 ์ ์์ด ์ ์๊ฒ ์ ์๋ํฉ๋๋ค. @woppa684 ๊ฐ์ฌํฉ๋๋ค. ๋ฐฉ๊ธ repl-await๊ฐ ์๋ ๋ ธ๋ 10+๋ก ์ด๋ํ์ต๋๋ค(์ฝ์์์ ๊ธฐ๋ค๋ฆด ์ ์์).
์ฐธ์กฐ์ฉ์ผ๋ก ๋ด ๋ชจ๋ ๊ตฌ์ฑ ํ์ผ์ ์ถ๊ฐํ์ต๋๋ค. ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
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;
});
});
"e2e-interactive": "node --experimental-repl-await --inspect-brk ./node_modules/.bin/protractor ./e2e/protractor.interactive.conf",
// 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()
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ฒ์ฌ API ๋๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ๋ค์ ์ํํ ๊ณํ์ด ์์ต๋๊น?