Protractor: فشل: كتابة EPIPE يتم عرض EPIPE بشكل متكرر عند SELENIUM_PROMISE_MANAGER: خطأ

تم إنشاؤها على ١٧ مايو ٢٠١٧  ·  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. استخدم تقريبًا إصدارات Node و Angular المذكورة ، متصفح Chrome ، وربما نظام التشغيل Mac OS X. (لست متأكدًا بعد من مدى أهمية المشكلة المحددة لهذه المجموعة.)
  2. قم بتعيين SELENIUM_PROMISE_MANAGER: false في التكوين (تعطيل تدفق التحكم).
  3. بسبب (2) أعلاه ، استخدم الوعود في كل مكان في مجموعة الاختبار الخاصة بك.
  4. احصل على مجموعة تحصل على عنوان URL لكل اختبار من الاختبارات العديدة وتنقر فوق أو تتحقق من وجود العنصر.
  5. ستبدأ بسرعة كبيرة في الوصول إلى أخطاء Failed: EPIPE write EPIPE بشكل غير متوقع.

أنا لا أستخدم الانتظار. لا يمكنني تحديد أي وعود لم يتم التعامل معها في رمز الاختبار أيضًا (ولدي خبرة في الوعود) ، على الرغم من اقتراح ذلك في بعض التعليقات ، لذلك لا بد لي من السماح بهذا الاحتمال. ومع ذلك ، من المدهش أن تتعطل العقدة بوعد لم يتم التعامل معه ، إذا كان هذا هو الحال. لذلك يبدو أن هناك خطأ في العقدة هنا في مكان ما ، بالإضافة إلى أي مشكلة قد تكون موجودة في الاختبار أو المنقلة أو مفك الويب ، إلخ.

  • عنوان URL الذي تجري اختباراتك عليه (إذا كان ذلك مناسبًا)

عذرا ، هذا ليس عام.

التعليق الأكثر فائدة

في مشروعنا ، ظهرت أخطاء EPIPE ، لأن الاختبارات (في TypeScript) كانت تستخدم await s بشكل غير صحيح. وبالتالي ، فإن رفض الوعد الذي لم يتم التعامل معه كان يحدث بشكل عشوائي ويؤدي إلى هذه الأخطاء. بمجرد إصلاح الاستخدامات غير الصحيحة ، لم تعد لدينا هذه الأخطاء على Node 8.

حاول التحقق من الاختبارات بعناية بحثًا عن استخدامات غير صحيحة لـ await (إما مفقودة أو زائدة عن الحاجة) أو مجرد تسلسل وعد غير صحيح (على سبيل المثال عندما نسيت إرجاع Promise من الطرق المساعدة). في حالتنا ، كان الخطأ النموذجي يستخدم:

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

بدلا من:

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

ربما سيساعد شخصًا ما لديه هذه المشكلة أيضًا.

ال 47 كومينتر

لقد كنت أصطدم بهذا كثيرًا أيضًا. يبدو أنه يحدث في كثير من الأحيان ، ربما على وجه الحصر ، عندما يكون Chrome في الخلفية. قد يكون مجرد صدفة

نعم لدي هذا الخطأ القبيح أيضًا!

