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
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗредрдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдирд╣реЗрд▓реНрдб рд╡рд╛рджреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рдФрд░ рдореБрдЭреЗ рд╡рд╛рджреЛрдВ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреАред рдлрд┐рд░ рднреА, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдиреЛрдб рдПрдХ рдЕрдирдЪрд╛рд╣реЗ рд╡рд╛рджреЗ рдкрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдпрд╛ рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ рдЖрджрд┐ рдореЗрдВ рдЬреЛ рднреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣рд╛рдВ рдХрд╣реАрдВ рдПрдХ рдиреЛрдб рдмрдЧ рд╣реИред
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рднреА рдХрдИ рдмрд╛рд░ рдЗрд╕рд╕реЗ рдЯрдХрд░рд╛ рдЪреБрдХрд╛ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЬрдм рдХреНрд░реЛрдо рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрддреНрддреЗрдлрд╛рдХ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╣рд╛рдБ рдореБрдЭреЗ рдпрд╣ рдмрджрд╕реВрд░рдд рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓реА рд╣реИ!
рдпрд╣рд╛рдБ рджреЗрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛; рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдзрд░-рдЙрдзрд░ рдирд╣реАрдВ рд╣реБрдЖред рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдХреЛрдгреАрдп 2 рдРрдк рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд░реЗрдкреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЖрдк https://github.com/NickTomlin/protractor-mcve рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЬреЛ рдЗрд╕реЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ?
рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдХрджрдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреБрдЫ рдореБрджреНрджреЛрдВ (рдЬреИрд╕реЗ рдпрд╣ рдПрдХ) рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рди рдкрд░ рд╣рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдзрдиреНрдпрд╡рд╛рдж!
@NickTomlin @wcainboundary рдореИрдВрдиреЗ рдЕрднреА рдЕрдкрдиреЗ рдиреЛрдбрдЬ рдХреЛ рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдм рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛:
$node -v
v6.10.1
рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
$node -v
v7.10.0
рдореИрдВ рдиреЛрдб v8.0.0 . рдореЗрдВ рддреНрд░реБрдЯрд┐ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ
рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ _рдмрд┐рдирд╛_рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рднреА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ (рд╕реАрдзреЗ [email protected] рдФрд░ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ 3.3)ред рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░ рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдирд┐рд░реНрдорд╛рдг рдПрдЬреЗрдВрдЯреЛрдВ (рд▓рд┐рдирдХреНрд╕) рдкрд░ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдЦрд┐рд▓рд╛рдл рджрд╛рдпрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВрдиреЗ OSX рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрдЦреА рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП рдореБрджреНрджрд╛ рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдРрд╕реЗ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдгреАрдп рдХрд╛рд░реНрдп рдкреВрд░реНрдг рдереЗ, рдкреГрд╖реНрда рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдкрд╛рджрди рдкреВрд░реНрдг рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реБрдИред рд╣рдорд╛рд░реЗ рд╣реЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдЧреНрд░рд┐рдб рдкрд░ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрдиреЗрдХреНрд╢рди рдзреАрдореЗ рдереЗред
рдореИрдВрдиреЗ рдЗрд╕реЗ WaitForAngularEnabled рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдкрд░ рджреЗрдЦрд╛ред
рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрдиреНрд╣реАрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рдереАрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ 3.x рдПрдХ рд╣реА рдмрд╛рдд рдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╣ рд░рд╣рд╛ рд╣реИ ...
рдЗрд╕ рдкрд░ +1, OS X 10.12.5 . рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд╕реНрдкреЗрдХреНрд╕ рдЪрд▓рд╛рддреЗ рд╕рдордп рдЙрд╕реА рдореБрджреНрджреЗ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ
рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореБрдЭреЗ EPIPE рддреНрд░реБрдЯрд┐ рджреЗрдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рдереА:
рдФрд░, рдЬрдм рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ _less рд╕рдВрднрд╛рд╡рдирд╛_, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реВрдЯ рдХреЛ рдЕрдкрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде 7 рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛, рддреЛ 4 рд░рди рд╕рдлрд▓ рд░рд╣реЗ рдпрджрд┐ рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЕрдкрдиреЗ рдХреНрд░реЛрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЕрдкрдиреЗ рдорд╛рдЙрд╕ рдХреЛ рдХреНрд░реЛрдо рдбреЙрдХ рдЖрдЗрдХрди рд╕реЗ рдирд╣реАрдВ рд╣рд┐рд▓рд╛рдпрд╛ (рд╢рд╛рдпрдж рдЕрд╕рдВрдЧрдд)ред
рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ EPIPE
рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рдереАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ) рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ await
s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдирдЪрд╛рд╣реЗ рд╡рд╛рджрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд░рд╣реА рдереАред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдиреЛрдб 8 рдкрд░ рдирд╣реАрдВ рд╣реИрдВред
await
(рдпрд╛ рддреЛ рдЧреБрдо рдпрд╛ рдмреЗрдорд╛рдиреА) рдпрд╛ рд╕рд┐рд░реНрдл рдЧрд▓рдд рдкреНрд░реЙрдорд┐рд╕ рдЪреЗрдирд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рд╣реЗрд▓реНрдкрд░ рдореЗрдердбреНрд╕ рд╕реЗ рдкреНрд░реЙрдорд┐рд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП) рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛:
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 рдореЗрдВ рд╕рдорд╡рд░реНрддреА рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ рдХрдорд╛рдВрдб рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред @wvanderdeijl рдиреЗ #4508 рдореЗрдВ ElementArrayFinder::map()
рдХреЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред рдЬрдм рддрдХ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ browser.driver.schedule()
рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд░реИрдкрд░, рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдорд╡рд░реНрддреА рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрддрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ 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 рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕реЗ рдореЗрд░реЗ 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 рд░рд╛рдЗрдЯ EPIPE" рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдПрдХ рдмрдЧ рд▓рдЧрддреА рд╣реИрдВ: https://github.com/SeleniumHQ/selenium/issues/5345 рдЬрд┐рд╕реЗ 4.0.0 рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ 4.0.0 рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Protractor
рд░реЛрдбрдореИрдк рдХрд╛ рдХреЛрдИ рд▓рд┐рдВрдХ рд╣реИ? рдпрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ
@renehamburger , рдХреНрдпрд╛ рдЖрдк рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдЖрдкрдХреЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм SELENIUM_PROMISE_MANAGER: false
ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрджрд┐ рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдЬреАрдм рдореБрджреНрджреЗ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ async/await
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@ рдХреНрд░рд┐рд╕реНрдкрд╕рдбреАрдПрдЪ рдореБрдЭреЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛
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/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдЧрдбрд╝рдмрдбрд╝реА рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдореИрдХ рдУрдПрд╕ рд╕рд┐рдПрд░рд╛ рдкрд░ рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рджреЗрдЦреА рдЧрдИ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрд╛рдп рд╣реИ рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рджрд╛рд╡реЛрдВ рдореЗрдВ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдерд╛:
const modal = await page.getModalInfo()
expect(modal.isDisplayed()).toBeTruthy()
рдХреЗ рдмрдЬрд╛рдП:
const modal = page.getModalInfo()
expect(await modal.isDisplayed()).toBeTruthy()
рд╣рд╛рдп @danigar рдлрдВрдХреНрд╢рди isDisplayed()
рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рддреЛ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рдХреА рдЖрдкрдХреА рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдареАрдХ рджрд┐рдЦрддреА рд╣реИред
рдЖрдкрдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ await
рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ getModalInfo()
рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдореИрдВ рдкрд╣рд▓реА рдФрд░ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред
@marcincharezinski jasmine
Promise
рдХреЛ except()
рдореЗрдВ await
рдХреЗ рдмрд┐рдирд╛ рд╕реНрд╡рдпрдВ рд╣рд▓ рдХрд░реЗрдЧрд╛ред
рд╣рд╛рдВред @marcincharezinski рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА getModalInfo()
рд╡рд┐рдзрд┐ рдиреЗ рдПрдХ ElementFinder (рд╡рд╛рджрд╛ рдореЗрдВ рд▓рд┐рдкрдЯрд╛ рдирд╣реАрдВ) рд▓реМрдЯрд╛рдпрд╛, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП awaiting
рдереЗред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреБрдЫ рдореБрджреНрджреЗ рдереЗ рдФрд░ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рддреЛ EPIPE рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИ ред
@ рдХреНрд░рд┐рд╕реНрдкрд╕рдбреАрдПрдЪ - рдореИрдВ рд╡рд╣реА рдмрд╛рдд рд╕реЛрдЪрддрд╛ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдореБрджреНрджреЗ рдорд┐рд▓рддреЗ рд░рд╣реЗред рдореИрдВ рд╡рд╛рдкрд╕ рдЧрдпрд╛ рдФрд░ рдЕрдкрдиреЗ except()
рдмрдпрд╛рдиреЛрдВ рдХреЗ рдЕрдВрджрд░ await
рдЬреЛрдбрд╝рд╛ рдФрд░ рдЗрд╕рд╕реЗ рд╡реЗ рд╕рд╛рдл рд╣реЛ рдЧрдПред
@Mokapps рдХрдо рд╕реЗ рдХрдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рдХреЛрдб рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:
рдкреНрд░рдХрд╛рд░ '
рдЯрд╛рдЗрдк 'рд╡рд╛рджрд╛ рд╢реВрдиреНрдп' 'рд╡рд╛рджрд╛ рдЯреА' рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рд╕рдВрдкрддреНрддрд┐ 'рд░рджреНрдж рдХрд░реЗрдВ' рдкреНрд░рдХрд╛рд░ 'рд╡рд╛рджрд╛ рд╢реВрдиреНрдп' рдореЗрдВ рдЧреБрдо рд╣реИред
@ 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();
},
рдзрдиреНрдпрд╡рд╛рдж @Mokapps рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдЧрд░ рдХреЛрдИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдореЗрд░реЗ рдЬреИрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдХреБрдЫ рдиреЛрдЯреНрд╕ред os.platform()
рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ process.platform
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореБрдЭреЗ import { Command } from "selenium-webdriver";
рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдорд╡рд░реНрддреА рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреА рдкрдбрд╝реА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХрднреА рдирд╣реАрдВ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рд╣рд┐рдд рдХрд┐рд╕реА рдкрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ .then((result : any) => {
рдФрд░ .catch((error: any) => {
рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрддрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░реБрдХ-рд░реБрдХ рдХрд░ рдерд╛)ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдореЗрд░реЗ рдФрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореЗрд░реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдиреЗ рдЖрдкрдХрд╛ рд╕реБрдзрд╛рд░ рддреЛрдбрд╝ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА-рдЕрднреА UnhandledPromiseRejectionWarning: Unhandled PromiseRejectionWarning: Unhandled рд╡рд╛рджрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ (рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдЖрдИрдбреА: 4) рдорд┐рд▓реА: рддреНрд░реБрдЯрд┐: EPIPE EPIPE рд▓рд┐рдЦреЗрдВ
(рдиреЛрдб:8514) [рдбреАрдИрдкреА0018] рдкрджрд╛рд╡рдирддрд┐ рдЪреЗрддрд╛рд╡рдиреА: рд╣реИрдВрдбрд▓ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд╛рджрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдмрд╣рд┐рд╖реНрдХреГрдд рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╡рд╛рджрд╛ рдЕрд╕реНрд╡реАрдХрд░рдг рдЬреЛ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЧреИрд░-рд╢реВрдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде Node.js рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред
рдЖрдЦрд╝рд┐рд░рдХрд╛рд░ред рдореИрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ await
рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
OSX рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдЧрддрд┐?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЕрдиреНрдп рд╕рдорд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реЗрд▓реЗрдирд┐рдпрдо рдиреЛрдб рдХреЛрдб рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдореЗрдВ HTTP рдХреЛ рдЬреАрд╡рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рд╣реИред рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рд╕реЗрд▓реЗрдирд┐рдпрдо рдореЗрдирд▓рд╛рдЗрди рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рдпрд╣рд╛рдВ рд╣рдо рдЬрд┐рд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП 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');
});
рдЗрд╕ рдкреИрдЪ рдХреЗ рд╕рд╛рде, SELENIUM_PROMISE_MANAGER: false
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдУрдПрд╕рдПрдХреНрд╕ рджреЛрдиреЛрдВ рдкрд░ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП 99%+ рдордЬрдмреВрдд рд╣реИред рдЖрдкрдХрд╛ рдорд╛рдЗрд▓реЗрдЬ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА EPIPE рддреНрд░реБрдЯрд┐ рдЙрд╕реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЬреАрд░реЛрдВ (рдпрд╛ рдЕрдзрд┐рдХ рд╕рд░рдгрд┐рдпреЛрдВ) рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдмрд╕реЗ рдХрдордЬреЛрд░ рд▓рдЧрддреА рд╣реИред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрднреА рддреНрд░реБрдЯрд┐ рджреЗрдЦреА рд╣реИ let testFormatID: string =await element.all(by.className('ng-star-insert')).all(by.tagName('td')).get(1). рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ (); рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рддреА рдореЗрд░реА рд╣реЛ рдФрд░ рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рдХрд╛рдо рди рдХрд░реЗред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #4792 рдиреЗ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░ рдореЗрд░реЗ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрдЧреЛрд░рдбреЛрд░реЛрдЦреЛрд╡ред
@ kahan002 рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
4.0.0-alpha.1 рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдИрдЯреАрдП рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ?
Failed: EPIPE write EPIPE
рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ 5 рдореЗрдВ рд╕реЗ 1 ElementArrayFinder рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ:$$('classified-section').filter((section) => section.isDisplayed())
рдХреГрдкрдпрд╛ [email protected]
рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред
@demisx рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкреИрдЪ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
@rafalf рдзрдиреНрдпрд╡рд╛рджред рдпрджрд┐ рдЖрдк "рд╕реЗрд▓реЗрдирд┐рдпрдо-3.7.0 рд╕реЗ index.js рд▓реЗрдиреЗ рдФрд░ ECONNREFUSED рдЬреЛрдбрд╝рдиреЗ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереАред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ред
EPIPE рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рдЕрдХреНрд╕рд░ рдирд╡реАрдирддрдо рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ 5.4.1, chromedriver_2.43 рдФрд░ MacOS Mojave рдкрд░ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИред рд╣рдо рдЕрдм CI рдкрд░ E2E рд╕реНрдкреЗрдХреНрд╕ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗред рдЬрдм рддрдХ рд╡реЗ рд╕рднреА рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рддрдм рддрдХ рдХрдИ рдореИрдиреБрдЕрд▓ рд░рди рд▓реЗрдВред рдмрд╣реБрдд рдЕрд╕реНрдерд┐рд░ред
@demisx
рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП each
, filter
рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ iwth arrays
рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛
// 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 рд╣рд╛рдБ, рд╡рд╣ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдереА рдЬрд┐рд╕рд╕реЗ рд╣рдордиреЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдиреЗ рдИрдкреАрдЖрдИрдкреАрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛, рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд╣реБрдПред рдХрдИ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдЪрд▓рд╛рддреЗ рд╕рдордп рдпрд╣ рдЦрд░рд╛рдм рд╣реЛ рд░рд╣рд╛ рд╣реИред рддреЛ, рдЕрдм рддрдХ @kylecordes рдкреИрдЪ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж @kylecordes! рдЙрдореНрдореАрдж рд╣реИ, рдпрд╣ рд╕реБрдзрд╛рд░ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА master
рдХрд░ рджреЗрдЧрд╛ред
рд╡рд┐рд╖рдп рд╕реЗ рд╣рдЯрдХрд░, рдЖрдкрдХреЛ await
рдореЗрдВ let l = await $$("q-short-list-component.ng-valid mat-label")
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред $$
рд░рд┐рдЯрд░реНрди ElementArrayFinder
, рд╡рд╛рджрд╛ рдирд╣реАрдВред рдореИрдВ
@demisx рдирд╣реАрдВ, рдЖрдк рдЧрд▓рдд рд╣реИрдВ, рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрднреА рднреА EPIPE рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ: рдирд░реНрддрдХ:
рд╣рд╛рдВ - рдпрд╣ ElementArrayFinder w/o рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ
рдФрд░ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛
for (let element of l){
text = await element.getText();
labels.push(text)
}
рдЕрдЧрд░ рдореИрдВ await
рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ;) рдХрд┐ рдореИрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ
@rafalf рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдмреБрд░рд╛ред рдореИрдВрдиреЗ await
рдХреЗ рдиреАрдЪреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднрд╛рдЧ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ред рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред
рдореБрдЭрд╕реЗ рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореЗрд░реЗ рд▓рд┐рдП рд░реБрдХ-рд░реБрдХ рдХрд░ рд╣реЛрддреА рд╣реИрдВ, рдЬрд╣рд╛рдВ рднреА рдирд┐рдореНрди рддрд░реАрдХреЗ рд╕реЗ ElementArrayFinder рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ:
await $$('some-selector').click()
@yyankowski рд╣рд╛рдБ, рдпрд╣ рдореЗрд░рд╛ рднреА рдЕрдиреБрднрд╡ рдерд╛ред рдореИрдВрдиреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ $$
рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рд╣реЛрддреЗ рд╣реБрдП рджреЗрдЦрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, ElementArrayFinder
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП $$
$1$#$ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордпред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ
EPIPE
рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рдереАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ) рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗawait
s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдирдЪрд╛рд╣реЗ рд╡рд╛рджрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд░рд╣реА рдереАред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдиреЛрдб 8 рдкрд░ рдирд╣реАрдВ рд╣реИрдВредawait
(рдпрд╛ рддреЛ рдЧреБрдо рдпрд╛ рдмреЗрдорд╛рдиреА) рдпрд╛ рд╕рд┐рд░реНрдл рдЧрд▓рдд рдкреНрд░реЙрдорд┐рд╕ рдЪреЗрдирд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рд╣реЗрд▓реНрдкрд░ рдореЗрдердбреНрд╕ рд╕реЗ рдкреНрд░реЙрдорд┐рд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП) рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛:рдХреЗ рдмрдЬрд╛рдП:
рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИред