Protractor: рд╡рд┐рдлрд▓: SELENIUM_PROMISE_MANAGER: рдЕрд╕рддреНрдп рд╣реЛрдиреЗ рдкрд░ рдЕрдХреНрд╕рд░ рджреЗрдЦрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ EPIPE EPIPE рд▓рд┐рдЦрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдордИ 2017  ┬╖  47рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: angular/protractor

рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ

  • рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг: 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)
  • рдмрдЧ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо
  1. рд▓рдЧрднрдЧ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдиреЛрдб рдФрд░ рдХреЛрдгреАрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреНрд░реЛрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░, рд╕рдВрднрд╡рддрдГ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ред (рдЕрднреА рддрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд╕ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджрд╛ рд╣реИред)
  2. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ SELENIUM_PROMISE_MANAGER: false рд╕реЗрдЯ рдХрд░реЗрдВ (рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ)ред
  3. рдЙрдкрд░реЛрдХреНрдд (2) рдХреЗ рдХрд╛рд░рдг, рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  4. рдПрдХ рдРрд╕рд╛ рд╕реВрдЯ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдЖрд░рдПрд▓ рд╣реЛ рдФрд░ рддрддреНрд╡ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдХреНрд▓рд┐рдХ рдпрд╛ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реЛред
  5. рдмрд╣реБрдд рдЬрд▓реНрджреА рдЖрдк Failed: EPIPE write EPIPE рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред

рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдирд╣реЗрд▓реНрдб рд╡рд╛рджреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ (рдФрд░ рдореБрдЭреЗ рд╡рд╛рджреЛрдВ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреАред рдлрд┐рд░ рднреА, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ рддреЛ рдиреЛрдб рдПрдХ рдЕрдирдЪрд╛рд╣реЗ рд╡рд╛рджреЗ рдкрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдпрд╛ рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ рдЖрджрд┐ рдореЗрдВ рдЬреЛ рднреА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣рд╛рдВ рдХрд╣реАрдВ рдПрдХ рдиреЛрдб рдмрдЧ рд╣реИред

  • рдЬрд┐рд╕ рдпреВрдЖрд░рдПрд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ (рдпрджрд┐ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ)

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ EPIPE рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рдереАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ) рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ await s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдирдЪрд╛рд╣реЗ рд╡рд╛рджрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╣реЛ рд░рд╣реА рдереА рдФрд░ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд░рд╣реА рдереАред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдиреЛрдб 8 рдкрд░ рдирд╣реАрдВ рд╣реИрдВред

await (рдпрд╛ рддреЛ рдЧреБрдо рдпрд╛ рдмреЗрдорд╛рдиреА) рдпрд╛ рд╕рд┐рд░реНрдл рдЧрд▓рдд рдкреНрд░реЙрдорд┐рд╕ рдЪреЗрдирд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рд╣реЗрд▓реНрдкрд░ рдореЗрдердбреНрд╕ рд╕реЗ рдкреНрд░реЙрдорд┐рд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП) рдХреЗ рдЧрд▓рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛:

browser.wait(await EC.invisibilityOf(fade)); // incorrect

рдХреЗ рдмрдЬрд╛рдП:

await browser.wait(EC.invisibilityOf(fade)); // correct

рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рд╕рднреА 47 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рднреА рдХрдИ рдмрд╛рд░ рдЗрд╕рд╕реЗ рдЯрдХрд░рд╛ рдЪреБрдХрд╛ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЬрдм рдХреНрд░реЛрдо рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрддреНрддреЗрдлрд╛рдХ рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╣рд╛рдБ рдореБрдЭреЗ рдпрд╣ рдмрджрд╕реВрд░рдд рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓реА рд╣реИ!

рдпрд╣рд╛рдБ рджреЗрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛; рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдзрд░-рдЙрдзрд░ рдирд╣реАрдВ рд╣реБрдЖред рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдХреЛрдгреАрдп 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 рддреНрд░реБрдЯрд┐ рджреЗрдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рдереА:

  • рдиреЛрдб 7.10.1
  • рдУрдПрд╕рдПрдХреНрд╕ 10.12.5
  • рд░рдХреНрд╖рдХ 5.1.2
  • рдХреНрд░реЛрдо 59.0.3071.115

рдФрд░, рдЬрдм рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ _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 рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдИрдЯреАрдП рдкреНрд░реЛрдЯреНрд░реИрдХреНрдЯрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ?

4792 рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЕрднреА рднреА 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$#$ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордпред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

utpallikipe picture utpallikipe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vdrulerz picture vdrulerz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mvolkmann picture mvolkmann  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

davidkarlsen picture davidkarlsen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

psech picture psech  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