نعتذر عن الرد المتأخر هنا ؛ لم أتمكن من إعادة إنتاج هذا. هل يمكن لأحدكم أن يقدم نموذجًا صغيرًا من الريبو (يمكنك استخدام https://github.com/NickTomlin/protractor-mcve كبداية) لتطبيق angular 2 الذي يعيد إنتاج هذا؟

تعد إزالة تدفق التحكم خطوة في الاتجاه الصحيح ولكنها قد تكشف عن بعض المشكلات (مثل هذه المشكلة) التي سنحتاج إلى حسابها. شكرا!

NickTomlinwcainboundary لقد قمت للتو بترقية nodejs الخاص بي إلى أحدث إصدار مستقر وهو يعمل بشكل جيد الآن.

لم يعمل:

$node -v
v6.10.1

يعمل بشكل جيد:

$node -v
v7.10.0

أرى الخطأ في العقدة v8.0.0

أرى أيضًا هذا الخطأ _ بدون منقلة (مباشرة [email protected] وأعتقد 3.3 قبله). لا يحدث هذا مطلقًا على OS X ، ولكنه يحدث كثيرًا على وكلاء الإنشاء (Linux).

لم أر هذه القضية مرفوعة ضد السيلينيوم ، لكن من المحتمل أن تكون كذلك.

لقد رأيت هذا الخطأ في OSX.

بالنسبة لي كانت القضية متعلقة بالتوقيت. كان اختباري يحاول التفاعل مع عنصر لم يكن متاحًا. على الرغم من اكتمال المهام الزاوية ، إلا أن بعض عمليات العرض على الصفحة لم تكتمل مما أدى إلى حدوث هذه المشكلة. كان من الأسهل إعادة الإنتاج على شبكتنا المستضافة نظرًا لأن الاتصالات كانت أبطأ.

لقد رأيت هذا مع تعيين waitForAngularEnabled إلى "صواب وخطأ".

قبل الترقية ، اعتدنا الحصول على أخطاء انتهاء المهلة في بعض الاختبارات نفسها. أتساءل عما إذا كان Webdriver 3.x يقول الشيء نفسه بطريقة مختلفة ...

+1 على هذا الأمر ، حيث واجهت نفس المشكلة عند تشغيل المواصفات الخاصة بي محليًا على OS X 10.12.5

لما يستحق ، كنت أقل احتمالا لرؤية خطأ EPIPE على:

  • العقدة 7.10.1
  • OSX 10.12.5
  • بروتاكتور 5.1.2
  • كروم 59.0.3071.115

وعندما أقول _ على الأرجح _ ، أعني أنه عندما قمت بتشغيل مجموعتي 7 مرات مع التهيئة أعلاه ، كانت 4 من عمليات التشغيل ناجحة إذا ركزت على الفور على متصفح Chrome ولم أحرك الماوس من أيقونة Chrome dock (ربما غير مرتبط).

في مشروعنا ، ظهرت أخطاء EPIPE ، لأن الاختبارات (في TypeScript) كانت تستخدم await s بشكل غير صحيح. وبالتالي ، فإن رفض الوعد الذي لم يتم التعامل معه كان يحدث بشكل عشوائي ويؤدي إلى هذه الأخطاء. بمجرد إصلاح الاستخدامات غير الصحيحة ، لم تعد لدينا هذه الأخطاء على Node 8.

حاول التحقق من الاختبارات بعناية بحثًا عن استخدامات غير صحيحة لـ await (إما مفقودة أو زائدة عن الحاجة) أو مجرد تسلسل وعد غير صحيح (على سبيل المثال عندما نسيت إرجاع Promise من الطرق المساعدة). في حالتنا ، كان الخطأ النموذجي يستخدم:

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

بدلا من:

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

ربما سيساعد شخصًا ما لديه هذه المشكلة أيضًا.

هل تم حل هذه المشكلة؟ ما زلت أراه مع إصدار العقدة 7.7.3 وإصدار المنقلة 5.1.1

@ sri1987 انظر تعليقي أعلاه. من المرجح أن تكون مشكلة في التعليمات البرمجية الخاصة بك ، وليس في منقلة.

@ sri1987 إذا لم يكن قابلاً للتكرار باستمرار ، فمن المؤكد أنه مرتبط بفقدان / إضافي await في مكان ما.

حصلت على هذه الأخطاء كثيرًا مؤخرًا مع SELENIUM_PROMISE_ MANAGER: خطأ
عند إجراء اختبارات متعددة

يبدو أن المشكلة هنا وفي # 4507 هي أوامر webdriver متزامنة. اقترح wvanderdeijl حلاً للحالة الخاصة ElementArrayFinder::map() في # 4508. حتى يتم حل هذا الأمر بشكل صحيح ، قد يكون الغلاف التالي لـ 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 شكرا لك. بعد إضافة هذا إلى قسم onPrepare الخاص بي من 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;
};

ذهب خطأ "فشل: EPIPE write EPIPE".

@ Xaz16 : عملت بالنسبة لنا كحل بديل ، شكرا!

ولكن يبدو أن أخطاء "EPIPE write EPIPE" هي خطأ في السيلينيوم: https://github.com/SeleniumHQ/selenium/issues/5345 والتي سيتم حلها في 4.0.0.

لذلك علينا الانتظار حتى يستخدم Protractor الإصدار 4.0.0 ويمكننا إزالة هذا الحل.

هل لدينا رابط لخارطة طريق Protractor ؟ أو أنها غير موجودة على الإطلاق

renehamburger ، هل يمكنك المساعدة؟ أحاول إعادة كتابة الحل البديل في حالة وجود SELENIUM_PROMISE_MANAGER: false . حاليًا ، إذا قمت بنسخ / تجاوز الحل الخاص بك ، فهناك الكثير من المشكلات الغريبة التي أشعر أنه يمكن حلها باستخدام async/await .

CrispusDH اضطررت إلى تغيير مقتطف الشفرة إلى

let currentCommand = Promise.resolve(); // Serialise all webdriver commands to prevent EPIPE errors const webdriverSchedule = browser.schedule; browser.schedule = (command, description) => { currentCommand = currentCommand.then(() => webdriverSchedule.call(browser, command, description) ); return currentCommand; };

