Protractor: Gagal: EPIPE menulis EPIPE sering terlihat ketika SELENIUM_PROMISE_MANAGER: salah

Dibuat pada 17 Mei 2017  ·  47Komentar  ·  Sumber: angular/protractor

Laporan bug

  • Versi Simpul: 6.9.1
  • Versi Busur Derajat: 5.1.2
  • Versi Sudut: 4.0.0
  • Peramban: Chrome Version 57.0.2987.133 (64-bit)
  • Sistem Operasi dan Versi OS X Version 10.10.5 (14F2315)
  • File konfigurasi busur derajat Anda
// 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();
  }
};
  • Contoh tes yang relevan
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();
    });
  });
});
  • Keluaran dari menjalankan tes
$ 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

Juga kutipan dari 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)
  • Langkah-langkah untuk mereproduksi bug
  1. Gunakan kira-kira versi Node dan Angular yang disebutkan, browser Chrome, mungkin Mac OS X. (Belum yakin seberapa spesifik masalah untuk kombinasi itu.)
  2. Setel SELENIUM_PROMISE_MANAGER: false di config (nonaktifkan aliran kontrol).
  3. Karena (2) di atas, gunakan janji di mana saja di suite pengujian Anda.
  4. Memiliki suite yang untuk masing-masing dari beberapa tes, mendapatkan URL dan mengklik atau memeriksa keberadaan elemen.
  5. Dengan sangat cepat Anda akan mulai mendapatkan kesalahan Failed: EPIPE write EPIPE secara tidak terduga.

Saya tidak menggunakan menunggu. Saya juga tidak dapat mengidentifikasi janji yang tidak tertangani dalam kode pengujian (dan saya berpengalaman dengan janji), meskipun itu telah disarankan di beberapa komentar, jadi saya harus mengizinkan kemungkinan itu. Tetap saja, mengejutkan bahwa node akan mogok pada janji yang tidak tertangani, jika itu masalahnya. Jadi sepertinya ada bug simpul di sini di suatu tempat, selain masalah apa pun yang mungkin ada dalam pengujian saya atau busur derajat atau webdriver, dll.

  • URL tempat Anda menjalankan pengujian (jika relevan)

Maaf, ini bukan untuk umum.

Komentar yang paling membantu

Dalam proyek kami EPIPE kesalahan muncul, karena tes (dalam TypeScript) salah menggunakan await s. Dan oleh karena itu, penolakan Promise yang tidak tertangani terjadi secara acak dan menyebabkan kesalahan ini. Setelah saya memperbaiki penggunaan yang salah, kami tidak memiliki kesalahan ini lagi di Node 8.

Cobalah untuk memeriksa pengujian Anda dengan hati-hati untuk penggunaan yang salah dari await (tidak ada atau berlebihan) atau hanya rangkaian Promise yang salah (misalnya ketika Anda lupa mengembalikan Promise dari metode helper). Dalam kasus kami, kesalahan tipikal menggunakan:

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

dari pada:

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

Mungkin itu akan membantu seseorang, yang juga memiliki masalah ini.

Semua 47 komentar

Saya juga sering mengalami hal ini. Sepertinya itu lebih sering terjadi, mungkin secara eksklusif, ketika Chrome berada di latar belakang. Mungkin hanya kebetulan

Ya, saya juga mendapatkan kesalahan jelek ini!

