Protractor: Échec : EPIPE écrit EPIPE fréquemment vu lorsque SELENIUM_PROMISE_MANAGER : false

Créé le 17 mai 2017  ·  47Commentaires  ·  Source: angular/protractor

Rapport d'erreur

  • Version du nœud : 6.9.1
  • Version rapporteur : 5.1.2
  • Version angulaire : 4.0.0
  • Navigateur(s) : Chrome Version 57.0.2987.133 (64-bit)
  • Système d'exploitation et version OS X Version 10.10.5 (14F2315)
  • Votre fichier de configuration de rapporteur
// 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();
  }
};
  • Un exemple de test pertinent
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();
    });
  });
});
  • Résultat de l'exécution du test
$ 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

Également extrait de 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)
  • Étapes pour reproduire le bogue
  1. Utilisez approximativement les versions Node et Angular mentionnées, le navigateur Chrome, éventuellement Mac OS X. (Vous ne savez pas encore à quel point le problème est spécifique à cette combinaison.)
  2. Définissez SELENIUM_PROMISE_MANAGER: false dans la configuration (désactivez le flux de contrôle).
  3. En raison de (2) ci-dessus, utilisez des promesses partout dans votre suite de tests.
  4. Avoir une suite qui, pour chacun de plusieurs tests, obtient une URL et clique ou vérifie la présence d'un élément.
  5. Très rapidement, vous commencerez à rencontrer des erreurs Failed: EPIPE write EPIPE manière imprévisible.

Je n'utilise pas d'attente. Je ne peux pas non plus identifier de promesses non gérées dans le code de test (et j'ai de l'expérience avec les promesses), bien que cela ait été suggéré dans certains des commentaires, je dois donc autoriser cette possibilité. Pourtant, il est surprenant que le nœud se bloque sur une promesse non gérée, si tel est le cas. Il semble donc qu'il y ait un bogue de nœud quelque part ici, en plus de tout problème qu'il peut y avoir dans mon test ou mon rapporteur ou mon pilote Web, etc.

  • L'URL sur laquelle vous exécutez vos tests (le cas échéant)

Désolé, ce n'est pas public.

Commentaire le plus utile

Dans notre projet, des erreurs EPIPE apparaissaient, car les tests (en TypeScript) utilisaient incorrectement await s. Et par conséquent, les rejets de Promise non gérés se produisaient de manière aléatoire et entraînaient ces erreurs. Une fois que j'ai corrigé les utilisations incorrectes, nous n'avons plus ces erreurs sur le nœud 8.