لذلك قم بإزالة .driver

يبدو أن استخدام Async / wait يمثل فوضى أكبر من controlFlow.

لا يزال يتم ملاحظة الخطأ على نظام التشغيل Mac OS Sierra حتى بعد تجربة الحل أعلاه.

هل هناك أي حل آخر يمكن تجربته.

شكرا

في حالتنا يبدو أن هناك استخدام خاطئ للتزامن / انتظار في بعض التأكيدات.

كان هذا:

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

بدلا من:

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

HiDanigar Function isDisplayed() وعد بالإرجاع لذا من الضروري استخدام الانتظار إذا كنت تريد حلها. لذا يبدو السطر الثاني من التعليمات البرمجية في المثال الثاني جيدًا.
ماذا عن await في السطر الأول ، فهذا يعتمد على العائد getModalInfo() . من غير الواضح في هذه المرحلة ولا يمكنني رؤية الاتصال بين الخطين الأول والثاني.

marcincharezinski jasmine سيعمل على حل Promise في except() بنفسك بدون await .

نعم. آسف على التأخير marcincharezinski. عادت طريقة getModalInfo() للسطر الأول إلى ElementFinder (غير ملفوف في وعد) ، وكما ترى في المثال الأول كنا awaiting لذلك.
كانت لدينا بعض المشكلات مثل هذه وبمجرد إصلاحها ، اختفى خطأ EPIPE.

CrispusDH - كنت أفكر في نفس الشيء حتى ظللت أتلقى مشكلات حول فشل الاختبارات لأسباب لم أستطع فهمها. عدت وأضفت await داخل كشوف حساباتي except() وهذا ما أزالها.

Mokkapps على الأقل في TypeScript يعطي الكود الخطأ:
نوع '(الأمر: الأمر: الوصف: سلسلة) => Promise void 'غير قابل للتخصيص لكتابة' T (الأمر: الأمر ، الوصف: سلسلة) => Promise T '.
اكتب "Promise void" غير قابل للتخصيص لكتابة "Promise T".
الخاصية "إلغاء" مفقودة في نوع "الوعد باطل".

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

وهو ما يسمى في منقلة .conf.ts

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