Mohon maaf atas keterlambatan respon di sini; Saya belum sempat mereproduksi ini. Bisakah salah satu dari Anda memberikan contoh repo kecil (Anda dapat menggunakan https://github.com/NickTomlin/protractor-mcve sebagai starter) dari aplikasi sudut 2 yang mereproduksi ini?

Menghapus aliran kontrol adalah langkah ke arah yang benar tetapi mungkin mengungkapkan beberapa masalah (seperti ini) yang perlu kita pertanggungjawabkan. Terima kasih!

@NickTomlin @wcainboundary Saya baru saja memutakhirkan nodejs saya ke versi stabil terbaru dan sekarang berfungsi dengan baik.

Tidak berhasil:

$node -v
v6.10.1

Berfungsi dengan baik:

$node -v
v7.10.0

Saya melihat kesalahan di simpul v8.0.0

Saya juga melihat kesalahan ini _without_ busur derajat (straight [email protected] dan saya percaya 3.3 sebelumnya). Tidak pernah terjadi pada OS X, tetapi cukup sering terjadi pada agen build kami (Linux).

Saya belum pernah melihat masalah ini diajukan terhadap Selenium, tetapi mungkin seharusnya begitu.

Saya telah melihat kesalahan ini di OSX.

Bagi saya masalahnya adalah terkait waktu. Pengujian saya mencoba berinteraksi dengan elemen yang tidak tersedia. Meskipun tugas sudut selesai, beberapa rendering pada halaman tidak selesai yang menyebabkan masalah ini. Lebih mudah untuk mereproduksi di jaringan yang dihosting kami karena koneksinya lebih lambat.

Saya memang melihat ini dengan waitForAngularEnabled disetel ke true dan false.

Sebelum memutakhirkan, kami biasa mendapatkan kesalahan batas waktu pada beberapa pengujian yang sama. Saya ingin tahu apakah Webdriver 3.x hanya mengatakan hal yang sama dengan cara yang berbeda...

Memberi +1 pada ini, mengalami masalah yang sama saat menjalankan spesifikasi saya secara lokal di OS X 10.12.5

Untuk apa nilainya, saya cenderung tidak melihat kesalahan EPIPE pada:

  • Simpul 7.10.1
  • OSX 10.12.5
  • Pelindung 5.1.2
  • Chrome 59.0.3071.115

Dan, ketika saya mengatakan _kurang mungkin_, maksud saya ketika saya menjalankan suite saya 7 kali dengan konfigurasi saya di atas, 4 proses berhasil jika saya segera memfokuskan browser Chrome saya dan tidak memindahkan mouse saya dari ikon dok Chrome (mungkin tidak berhubungan).

Dalam proyek kami EPIPE kesalahan muncul, karena tes (dalam TypeScript) salah menggunakan await s. Dan oleh karena itu, penolakan Promise yang tidak tertangani terjadi secara acak dan menyebabkan kesalahan ini. Setelah saya memperbaiki penggunaan yang salah, kami tidak memiliki kesalahan ini lagi di Node 8.

Cobalah untuk memeriksa pengujian Anda dengan hati-hati untuk penggunaan yang salah dari await (tidak ada atau berlebihan) atau hanya rangkaian Promise yang salah (misalnya ketika Anda lupa mengembalikan Promise dari metode helper). Dalam kasus kami, kesalahan tipikal menggunakan:

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

dari pada:

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

Mungkin itu akan membantu seseorang, yang juga memiliki masalah ini.

Apakah masalah ini sudah diperbaiki? Saya masih melihatnya dengan simpul versi 7.7.3 dan busur derajat versi 5.1.1

@sri1987 lihat komentar saya di atas. Kemungkinan besar masalah dalam kode Anda, bukan di Busur Derajat.

@ sri1987 Jika tidak dapat direproduksi secara konsisten, itu pasti terkait dengan await yang hilang/tambahan di suatu tempat.

Sering mengalami kesalahan ini akhir-akhir ini dengan SELENIUM_PROMISE_ MANAGER:false
Saat menjalankan beberapa tes

Masalahnya di sini dan di #4507 tampaknya merupakan perintah webdriver bersamaan. @wvanderdeijl menyarankan solusi untuk kasus tertentu ElementArrayFinder::map() di #4508. Sampai ini diselesaikan dengan benar, pembungkus berikut untuk browser.driver.schedule() , yang membuat antrian untuk mencegah perintah webdriver yang bersamaan dijalankan, mungkin bisa menjadi solusi.

Bisakah seseorang yang mengalami kesalahan EPIPE secara teratur menguji ini? Ini mungkin memperlambat eksekusi tes sampai tingkat tertentu.

Kode berikut dapat dipanggil di hook onPrepare() Protractor, misalnya.

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

atau dengan beberapa pencatatan tambahan:

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
Saya pikir Anda tepat di sana. Saya mempersempit sebagian besar kesalahan saya berasal dari fungsi yang mengembalikan panggilan Promise.all jadi saya cukup yakin itu pasti ada hubungannya dengan konkurensi

@renehamburger terima kasih. Setelah menambahkan yang ini ke bagian onPrepare dari protractor.conf.js saya:

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

Kesalahan 'Gagal: EPIPE tulis EPIPE' hilang.

@ Xaz16 : Bekerja untuk kami sebagai solusi, terima kasih!

Tetapi kesalahan "EPIPE write EPIPE" tampaknya merupakan bug di Selenium: https://github.com/SeleniumHQ/selenium/issues/5345 yang akan diselesaikan dalam 4.0.0.

Jadi kita harus menunggu sampai busur derajat menggunakan versi 4.0.0 dan kita dapat menghapus solusi ini.

Apakah kami memiliki tautan ke peta jalan Protractor ? Atau tidak ada sama sekali

@renehamburger , dapatkah Anda membantu? Saya mencoba menulis ulang solusi Anda jika SELENIUM_PROMISE_MANAGER: false . Saat ini, jika saya hanya menyalin/melewati solusi Anda, ada banyak masalah aneh yang menurut saya dapat diselesaikan menggunakan async/await .

@CrispusDH saya harus mengubah potongan kode menjadi

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

Jadi pada dasarnya hapus .driver

Menggunakan Async/menunggu tampaknya menjadi kekacauan yang lebih besar daripada controlFlow.

Kesalahan masih diamati pada Mac OS Sierra bahkan setelah mencoba solusi di atas.

Apakah ada solusi lain yang bisa dicoba.

Terima kasih

Dalam kasus kami tampaknya penggunaan async/menunggu yang salah dalam beberapa pernyataan.

memiliki ini:

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

dari pada:

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

Hai @danigar Fungsi isDisplayed() mengembalikan janji jadi sangat penting untuk menggunakan menunggu jika Anda ingin menyelesaikannya. Jadi baris kode kedua Anda dalam contoh kedua terlihat baik-baik saja.
Bagaimana dengan await di baris pertama Anda, itu tergantung pada apa yang mengembalikan getModalInfo() . Tidak jelas pada titik ini dan saya tidak dapat melihat hubungan antara baris pertama dan kedua.

@marcincharezinski jasmine akan menyelesaikan Promise di except() sendiri tanpa await .

Ya. Maaf atas keterlambatannya @marcincharezinski. Metode getModalInfo() dari baris pertama mengembalikan ElementFinder (tidak dibungkus dalam Promise), dan seperti yang Anda lihat pada contoh pertama, kami awaiting untuk itu.
Kami memiliki beberapa masalah seperti ini dan setelah kami memperbaikinya, kesalahan EPIPE hilang 😊.

@CrispusDH - Saya dulu memikirkan hal yang sama sampai saya terus mendapatkan masalah seputar tes yang gagal karena alasan yang tidak saya mengerti. Saya kembali dan menambahkan await di dalam pernyataan except() saya dan itu menyelesaikannya.

@Mokkapps Setidaknya dalam TypeScript kode Anda memberikan kesalahan:
Jenis '(perintah: Perintah, deskripsi: string) => Janji batal' tidak dapat ditetapkan untuk mengetik ' T (perintah: Perintah, deskripsi: string) => Janji T'.
Ketik 'Janji batal' tidak dapat dialihkan untuk mengetik 'Janji T'.
Properti 'batal' tidak ada dalam jenis 'Janji batal'.

@kahan002

Kami akhirnya menyelesaikannya menggunakan kode ini

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

yang disebut dalam busur derajat.conf.ts

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

Terima kasih @Mokkapps untuk berbagi itu. Beberapa catatan jika seseorang ingin mengadaptasinya untuk TypeScript dan lingkungan seperti saya. os.platform() tidak diketahui, jadi saya menggunakan process.platform . Saya harus import { Command } from "selenium-webdriver"; Saya harus mengomentari concurrencyCounter karena tidak pernah dibaca. Dan karena saya memiliki peringatan TypeScript pada implisit apa pun, saya perlu membuatnya eksplisit dalam .then((result : any) => { dan .catch((error: any) => { . Saya tidak mengeluh tentang kodenya, dan saya senang Anda membagikannya (tampaknya memperbaiki masalah, meskipun agak sulit untuk mengatakannya karena terputus-putus). Saya harap komentar ini bermanfaat bagi seseorang. Terima kasih banyak untuk kembali kepada saya dan orang lain.
Tapi mungkin perubahan saya merusak perbaikan Anda, karena saya baru saja mendapatkan UnhandledPromiseRejectionWarning: Penolakan janji yang tidak ditangani (id penolakan: 4): Kesalahan: EPIPE tulis EPIPE
(node:8514) [DEP0018] DeprecationWarning: Penolakan janji yang tidak ditangani tidak digunakan lagi. Di masa mendatang, penolakan janji yang tidak ditangani akan menghentikan proses Node.js dengan kode keluar bukan nol.
Lagipula. Saya akan kembali dan melihat di mana saya harus menyalahgunakan await .

Ada kemajuan untuk pengguna OSX?

Saya pikir ini mungkin dipicu oleh situasi yang sama dengan beberapa kesalahan serupa lainnya, perbaikannya adalah menggunakan HTTP keep-alive dalam komunikasi antara kode Selenium Node dan browser. Ada perbaikan untuk ini di jalur utama Selenium, tahun lalu - tetapi tidak diterbitkan dalam versi kode apa pun.

Inilah solusi yang kami gunakan di sini, dipinjam dan diedit dari sesuatu yang ditulis oleh komentator lain di edisi lain. Siapkan package.script NPM untuk menjalankannya:

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

Kode patchernya adalah:

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

Dengan patch ini, Protractor 99%+ kuat untuk kami di Windows dan OSX, menggunakan SELENIUM_PROMISE_MANAGER: false . Jarak tempuh Anda dapat bervariasi, tergantung pada apakah kesalahan EPIPE Anda disebabkan oleh situasi mendasar yang sama seperti yang kami alami.

Saya menemukan bahwa menunggu dengan rantai (atau lebih dari array) tampaknya paling rentan. Jadi misalnya saya baru saja melihat kesalahan dengan let testFormatID: string =await element.all(by.className('ng-star-inserted')).all(by.tagName('td')).get(1). getTeks(); Ada kemungkinan kesalahan itu milik saya dan apa yang saya tulis seharusnya tidak berfungsi.

#4792 tampaknya telah memperbaiki masalah saya di Mac OS X. Terima kasih atas tipnya, IgorDorokhov .

@kahan002 sama-sama!

setiap ETA untuk 4.0.0-alpha.1 termasuk dalam busur derajat?

4792 tidak memperbaiki masalah bagi saya. Masih mendapatkan Failed: EPIPE write EPIPE kesalahan 1 dari 5 melakukan pemfilteran pada ElementArrayFinder:

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

Harap tingkatkan ke [email protected] . Tampaknya diselesaikan di sana.

@demisx saya menambalnya di sini dan berfungsi untuk saya

@rafalf Terima kasih. Jika Anda berbicara tentang "mengambil index.js dari Selenium-3.7.0 dan menambahkan ECONNREFUSED" maka saya sudah mencobanya, tetapi kadang-kadang masih mendapatkan kesalahan ini. Tolong beri tahu saya jika saya salah memahami komentar Anda.

Kesalahan EPIPE masih sering terjadi dengan busur derajat terbaru 5.4.1, chromedriver_2.43 dan async/await di MacOS Mojave. Kami tidak dapat menjalankan spesifikasi E2E di CI lagi. Lakukan beberapa putaran manual sampai semuanya lulus. Sangat tidak stabil.

@demisx
ini terutama terjadi pada saya untuk each , filter dan fungsi lain yang digunakan dengan array

bagaimana saya mengerjakannya kembali

        // 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 Ya, itu adalah hal pertama yang kami singkirkan. Meskipun, itu mengurangi frekuensi kesalahan EPIPE, mereka tidak hilang sepenuhnya. Ini semakin buruk ketika menjalankan busur derajat dengan banyak kemampuan. Jadi, sejauh ini tambalan @kylecordes tampaknya berhasil. Terima kasih @kylecordes! Mudah-mudahan, perbaikan ini akan segera mencapai master .

Di luar topik, Anda tidak perlu await di let l = await $$("q-short-list-component.ng-valid mat-label") . $$ mengembalikan ElementArrayFinder , bukan janji. 😉.

@demisx tidak, Anda salah, mungkin itu sebabnya Anda masih mendapatkan kesalahan EPIPE :dancer:
Ya - ini mengembalikan ElementArrayFinder tanpa menunggu tetapi Anda tidak akan dapat mengulanginya
dan bagian ini tidak akan berfungsi

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

jika saya melakukannya await , saya mendapatkan daftar elemen;) yang bisa saya lalui

@rafalf Maaf, saya buruk. Saya melewatkan bagian iterasi di bawah await . Anda benar sekali.

Saya mungkin salah tetapi sepertinya kesalahan seperti itu sesekali terjadi pada saya di mana pun ada penggunaan ElementArrayFinder dengan cara berikut:
await $$('some-selector').click()

@yyankowski Ya, itu adalah pengalaman saya juga. Saya melihat kesalahan ini terjadi dengan $$ lebih dari apa pun. Terutama, ketika mencoba memanggil metode pada ElementArrayFinder yang dikembalikan oleh $$ .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat