typescript - בדיקת E2E של Cypress עבור KendoReact DatePicker בלתי יציבה


יש לי בדיקת Cypress E2E, שמזינה תאריך מסוים לשדה KendoReact DatePicker.

cy.insertValueInDateField("#myKendoDatePicker", getDateString(date));
Cypress.Commands.add("insertValueInDateField", (selector, fieldValue) => {
  cy.get(selector).click();
  cy.waitForDebouncer(250); // This just waits for 250 ms
     
  for (let i = 0; i < fieldValue.length; i++) {
    const currentChar = fieldValue.charAt(i);
    if (currentChar === ".") {
      cy.get(selector).type("{rightArrow}");
      cy.waitForDebouncer(250);
  } else {
      cy.get(selector).type(currentChar);
      cy.waitForDebouncer(250);  
  }
});

מה ששיטה זו עושה, הוא לדמות קלט אנושי "איטי" לשדה כך שבתיאוריה, לא ייאבד קלט.

עם זאת, בזמן הבדיקה, אחרי 5-6 חזרות מוצלחות, המבחן נכשל לפתע כי נראה שהקלט איבד.

השגיאה נראית כך: -assert (נכשל): צפוי 27.07.0023 להיות שווה ל-**27.07.2023**

כבר ניסיתי לבצע cy.get("#myKendoPicker").clear() ו-cy.get().focus() לפני אינטראקציה עם ה-DatePicker, אך זה לא הביא לשום שיפור. הוספת יותר זמן ל-debouncer, או שמירה על יותר debouncers בכל מקום, גם לא עזרה.

ניסיון לבחור את התאריך דרך כפתורים הוא מסובך מדי בגלל האופן שבו צריך לבחור אותם.

אני צריך עזרה בהפיכת הקלט ב-DatePicker ליותר יציב כך שהבדיקה תרוץ ללא תקלות ללא איבוד קלט.

תשובה #1

הדרך שבה אני עושה זאת היא להשתמש באופציית ההשהיה .type() של Cypress - לחקות את התנהגות ההקלדה של המשתמש

לדוגמה, בדף הדוגמה של Kendo Datepicker סקירת KendoReact DatePicker

const date = dayjs('2023-07-25').format('MM/DD/YYYY')

cy.get('.k-dateinput', {timeout: 10_000}).eq(0)
  .find('input')
  .focus()
  .type('{leftarrow}{leftarrow}{leftarrow}', {delay:500})
  .type(date, {delay:500})
  .type('{enter')

cy.get('.k-dateinput', {timeout: 10_000}).eq(0)
  .find('input')
  .should('have.value', '7/25/2023')

cy.get('.k-dateinput', {timeout: 10_000}).eq(0)
  .should('not.have.class', 'k-invalid')

או בדיקה אחרת שבודקת עם התאריך הלא חוקי (מוצג כגבול אדום)

cy.get('.k-dateinput', {timeout: 10_000}).eq(0)
  .find('input')
  .focus()
  .type('{leftarrow}{leftarrow}{leftarrow}', {delay:500})
  .type('7/4/23', {delay:500})
  .type('{enter')

cy.get('.k-dateinput', {timeout: 10_000}).eq(0)
  .should('have.class', 'k-invalid')