6.9.1
5.1.2
4.0.0
Chrome Version 57.0.2987.133 (64-bit)
OS X Version 10.10.5 (14F2315)
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/docs/referenceConf.js
/* Third-party */
let HtmlScreenshotReporter = require('protractor-jasmine2-screenshot-reporter');
let JUnitXmlReporter = require('jasmine-reporters').JUnitXmlReporter;
let SpecReporter = require('jasmine-spec-reporter').SpecReporter;
/* Custom */
let setup = require('./e2e/setup/setup');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
SELENIUM_PROMISE_MANAGER: false,
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
useAllAngular2AppRoots: true,
beforeLaunch: function() {
require('ts-node').register({
project: 'e2e'
});
},
onPrepare: function() {
jasmine.getEnv().addReporter(new SpecReporter());
jasmine.getEnv().addReporter(new JUnitXmlReporter({
consolidateAll: true,
savePath: browser.params.output || 'protractor/log',
filePrefix: 'protractor_output'
}));
jasmine.getEnv().addReporter(new HtmlScreenshotReporter({
cleanDestination: true,
dest: 'protractor/log',
filename: 'index.html'
}));
setup();
}
};
import { browser } from 'protractor';
import { A2Page } from './app.po';
import { NavPartial } from './nav/nav.po';
import { SettingsPage } from './settings/settings.po';
import { Utils } from './utils';
let utils = new Utils();
describe('a2 root', function() {
let page: A2Page = new A2Page();
let navPartial: NavPartial = new NavPartial();
let settingsPage: SettingsPage = new SettingsPage();
it('should be able to navigate to', () => {
return page.navigateTo();
});
it('should take user to Settings', () => {
return settingsPage.getTitle().then(title => {
return expect(title).toEqual('Title');
}).then(() => {
return settingsPage.getSubtitle();
}).then(subtitle => {
return expect(subtitle).toEqual('Subtitle');
});
});
it('should have a Home menu', () => {
return page.navigateTo().then(() => {
return navPartial.isHomePresent();
}).then(present => {
return expect(present).toBeTruthy();
});
});
it('should have an Info menu', () => {
return page.navigateTo().then(() => {
return navPartial.isInfoPresent();
}).then(present => {
return expect(present).toBeTruthy();
});
});
});
$ npm run e2e -- --params.baseUrl 'https://myurl'
> [email protected] pree2e /Users/me/a2
> webdriver-manager update
[13:56:14] I/update - chromedriver: file exists /Users/me/a2/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.29.zip
[13:56:14] I/update - chromedriver: unzipping chromedriver_2.29.zip
[13:56:14] I/update - chromedriver: setting permissions to 0755 for /Users/me/a2/node_modules/protractor/node_modules/webdriver-manager/selenium/chromedriver_2.29
[13:56:14] I/update - chromedriver: chromedriver_2.29 up to date
[13:56:14] I/update - selenium standalone: file exists /Users/me/a2/node_modules/protractor/node_modules/webdriver-manager/selenium/selenium-server-standalone-3.4.0.jar
[13:56:14] I/update - selenium standalone: selenium-server-standalone-3.4.0.jar up to date
[13:56:14] I/update - geckodriver: file exists /Users/me/a2/node_modules/protractor/node_modules/webdriver-manager/selenium/geckodriver-v0.16.1.tar.gz
[13:56:14] I/update - geckodriver: unzipping geckodriver-v0.16.1.tar.gz
[13:56:14] I/update - geckodriver: setting permissions to 0755 for /Users/me/a2/node_modules/protractor/node_modules/webdriver-manager/selenium/geckodriver-v0.16.1
[13:56:14] I/update - geckodriver: geckodriver-v0.16.1 up to date
> [email protected] e2e /Users/me/a2
> $(npm bin)/protractor "--params.baseUrl" "https://myurl"
[13:56:16] I/launcher - Running 1 instances of WebDriver
[13:56:16] I/direct - Using ChromeDriver directly...
Spec started
a2 root
â should be able to navigate to
â should take user to Settings
â should have a Home menu
â should have an Info menu
- Failed: EPIPE write EPIPE
**************************************************
* Failures *
**************************************************
1) a2 root should have an Info menu
- Failed: EPIPE write EPIPE
Executed 4 of 4 specs (1 FAILED) in 22 secs.
[13:56:41] I/launcher - 0 instance(s) of WebDriver still running
[13:56:41] I/launcher - chrome #01 failed 1 test(s)
[13:56:41] I/launcher - overall: 1 failed spec(s)
[13:56:41] E/launcher - Process exited with error code 1
npm ERR! Darwin 14.5.0
npm ERR! argv "/Users/me/.nvm/versions/node/v6.9.1/bin/node" "/Users/me/.nvm/versions/node/v6.9.1/bin/npm" "run" "e2e" "--" "--params.baseUrl" "https://myurl"
npm ERR! node v6.9.1
npm ERR! npm v3.10.8
npm ERR! code ELIFECYCLE
npm ERR! [email protected] e2e: `$(npm bin)/protractor "--params.baseUrl" "https://myurl"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] e2e script '$(npm bin)/protractor "--params.baseUrl" "https://myurl"'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the a2 package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! $(npm bin)/protractor "--params.baseUrl" "https://myurl"
npm ERR! You can get information on how to open an issue for this project with:
npm ERR! npm bugs a2
npm ERR! Or if that isn't available, you can get their info via:
npm ERR! npm owner ls a2
npm ERR! There is likely additional logging output above.
npm ERR! Please include the following file with any support request:
npm ERR! /Users/me/a2/npm-debug.log
ãŸããnpm-debug.logããã®æç²ïŒ
18 verbose stack Exit status 1
18 verbose stack at EventEmitter.<anonymous> (/Users/me/.nvm/versions/node/v6.9.1/lib/node_modules/npm/lib/utils/lifecycle.js:255:16)
18 verbose stack at emitTwo (events.js:106:13)
18 verbose stack at EventEmitter.emit (events.js:191:7)
18 verbose stack at ChildProcess.<anonymous> (/Users/me/.nvm/versions/node/v6.9.1/lib/node_modules/npm/lib/utils/spawn.js:40:14)
18 verbose stack at emitTwo (events.js:106:13)
18 verbose stack at ChildProcess.emit (events.js:191:7)
18 verbose stack at maybeClose (internal/child_process.js:877:16)
18 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
SELENIUM_PROMISE_MANAGER: false
ãèšå®ããŸãïŒå¶åŸ¡ãããŒãç¡å¹ã«ããŸãïŒãFailed: EPIPE write EPIPE
ãšã©ãŒãäºæããçºçãå§ããŸããç§ã¯awaitã䜿çšããŠããŸããã äžéšã®ã³ã¡ã³ãã§ææ¡ãããŠããŸããããã¹ãã³ãŒãã§ãæªåŠçã®promiseãç¹å®ã§ããŸããïŒpromiseã®çµéšããããŸãïŒããã®å¯èœæ§ãèæ ®ã«å ¥ããå¿ èŠããããŸãã ããã§ãããã®å ŽåãããŒããæªåŠçã®çŽæã§ã¯ã©ãã·ã¥ããã®ã¯é©ãã¹ãããšã§ãã ãããã£ãŠããã¹ããå床åšãWebãã©ã€ããŒãªã©ã«åé¡ãããããšã«å ããŠãããã®ã©ããã«ããŒãã®ãã°ãããããã§ãã
ç³ãèš³ãããŸããããå ¬éãããŠããŸããã
ç§ãããã«é »ç¹ã«ã¶ã€ãã£ãŠããŸãã Chromeãããã¯ã°ã©ãŠã³ãã«ããå Žåãããã¯ããé »ç¹ã«ãããããæä»çã«çºçããããã§ãã å¶ç¶ã®äžèŽãããããŸãã
ã¯ããç§ããã®éããšã©ãŒãåãåããŸããïŒ
ããã§å¿çãé ããããšããè©«ã³ããŸãã ç§ã¯ãããåçŸããããšã«æ £ããŠããŸããã ãããåçŸããAngular2ã¢ããªã®å°ããªãµã³ãã«ãªããžããªïŒhttps://github.com/NickTomlin/protractor-mcveãã¹ã¿ãŒã¿ãŒãšããŠäœ¿çšã§ããŸãïŒãæäŸã§ããŸããïŒ
å¶åŸ¡ãããŒãåé€ããããšã¯æ£ããæ¹åãžã®äžæ©ã§ãããããã¯ç§ãã¡ã説æããå¿ èŠãããããã€ãã®åé¡ïŒãã®ãããªãã®ïŒãæããã«ãããããããŸããã ããããšãïŒ
@NickTomlin @wcainboundary nodejsãææ°ã®å®å®ããŒãžã§ã³ã«ã¢ããã°ã¬ãŒããããšãããæ£åžžã«åäœããããã«ãªããŸããã
åäœããŸããã§ããïŒ
$node -v
v6.10.1
æ£åžžã«åäœããŸãïŒ
$node -v
v7.10.0
ããŒãv8.0.0ã§ãšã©ãŒãçºçããŠããŸã
ãã®ãšã©ãŒã¯å床åšãªãã§ãèŠãããŸãïŒã¹ãã¬ãŒã[email protected]ã§ããã®åã¯3.3ã ãšæããŸãïŒã OS Xã§ã¯çºçããŸãããããã«ããšãŒãžã§ã³ãïŒLinuxïŒã§ã¯é »ç¹ã«çºçããŸãã
ç§ã¯ãã®åé¡ãSeleniumã«å¯ŸããŠæèµ·ãããã®ãèŠãããšããããŸããããããããããããã¹ãã§ãã
OSXã§ãã®ãšã©ãŒãçºçããŸããã
ç§ã«ãšã£ãŠãåé¡ã¯ã¿ã€ãã³ã°ã«é¢é£ããŠããŸããã ç§ã®ãã¹ãã¯ãå©çšã§ããªãèŠçŽ ãšçžäºäœçšããããšããŠããŸããã è§åºŠã®ããã¿ã¹ã¯ã¯å®äºããŸããããããŒãžã®äžéšã®ã¬ã³ããªã³ã°ãå®äºããŠããªãã£ãããããã®åé¡ãçºçããŸããã æ¥ç¶ãé ãããããã¹ãã°ãªããã§ã®åçŸãç°¡åã§ããã
waitForAngularEnabledãtrueãšfalseã«èšå®ããŠããã確èªããŸããã
ã¢ããã°ã¬ãŒãããåã¯ãåããã¹ãã®ããã€ãã§ã¿ã€ã ã¢ãŠããšã©ãŒãçºçããŠããŸããã Webdriver3.xãåãããšãå¥ã®èšãæ¹ã§èšã£ãŠããã®ã§ã¯ãªãããšæããŸã...
ããã«+1ããOS X10.12.5ã§ããŒã«ã«ã«ã¹ããã¯ãå®è¡ãããšåãåé¡ãçºçããŸã
ãã®äŸ¡å€ã«ã€ããŠã¯ãEPIPEãšã©ãŒãçºçããå¯èœæ§ã¯äœããªããŸããã
ãããŠããå¯èœæ§ãäœãããšèšããšãã¯ãäžèšã®æ§æã§ã¹ã€ãŒãã7åå®è¡ãããšãã«ãChromeãã©ãŠã¶ãŒã«ããã«çŠç¹ãåãããChromeããã¯ã¢ã€ã³ã³ããããŠã¹ãåãããªãã£ãå Žåã4åã®å®è¡ãæåããããšãæå³ããŸãïŒããããé¢ä¿ãªãïŒã
ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ããã¹ãïŒTypeScriptã§ïŒãawait
ã誀ã£ãŠäœ¿çšããŠããããã EPIPE
ãšã©ãŒã衚瀺ãããŠããŸããã ãããã£ãŠãæªåŠçã®PromiseæåŠãã©ã³ãã ã«çºçãããããã®ãšã©ãŒãçºçããŠããŸããã 誀ã£ã䜿çšæ³ãä¿®æ£ãããšãããŒã8ã§ãããã®ãšã©ãŒãçºçããªããªããŸãã
await
ã®èª€ã£ã䜿çšæ³ïŒæ¬ èœãŸãã¯åé·ïŒãŸãã¯åã«èª€ã£ãPromiseãã§ãŒã³ïŒããšãã°ããã«ããŒã¡ãœããããPromiseãè¿ãã®ãå¿ããå ŽåïŒããªããããã¹ãã泚ææ·±ããã§ãã¯ããŠãã ããã ç§ãã¡ã®å Žåãå
žåçãªãšã©ãŒã¯ä»¥äžã䜿çšããŠããŸããïŒ
browser.wait(await EC.invisibilityOf(fade)); // incorrect
ãã以å€ã®ïŒ
await browser.wait(EC.invisibilityOf(fade)); // correct
å€åããã¯ãŸããã®åé¡ãæ±ããŠãã誰ããå©ããã§ãããã
ãã®åé¡ã¯ä¿®æ£ãããŸãããïŒ ããŒãããŒãžã§ã³7.7.3ãšå床åšããŒãžã§ã³5.1.1ã§ããŸã 衚瀺ãããŠããŸã
@ sri1987äžèšã®ç§ã®ã³ã¡ã³ããåç §ããŠãã ããã ããã¯ãå床åšã§ã¯ãªããã³ãŒãã«åé¡ãããå¯èœæ§ããããŸãã
@ sri1987äžè²«ããŠåçŸã§ããªãå Žåã¯ãã©ããawait
ãæ¬ èœããŠãã/äœåãªãã®ã§ããããšã«ééããªãé¢é£ããŠããŸãã
æè¿ãSELENIUM_PROMISE_ MANAGERïŒfalseã§ãããã®ãšã©ãŒãé »ç¹ã«çºçããŸã
è€æ°ã®ãã¹ããå®è¡ããå Žå
ãããšïŒ4507ã®åé¡ã¯ãåæWebãã©ã€ããŒã³ãã³ãã®ããã§ãã @wvanderdeijlã¯ãïŒ4508ã®ElementArrayFinder::map()
ã®ç¹å®ã®ã±ãŒã¹ã®è§£æ±ºçãææ¡ããŸããã ãããé©åã«è§£æ±ºããããŸã§ã次ã®browser.driver.schedule()
ã®ã©ãããŒã¯ãåæWebãã©ã€ããŒã³ãã³ããå®è¡ãããªãããã«ãã¥ãŒãäœæãããããåé¿çã«ãªãå¯èœæ§ããããŸãã
EPIPEãšã©ãŒãçºçããŠãã人ã¯å®æçã«ããããã¹ãã§ããŸããïŒ ãã¹ãã®å®è¡ãããçšåºŠé ããªãå¯èœæ§ããããŸãã
ããšãã°ã次ã®ã³ãŒãã¯å床åšã®onPrepare()
ããã¯ã§åŒã³åºãããšãã§ããŸãã
let currentCommand = Promise.resolve();
// Serialise all webdriver commands to prevent EPIPE errors
const webdriverSchedule = browser.driver.schedule;
browser.driver.schedule = (command: Command, description: string) => {
currentCommand = currentCommand.then(() =>
webdriverSchedule.call(browser.driver, command, description)
);
return currentCommand as any;
}
ãŸãã¯ããã€ãã®è¿œå ã®ãã°ã䜿çšããŠïŒ
let currentCommand = Promise.resolve();
let concurrencyCounter = 0;
// Serialise all webdriver commands to prevent EPIPE errors
const webdriverSchedule = browser.driver.schedule;
browser.driver.schedule = (command: Command, description: string) => {
console.log(`${++concurrencyCounter} concurrent webdriver command(s). Latest command: ${description}`);
currentCommand = currentCommand.then(() =>
webdriverSchedule.call(browser.driver, command, description)
.then(result => {
concurrencyCounter--;
return result;
})
.catch(error => {
concurrencyCounter--;
//console.lgErrLabel('Webdriver error')(command, description, error);
console.error('Webdriver error:', command, description, error);
throw error;
})
);
return currentCommand as any;
}
@renehamburger
ç§ã¯ããªããããã«ãããšæããŸãã ãšã©ãŒã®ã»ãšãã©ã¯Promise.allåŒã³åºããè¿ãé¢æ°ããçºçããŠããã®ã§ã䞊è¡æ§ãšé¢ä¿ãããã¯ãã§ãã
@renehamburgerããããšãããããŸãã ãããç§ã®protractor.conf.jsã®onPrepareã»ã¯ã·ã§ã³ã«è¿œå ããåŸïŒ
let currentCommand = Promise.resolve();
// Serialise all webdriver commands to prevent EPIPE errors
const webdriverSchedule = browser.driver.schedule;
browser.driver.schedule = (command, description) => {
currentCommand = currentCommand.then(() =>
webdriverSchedule.call(browser.driver, command, description)
);
return currentCommand;
};
ãšã©ãŒã倱æïŒEPIPEæžã蟌ã¿EPIPEãã¯ãªããªããŸããã
@ Xaz16 ïŒåé¿çãšããŠç§ãã¡ã®ããã«åããŠãããŠããããšãïŒ
ãããããEPIPE write EPIPEããšã©ãŒã¯ãSeleniumã®ãã°ã®ããã§ãïŒ https ïŒ//github.com/SeleniumHQ/selenium/issues/5345ããã¯4.0.0ã§è§£æ±ºãããŸãã
ãããã£ãŠãå床åšã4.0.0ããŒãžã§ã³ã䜿çšãããŸã§åŸ ã€å¿ èŠãããããã®åé¿çãåé€ã§ããŸãã
Protractor
ããŒãããããžã®ãªã³ã¯ã¯ãããŸããïŒ ãŸãã¯ããã¯ãŸã£ããååšããŸãã
@renehamburger ãæäŒã£ãŠããããŸããïŒ SELENIUM_PROMISE_MANAGER: false
ã®å Žåã«åããŠãåé¿çãæžãçŽãããšããŠããŸãã çŸåšããœãªã¥ãŒã·ã§ã³ãã³ããŒããŠè²Œãä»ããã ãã§ã async/await
ã䜿çšããŠè§£æ±ºã§ãããšæãããå¥åŠãªåé¡ããããããããŸãã
@CrispusDHã³ãŒãã¹ããããã次ã®ããã«å€æŽããå¿ èŠããããŸãã
let currentCommand = Promise.resolve();
// Serialise all webdriver commands to prevent EPIPE errors
const webdriverSchedule = browser.schedule;
browser.schedule = (command, description) => {
currentCommand = currentCommand.then(() =>
webdriverSchedule.call(browser, command, description)
);
return currentCommand;
};
ãããã£ãŠãåºæ¬çã«.driver
ãåé€ããŸã
Async / awaitã®äœ¿çšã¯ãcontrolFlowããã倧ããªæ··ä¹±ã®ããã§ãã
äžèšã®è§£æ±ºçãè©ŠããåŸã§ããMac OSSierraã§ãšã©ãŒãåŒãç¶ãçºçããŸãã
è©Šãããšãã§ããä»ã®è§£æ±ºçã¯ãããŸããïŒ
ããããšã
ç§ãã¡ã®å Žåãããã€ãã®ã¢ãµãŒã·ã§ã³ã§async / awaitãééã£ãŠäœ¿çšããŠããããã§ãã
ãããæã£ãŠããïŒ
const modal = await page.getModalInfo()
expect(modal.isDisplayed()).toBeTruthy()
ãã以å€ã®ïŒ
const modal = page.getModalInfo()
expect(await modal.isDisplayed()).toBeTruthy()
ããã«ã¡ã¯@danigaré¢æ°isDisplayed()
ã¯promiseãè¿ãã®ã§ãããã解決ãããå Žåã¯awaitã䜿çšããããšãäžå¯æ¬ ã§ãã ãããã£ãŠã2çªç®ã®äŸã®2è¡ç®ã®ã³ãŒãã¯åé¡ãªãããã«èŠããŸãã
æåã®è¡ã®await
ã¯ã©ãã§ãããããã¯getModalInfo()
ãè¿ããã®ã«ãã£ãŠç°ãªããŸãã çŸæç¹ã§ã¯äžæã§ããã1è¡ç®ãš2è¡ç®ã®æ¥ç¶ãããããŸããã
@marcincharezinski jasmine
ã¯ã$ await
ã䜿çšããã«ã except()
ã®Promise
ïŒ$ãèªåã§è§£æ±ºããŸãã
ããã @marcincharezinskiã®é
延ã§ããããªããã æåã®è¡ã®getModalInfo()
ã¡ãœããã¯ElementFinderïŒPromiseã§ã©ãããããŠããªãïŒãè¿ããŸãããæåã®äŸã§ãããããã«ã awaiting
ã§ããã
ãã®ãããªåé¡ãããã€ããããããããä¿®æ£ãããšãEPIPEãšã©ãŒã¯ãªããªããŸããðã
@ CrispusDH-ç解ã§ããªãçç±ã§ãã¹ãã倱æãããšããåé¡ãçºçãç¶ãããŸã§ãç§ã¯åãããšãèããŠããŸããã ç§ã¯æ»ã£ãŠexcept()
ã¹ããŒãã¡ã³ãå
ã«await
ãè¿œå ããŸããããããã§ãããã¯ã¯ãªã¢ãããŸããã
@Mokkappså°ãªããšãTypeScriptã§ã¯ãã³ãŒãã§ãšã©ãŒãçºçããŸãã
ã¿ã€ã '
ã¿ã€ããPromisevoidãã¯ã¿ã€ããPromiseTãã«å²ãåœãŠãããšãã§ããŸããã
ããããã£ãcancelããã¿ã€ããPromisevoidãã«ãããŸããã
@ kahan002
ãã®ã³ãŒãã䜿çšããŠæçµçã«è§£æ±ºããŸãã
function patchSchedule() {
if (os.platform() === 'darwin') {
let currentCommand = Promise.resolve();
let concurrencyCounter = 0;
// Serialise all webdriver commands to prevent EPIPE errors
const webdriverSchedule = browser.driver.schedule;
browser.driver.schedule = (command: Command, description: string) => {
currentCommand = currentCommand.then(() =>
webdriverSchedule
.call(browser.driver, command, description)
.then(result => {
concurrencyCounter--;
return result;
})
.catch(error => {
concurrencyCounter--;
// tslint:disable-next-line:no-console
console.error('Webdriver error:', command, description, error);
throw error;
})
);
return currentCommand as any;
};
}
}
ããã¯protractor.conf.tsã§åŒã³åºãããŸã
onPrepare: () => {
patchSchedule();
},
ãããå
±æããŠãããŠããããšã@Mokkapps ã 誰ããtypeScriptãç§ã®ãããªç°å¢ã«é©å¿ããããå Žåã«åããŠãããã€ãã®æ³šæäºé
ããããŸãã os.platform()
ã¯äžæã ã£ãã®ã§ã process.platform
ã䜿çšããŸããã ç§ã¯import { Command } from "selenium-webdriver";
ããå¿
èŠããããŸãããconcurrencyCounterã¯èªã¿åãããªãã£ããããã³ã¡ã³ãã¢ãŠãããå¿
èŠããããŸããã ãŸããæé»çãªanyã«å¯ŸããŠtypeScriptã®èŠåãããããã .then((result : any) => {
ãš.catch((error: any) => {
ã§æ瀺çã«ããå¿
èŠããããŸããã ç§ã¯ã³ãŒãã«ã€ããŠäžå¹³ãèšã£ãŠããŸããããããŠããªãããããå
±æããŠãããŠããããã§ãïŒããã¯æç¶çã ã£ãã®ã§å°ããããã«ããã§ãããããã¯åé¡ãä¿®æ£ããŠããããã§ãïŒã ãã®ã³ã¡ã³ãã誰ãã®ã圹ã«ç«ãŠã°å¹žãã§ãã ç§ãä»ã®äººã«æ»ã£ãŠããŠãããŠããããšãã
ããããããããç§ã®å€æŽã¯ããªãã®ä¿®æ£ãå£ããŸããããªããªãç§ã¯ã¡ããã©UnhandledPromiseRejectionãååŸããããã§ãèŠåïŒæªåŠçã®çŽæã®æåŠïŒæåŠIDïŒ4ïŒïŒãšã©ãŒïŒEPIPEæžã蟌ã¿EPIPE
ïŒããŒãïŒ8514ïŒ[DEP0018] DeprecationWarningïŒæªåŠçã®promiseæåŠã¯éæšå¥šã«ãªããŸããã å°æ¥ãåŠçãããªãpromiseæåŠã¯ããŒã以å€ã®çµäºã³ãŒãã§Node.jsããã»ã¹ãçµäºããŸãã
çµå±ã æ»ã£ãŠã await
ã誀çšããŠããã¯ãã®å Žæã確èªããŸãã
OSXãŠãŒã¶ãŒã®é²æ©ã¯ãããŸããïŒ
ããã¯ãä»ã®åæ§ã®ãšã©ãŒãšåãç¶æ³ã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ããããšæããŸãããã®ä¿®æ£ã¯ãSeleniumããŒãã³ãŒããšãã©ãŠã¶ãŒéã®éä¿¡ã§HTTPããŒãã¢ã©ã€ãã䜿çšããããšã§ãã æšå¹ŽãSeleniumã¡ã€ã³ã©ã€ã³ã§ããã«å¯Ÿããä¿®æ£ããããŸããããã®ã³ãŒãã®ã©ã®ããŒãžã§ã³ã§ãå ¬éãããŠããŸããã
ããã¯ãå¥ã®ã³ã¡ã³ãæçš¿è ãå¥ã®å·ã§æžãããã®ããåçšããŠç·šéãããããã§äœ¿çšããåé¿çã§ãã NPM package.scriptãèšå®ããŠãå®è¡ããŸãã
"scripts": {
"install": "webdriver-manager update && node keep-alive-patch.js",
ãããã£ãŒã³ãŒãã¯æ¬¡ã®ãšããã§ãã
const fs = require('fs');
const chromeFile = 'node_modules/selenium-webdriver/chrome.js';
fs.readFile(chromeFile, 'utf8', function (err, data) {
if (err)
throw err;
const result = data.replace(/new http.HttpClient\(url\)/g,
"new http.HttpClient(url, new (require('http').Agent)({ keepAlive: true }))");
console.log(`Patching ${chromeFile}`);
fs.writeFileSync(chromeFile, result, 'utf8');
});
ãã®ãããã䜿çšãããšãProtractorã¯SELENIUM_PROMISE_MANAGER: false
ã䜿çšããŠãWindowsãšOSXã®äž¡æ¹ã§99ïŒ
以äžå
ç¢ã«ãªããŸãã ããªãã®ãã€ã¬ãŒãžã¯ãããªãã®EPIPEãšã©ãŒãç§ãã¡ã®ããæ¹ãšåãæ ¹æ¬çãªç¶æ³ã«ãã£ãŠåŒãèµ·ããããŠãããã©ããã«ãã£ãŠå€ãããããããŸããã
ãã§ãŒã³ïŒãŸãã¯ã¢ã¬ã€äžïŒã§ã®åŸ æ©ãæãè匱ã§ããããã«æãããŸãã ããšãã°ãlet testFormatIDã§ãšã©ãŒãçºçããŸããïŒstring = await element.allïŒby.classNameïŒ 'ng-star-inserted'ïŒïŒãallïŒby.tagNameïŒ 'td'ïŒïŒãgetïŒ1ïŒã getTextïŒïŒ; ãšã©ãŒãç§ã®ãã®ã§ãããç§ãæžãããã®ãæ©èœããªãå¯èœæ§ããããŸãã
ïŒ4792ã¯ãMac OS Xã§ã®ç§ã®åé¡ãä¿®æ£ããããã§ãããã³ããããããšããIgorDorokhovã
@ kahan002ã©ãããããŸããŠïŒ
å床åšã«å«ãŸãã4.0.0-alpha.1ã®ETAã¯ãããŸããïŒ
Failed: EPIPE write EPIPE
ãšã©ãŒãçºçããŸãã$$('classified-section').filter((section) => section.isDisplayed())
[email protected]
ã«ã¢ããã°ã¬ãŒãããŠãã ããã ããã§è§£æ±ºãããããã§ãã
@demisxããã«ããããé©çšããŸããããããŸããããŸãã
@rafalfããããšãããããŸãã ãselenium-3.7.0ããindex.jsãååŸããECONNREFUSEDãè¿œå ãããããšã«ã€ããŠè©±ããŠããå Žåãç§ã¯ãããè©ŠããŸããããããã§ãæã ãã®ãšã©ãŒãçºçããŠããŸããã ã³ã¡ã³ãã誀解ããå Žåã¯ãç¥ãããã ããã
EPIPEãšã©ãŒã¯ãææ°ã®å床åš5.4.1ãchromedriver_2.43ãããã³MacOSMojaveã®async / awaitã§åŒãç¶ãé »ç¹ã«çºçããŸãã CIã§E2Eä»æ§ãå®è¡ããããšã¯ã§ããªããªããŸããã ãã¹ãŠãåæ ŒãããŸã§ãè€æ°åæåã§å®è¡ããŸãã éåžžã«äžå®å®ã§ãã
@demisx
ããã¯äž»ã«ã each
ã filter
ãããã³é
åã§äœ¿çšããããã®ä»ã®é¢æ°ã§çºçããŸãã
ã©ã®ããã«äœãçŽããã
// EPIPE write EPIPE
// await $$("short-list-component.ng-valid mat-label").each(async function (element) {
// labels.push(await element.getText())
// });
// this.logInfo("getMatLabels: " + labels);
// return labels
let l = await $$("q-short-list-component.ng-valid mat-label");
for (let element of l){
text = await element.getText();
labels.push(text)
}
@rafalfãããããã¯ç§ãã¡ãæåã«åãé€ãããã®ã§ããã EPIPEãšã©ãŒã®é »åºŠã¯æžããŸããããå®å
šã«ãªããªãããã§ã¯ãããŸããã§ããã è€æ°ã®æ©èœãåããå床åšãå®è¡ãããšãããã«æªåããŸãã ãããã£ãŠããããŸã§ã®ãšãã@kylecordesãããããã®åœ¹å²ãæãããŠããããã§ãã ããããšã@kylecordesïŒ ããŸãããã°ããã®ä¿®æ£ã«ãããããã«master
ã«ãªããŸãã
ãããã¯å€ã§ã¯ã let l = await $$("q-short-list-component.ng-valid mat-label")
ã«await
ã¯å¿
èŠãããŸããã $$
ã¯ElementArrayFinder
$ãè¿ããŸãããçŽæã§ã¯ãããŸããã ð
@demisxããããããªãã¯ééã£ãŠããŸããå€åããã¯ããªãããŸã EPIPEãšã©ãŒãåŸãçç±ã§ãïŒdancerïŒ
ã¯ã-åŸ
æ©ãªãã§ElementArrayFinderãè¿ããŸãããå埩ããããšã¯ã§ããŸãã
ãããŠãã®éšåã¯æ©èœããŸãã
for (let element of l){
text = await element.getText();
labels.push(text)
}
await
ãå®è¡ãããšãèŠçŽ ã®ãªã¹ãã衚瀺ãããŸã;ïŒééã§ããèŠçŽ ã®ãªã¹ã
@rafalfç³ãèš³ãããŸããããç§ã®æªãã§ãã await
ã®äžã®å埩éšåãèŠéããŸããã ããªãã¯çµ¶å¯Ÿã«æ£ããã§ãã
ç§ã¯ééã£ãŠãããããããŸãããã次ã®ããã«ElementArrayFinderã䜿çšããŠããå Žåã¯åžžã«ããã®ãããªãšã©ãŒãæç¶çã«çºçããããã§ãã
await $$('some-selector').click()
@yyankowskiã¯ããããã¯ç§ã®çµéšã§ããããŸããã ãã®ãšã©ãŒã$$
ã§äœãããçºçããŠããã®ãèŠãŸããã ç¹ã«ã $$
ElementArrayFinder
ã§ã¡ãœãããåŒã³åºãããšããå Žåã
æãåèã«ãªãã³ã¡ã³ã
ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ããã¹ãïŒTypeScriptã§ïŒã
await
ã誀ã£ãŠäœ¿çšããŠãããããEPIPE
ãšã©ãŒã衚瀺ãããŠããŸããã ãããã£ãŠãæªåŠçã®PromiseæåŠãã©ã³ãã ã«çºçãããããã®ãšã©ãŒãçºçããŠããŸããã 誀ã£ã䜿çšæ³ãä¿®æ£ãããšãããŒã8ã§ãããã®ãšã©ãŒãçºçããªããªããŸããawait
ã®èª€ã£ã䜿çšæ³ïŒæ¬ èœãŸãã¯åé·ïŒãŸãã¯åã«èª€ã£ãPromiseãã§ãŒã³ïŒããšãã°ããã«ããŒã¡ãœããããPromiseãè¿ãã®ãå¿ããå ŽåïŒããªããããã¹ãã泚ææ·±ããã§ãã¯ããŠãã ããã ç§ãã¡ã®å Žåãå žåçãªãšã©ãŒã¯ä»¥äžã䜿çšããŠããŸããïŒãã以å€ã®ïŒ
å€åããã¯ãŸããã®åé¡ãæ±ããŠãã誰ããå©ããã§ãããã