شكرا Mokkapps لتقاسم ذلك. بضع ملاحظات في حالة رغبة شخص ما في تكييفها مع typeScript وبيئة مثل بيئتي. لم يكن os.platform() معروفًا ، لذا استخدمت process.platform . اضطررت إلى import { Command } from "selenium-webdriver"; كان علي أن أعلق على concurrencyCounter لأنه لم يتم قراءته مطلقًا. ونظرًا لوجود تحذير من نوع typeScript بشأن أي تحذير ضمني ، فقد احتجت إلى جعلها صريحة في .then((result : any) => { و .catch((error: any) => { . أنا لا أشكو من الكود ، ويسعدني أنك شاركته (يبدو أنه يحل المشكلة ، على الرغم من صعوبة معرفة ذلك لأنه كان متقطعًا). آمل أن يكون هذا التعليق مفيدًا لشخص ما. شكرًا جزيلاً على العودة إليّ وإلى الآخرين.
لكن ربما أدت التغييرات التي أجريتها إلى تعطل الإصلاح الذي أجريته ، لأنني تلقيت للتو UnhandledPromiseRejection تحذير: رفض الوعد الذي لم تتم معالجته (معرّف الرفض: 4): خطأ: EPIPE اكتب EPIPE
(العقدة: 8514) [DEP0018] تحذير الإيقاف: تم إهمال رفض الوعود غير المعالجة. في المستقبل ، ستؤدي حالات رفض الوعد التي لم تتم معالجتها إلى إنهاء عملية Node.js برمز إنهاء غير صفري.
بعد كل ذلك. سأعود وأرى أين يجب أن أسيء استخدام await .

أي تقدم لمستخدمي OSX؟

أعتقد أن هذا قد يكون ناتجًا عن نفس الموقف مثل بعض الأخطاء الأخرى المماثلة ، والتي يتمثل الإصلاح لها في استخدام HTTP المستمر في الاتصال بين كود Selenium Node والمستعرض. يوجد إصلاح لهذا في خط السيلينيوم الرئيسي ، العام الماضي - لكن لم يتم نشره في أي إصدار من هذا الرمز.

هذا هو الحل الذي نستخدمه هنا ، والذي تم استعاره وتحريره من شيء كتبه معلق آخر في عدد آخر. قم بإعداد حزمة NPM.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');
});

مع هذا التصحيح ، تعتبر المنقلة قوية بنسبة 99٪ + بالنسبة لنا على كل من Windows و OSX ، باستخدام SELENIUM_PROMISE_MANAGER: false . قد تختلف المسافة المقطوعة بالأميال ، اعتمادًا على ما إذا كان خطأ EPIPE ناتجًا عن نفس الموقف الأساسي مثل طريقتنا.

أجد أن الانتظار بالسلاسل (أو أكثر من المصفوفات) يبدو أكثر ضعفًا. على سبيل المثال ، لقد رأيت للتو الخطأ في let testFormatID: string = await element.all (by.className ('ng-star-inserted')). all (by.tagName ('td')). get (1). الحصول على النص()؛ من الممكن أن يكون الخطأ هو لي وأن ما كتبته لا ينبغي أن يعمل.

يبدو أن # 4792 قد أصلح مشاكلي على نظام التشغيل Mac OS X. شكرًا للنصيحة ، IgorDorokhov.

@ kahan002 اهلا وسهلا بكم!

أي ETA لـ 4.0.0-alpha.1 مدرج في المنقلة؟

4792 لم يصلح المشكلة بالنسبة لي. لا يزال يتم تلقي Failed: EPIPE write EPIPE error 1 من أصل 5 أثناء إجراء التصفية على ElementArrayFinder:

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

الرجاء الترقية إلى [email protected] . يبدو أنه تم حلها هناك.

demisx لقد قمت بتصحيحه هنا وهو يعمل بالنسبة لي

rafalf شكرا لك. إذا كنت تتحدث عن "أخذ index.js من السيلينيوم 3.7.0 وإضافة ECONNREFUSED" فقد حاولت ذلك ، لكنني ما زلت أتلقى هذا الخطأ من حين لآخر. يرجى إعلامي إذا أسأت فهم تعليقك.

لا يزال خطأ EPIPE يحدث كثيرًا مع أحدث منقلة 5.4.1 و chromedriver_2.43 وغير متزامن / ينتظر على MacOS Mojave. لا يمكننا تشغيل مواصفات E2E على CI بعد الآن. خذ عدة دورات يدوية حتى تمر جميعها. غير مستقر للغاية.

تضمين التغريدة
يحدث هذا بشكل أساسي بالنسبة لي مقابل each ، filter والوظائف الأخرى التي تستخدم مصفوفات iwth

كيف أعدت صياغته

        // EPIPE write EPIPE
        // await $$("short-list-component.ng-valid mat-label").each(async function (element) {
        //     labels.push(await element.getText())
        // });
        // this.logInfo("getMatLabels: " + labels);
        // return labels

        let l = await $$("q-short-list-component.ng-valid mat-label");
        for (let element of l){
            text = await element.getText();
            labels.push(text)
        }

rafalf نعم ، كان هذا أول شيء تخلصنا منه. على الرغم من أنه قلل من تكرار أخطاء EPIPE ، إلا أنها لم تختف تمامًا. تزداد الأمور سوءًا عند تشغيل منقلة ذات إمكانيات متعددة. لذا ، يبدو أن رقعة kylecordes تقوم بهذه المهمة. شكرا لك kylecordes! نأمل أن يصل هذا الإصلاح إلى master قريبًا.

خارج الموضوع ، لست بحاجة إلى await في let l = await $$("q-short-list-component.ng-valid mat-label") . إرجاع $ $$ ElementArrayFinder ، ليس وعدًا. 😉

@ demisx لا ، أنت مخطئ ، ربما لهذا السبب لا تزال أخطاء EPIPE: راقصة:
نعم - تقوم بإرجاع ElementArrayFinder بدون انتظار ولكن لن تتمكن من تكرار ذلك
وهذا الجزء لن يعمل

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

إذا قمت بعمل await ، فسأحصل على قائمة بالعناصر ؛) التي يمكنني المرور بها

rafalf آسف يا سيئة. فاتني جزء التكرار أسفل await . أنت محق تمامًا.

قد أكون مخطئًا ولكن يبدو أن مثل هذه الأخطاء تحدث بشكل متقطع بالنسبة لي أينما كان هناك استخدام لـ ElementArrayFinder بالطريقة التالية:
await $$('some-selector').click()

yyankowski نعم ، لقد كانت تجربتي أيضًا. لقد رأيت هذا الخطأ يحدث مع $$ أكثر من أي شيء آخر. خاصة ، عند محاولة استدعاء طريقة على ElementArrayFinder يتم إرجاعها بواسطة $$ .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

nt3rp picture nt3rp  ·  3تعليقات

psech picture psech  ·  3تعليقات

tmeneau picture tmeneau  ·  3تعليقات

vishalshivnath picture vishalshivnath  ·  3تعليقات

gamecheck80 picture gamecheck80  ·  3تعليقات