Essayez de vérifier attentivement vos tests pour détecter les utilisations incorrectes de await (manquantes ou redondantes) ou simplement un chaînage incorrect de Promise (par exemple, lorsque vous avez oublié de renvoyer Promise à partir des méthodes d'assistance). Dans notre cas, l'erreur typique consistait à utiliser :

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

à la place de:

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

Peut-être que cela aidera quelqu'un qui a aussi ce problème.

Tous les 47 commentaires

Je me suis également souvent heurté à cela. Il semble que cela se produise plus souvent, peut-être exclusivement, lorsque Chrome est en arrière-plan. Peut-être juste une coïncidence

Oui, j'ai eu cette vilaine erreur aussi!

Toutes mes excuses pour la réponse tardive ici ; Je n'ai pas eu le temps de reproduire cela. L'un d'entre vous pourrait-il fournir un petit exemple de dépôt (vous pourriez utiliser https://github.com/NickTomlin/protractor-mcve comme entrée) d'une application angular 2 qui reproduit cela ?

La suppression du flux de contrôle est un pas dans la bonne direction, mais cela peut révéler certains problèmes (comme celui-ci) dont nous devrons tenir compte. Merci!

@NickTomlin @wcainboundary Je viens de mettre à jour mon nodejs vers la dernière version stable et cela fonctionne bien maintenant.

N'a pas fonctionné :

$node -v
v6.10.1

Fonctionne bien :

$node -v
v7.10.0

Je vois l'erreur dans le nœud v8.0.0

Je vois également cette erreur _sans_ rapporteur ([email protected] et je crois 3.3 avant). N'arrive jamais sur OS X, mais assez fréquemment sur nos agents de build (Linux).

Je n'ai pas vu ce problème déposé contre Selenium, mais il devrait probablement l'être.

J'ai vu cette erreur dans OSX.

Pour moi, le problème était lié au timing. Mon test essayait d'interagir avec un élément qui n'était pas disponible. Bien que les tâches angulaires aient été terminées, certains rendus sur la page n'étaient pas complets, ce qui a conduit à ce problème. C'était plus facile à reproduire sur notre grille hébergée puisque les connexions étaient plus lentes.

J'ai vu cela avec waitForAngularEnabled défini sur true et false.

Avant la mise à niveau, nous avions l'habitude d'obtenir des erreurs de délai d'attente sur certains des mêmes tests. Je me demande si Webdriver 3.x dit simplement la même chose d'une manière différente ...

+1 à ce sujet, rencontrant le même problème lors de l'exécution de mes spécifications localement sur OS X 10.12.5

Pour ce que ça vaut, j'étais moins susceptible de voir l'erreur EPIPE sur :

  • Nœud 7.10.1
  • OSX 10.12.5
  • Rapporteur 5.1.2
  • Chromé 59.0.3071.115

Et, quand je dis _moins probable_, je veux dire que lorsque j'ai exécuté ma suite 7 fois avec ma configuration ci-dessus, 4 des exécutions ont réussi si je concentrais immédiatement mon navigateur Chrome et ne déplaçais pas ma souris de l'icône du dock Chrome (probablement pas de lien).

Dans notre projet, des erreurs EPIPE apparaissaient, car les tests (en TypeScript) utilisaient incorrectement await s. Et par conséquent, les rejets de Promise non gérés se produisaient de manière aléatoire et entraînaient ces erreurs. Une fois que j'ai corrigé les utilisations incorrectes, nous n'avons plus ces erreurs sur le nœud 8.

Essayez de vérifier attentivement vos tests pour détecter les utilisations incorrectes de await (manquantes ou redondantes) ou simplement un chaînage incorrect de Promise (par exemple, lorsque vous avez oublié de renvoyer Promise à partir des méthodes d'assistance). Dans notre cas, l'erreur typique consistait à utiliser :

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

à la place de:

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

Peut-être que cela aidera quelqu'un qui a aussi ce problème.

Ce problème est-il résolu ? Je le vois toujours avec la version de nœud 7.7.3 et la version de rapporteur 5.1.1

@ sri1987 voir mon commentaire ci-dessus. C'est probablement un problème dans votre code, pas dans Protractor.

@ sri1987 S'il n'est pas reproductible de manière cohérente, il est certainement lié à un await manquant/supplémentaire quelque part.

J'ai eu ces erreurs très souvent ces derniers temps avec SELENIUM_PROMISE_ MANAGER : false
Lors de l'exécution de plusieurs tests

Le problème ici et dans # 4507 semble être des commandes webdriver simultanées. @wvanderdeijl a suggéré une solution pour le cas particulier de ElementArrayFinder::map() dans #4508. Jusqu'à ce que cela soit résolu correctement, le wrapper suivant pour browser.driver.schedule() , qui crée une file d'attente pour empêcher l'exécution simultanée de commandes webdriver, peut être une solution de contournement.

Quelqu'un qui rencontre régulièrement des erreurs EPIPE peut-il tester cela? Cela peut ralentir l'exécution du test dans une certaine mesure.

Le code suivant peut être appelé dans le hook onPrepare() de Protractor, par exemple.

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;
}

ou avec une journalisation supplémentaire :

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
Je pense que tu es sur la bonne voie. J'ai précisé que la plupart de mes erreurs provenaient de fonctions qui renvoient un appel Promise.all, donc je suis sûr que cela doit avoir quelque chose à voir avec la concurrence

@renehamburger merci. Après avoir ajouté celui-ci à la section onPrepare de mon protractor.conf.js :

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;
};

L'erreur 'Échec : EPIPE écrit EPIPE' a disparu.

@Xaz16 : A travaillé pour nous comme solution de contournement, merci !

Mais l'erreur "EPIPE write EPIPE" semble être un bogue dans Selenium : https://github.com/SeleniumHQ/selenium/issues/5345 qui sera résolu en 4.0.0.

Nous devons donc attendre que Protractor utilise la version 4.0.0 et que nous puissions supprimer cette solution de contournement.

Avons-nous un lien vers la feuille de route Protractor ? Ou ça n'existe pas du tout

@renehamburger , pourriez-vous aider ? J'essaie de réécrire votre solution de contournement au cas où SELENIUM_PROMISE_MANAGER: false . Actuellement, si je copie/colle simplement votre solution, il y a beaucoup de problèmes étranges qui, à mon avis, pourraient être résolus en utilisant async/await .

@CrispusDH J'ai dû changer l'extrait de code en

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; };

Donc, en gros, supprimez le .driver

L'utilisation d'Async/wait semble être un plus gros gâchis que le controlFlow.

L'erreur est toujours observée sur Mac OS Sierra même après avoir essayé la solution ci-dessus.

Existe-t-il une autre solution qui peut essayer.

Merci

Dans notre cas, il semble y avoir une mauvaise utilisation de async/wait dans certaines assertions.

avait ça :

    const modal = await page.getModalInfo()
    expect(modal.isDisplayed()).toBeTruthy()

à la place de:

    const modal = page.getModalInfo()
    expect(await modal.isDisplayed()).toBeTruthy()

Salut @danigar La fonction isDisplayed() renvoie la promesse, il est donc essentiel d'utiliser l'attente si vous voulez le résoudre. Donc, votre deuxième ligne de code dans le deuxième exemple semble bien.
Qu'en est-il de await dans votre première ligne, cela dépend du retour getModalInfo() . Ce n'est pas clair à ce stade et je ne vois pas de lien entre les 1ère et 2ème lignes.

@marcincharezinski jasmine résoudra Promise en except() par vous-même sans await .

Ouais. Désolé pour le retard @marcincharezinski. La méthode getModalInfo() de la première ligne a renvoyé un ElementFinder (non enveloppé dans une Promise), et comme vous le voyez dans le premier exemple, nous étions awaiting pour cela.
Nous avons eu des problèmes comme ceux-ci et une fois que nous les avons corrigés, l'erreur EPIPE a disparu 😊.

@CrispusDH - J'avais l'habitude de penser la même chose jusqu'à ce que je continue à avoir des problèmes d'échec de tests pour des raisons que je ne comprenais pas. Je suis retourné et j'ai ajouté await dans mes relevés except() et cela les a clarifiés.

@Mokkapps Au moins dans TypeScript, votre code donne l'erreur :
Taper '(commande : Commande, description : chaîne) => Promise void' n'est pas assignable au type ' T (commande : Commande, description : chaîne) => Promise T'.
Le type 'Promise void' n'est pas attribuable au type 'Promise T'.
La propriété 'cancel' est manquante dans le type 'Promise void'.

@ kahan002

Nous l'avons finalement résolu en utilisant ce code

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;
    };
  }
}

qui est appelé dans protractor.conf.ts

onPrepare: () => { patchSchedule(); },

Merci @Mokkapps pour le partage. Quelques notes au cas où quelqu'un voudrait l'adapter à TypeScript et à un environnement comme le mien. os.platform() n'était pas connu, j'ai donc utilisé process.platform . J'ai dû import { Command } from "selenium-webdriver"; j'ai dû commenter le concurrencyCounter car il n'a jamais été lu. Et comme j'ai un avertissement typeScript sur tout implicite, je devais les rendre explicites dans .then((result : any) => { et .catch((error: any) => { . Je ne me plains pas du code, et je suis heureux que vous l'ayez partagé (il semble résoudre le problème, bien que ce soit un peu difficile à dire car il était intermittent). J'espère que ce commentaire est utile à quelqu'un. Merci beaucoup d'avoir répondu à moi et aux autres.
Mais peut-être que mes modifications ont cassé votre correctif, car je viens de recevoir UnhandledPromiseRejectionWarning : Rejet de la promesse non gérée (identifiant de rejet : 4) : Erreur : EPIPE write EPIPE
(node:8514) [DEP0018] DeprecationWarning : les rejets de promesses non gérées sont obsolètes. À l'avenir, les rejets de promesses qui ne sont pas gérés mettront fin au processus Node.js avec un code de sortie différent de zéro.
après tout. Je vais revenir en arrière et voir où je dois abuser await .

Des progrès pour les utilisateurs d'OSX ?

Je pense que cela pourrait être déclenché par la même situation que d'autres erreurs similaires, dont le correctif consiste à utiliser HTTP keep-alive dans la communication entre le code Selenium Node et le navigateur. Il existe un correctif pour cela dans la ligne principale de Selenium, l'année dernière - mais il n'est publié dans aucune version de ce code.

Voici la solution de contournement que nous utilisons ici, empruntée et modifiée à partir de quelque chose qu'un autre commentateur a écrit dans un autre numéro. Configurez un package NPM.script pour l'exécuter :

"scripts": {
    "install": "webdriver-manager update && node keep-alive-patch.js",

Le code du patcher est :

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');
});

Avec ce correctif, Protractor est 99% + robuste pour nous sur Windows et OSX, en utilisant SELENIUM_PROMISE_MANAGER: false . Votre kilométrage peut varier, selon que votre erreur EPIPE est causée par la même situation sous-jacente que la nôtre.

Je trouve que les attentes avec des chaînes (ou sur des tableaux) semblent les plus vulnérables. Ainsi, par exemple, je viens de voir l'erreur avec let testFormatID: string =wait element.all(by.className('ng-star-inserted')).all(by.tagName('td')).get(1). getText(); Il est possible que l'erreur soit de moi et que ce que j'ai écrit ne fonctionne pas.

#4792 semble avoir résolu mes problèmes sur Mac OS X. Merci pour le tuyau, IgorDorokhov .

@kahan002 vous êtes les bienvenus !

un ETA pour 4.0.0-alpha.1 inclus dans le rapporteur ?

4792 n'a pas résolu le problème pour moi. Toujours obtenir Failed: EPIPE write EPIPE erreur 1 sur 5 lors du filtrage sur ElementArrayFinder :

$$('classified-section').filter((section) => section.isDisplayed())

Veuillez passer à [email protected] . Il semble être résolu là.

@demisx je l'ai patché ici et ça marche pour moi

@rafalf Merci. Si vous parlez de "prendre l' index.js de selenium-3.7.0 et d'ajouter ECONNREFUSED", j'ai essayé cela, mais j'obtenais toujours cette erreur de temps en temps. S'il vous plaît laissez-moi savoir si j'ai mal compris votre commentaire.

L'erreur EPIPE se produit encore assez souvent avec le dernier rapporteur 5.4.1, chromedriver_2.43 et async/wait sur MacOS Mojave. Nous ne pouvons plus exécuter les spécifications E2E sur CI. Effectuez plusieurs exécutions manuelles jusqu'à ce qu'elles soient toutes réussies. Très instable.

@demisx
cela se produit principalement pour moi pour each , filter et d'autres fonctions qui sont utilisées avec des tableaux

comment je l'ai retravaillé

        // 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 Ouais, c'est la première chose dont nous nous sommes débarrassés. Bien que cela ait réduit la fréquence des erreurs EPIPE, elles n'ont pas complètement disparu. Cela s'aggrave lors de l'exécution d'un rapporteur avec plusieurs capacités. Donc, jusqu'à présent, le patch @kylecordes semble faire le travail. Merci @kylecordes ! Espérons que ce correctif arrivera bientôt à master .

Hors sujet, vous n'avez pas besoin await dans let l = await $$("q-short-list-component.ng-valid mat-label") . Le $$ renvoie ElementArrayFinder , pas une promesse. 😉

@demisx non tu te trompes, c'est peut-être pour ça que tu as encore des erreurs EPIPE :dancer:
Oui - il renvoie ElementArrayFinder sans attendre mais vous ne pourrez pas le parcourir
et cette partie ne fonctionnerait pas

for (let element of l){
            text = await element.getText();
            labels.push(text)
        }

si je fais await , j'obtiens une liste d'éléments ;) que je peux parcourir

@rafalf Désolé, mon mauvais. J'ai raté la partie d'itération sous le await . Vous avez tout à fait raison.

Je peux me tromper, mais il semble que de telles erreurs se produisent par intermittence pour moi partout où il y a une utilisation de ElementArrayFinder de la manière suivante :
await $$('some-selector').click()

@yyankowski Oui, c'était aussi mon expérience. J'ai vu cette erreur se produire avec $$ plus qu'autre chose. Surtout, lorsque vous essayez d'appeler une méthode sur le ElementArrayFinder retourné par $$ .

Cette page vous a été utile?
0 / 5 - 0 notes