Bagaimana cara menunggu panggilan api selesai dan kemudian memeriksa apakah ada elemen menggunakan cypress?

saya baru mengenal cypress dan saya mencoba memeriksa apakah elemen tersebut ada di halaman setelah panggilan api selesai.

Saya melakukan posting http ke url 'things/thing1' dan setelah api ini selesai saya ingin memeriksa apakah elemen span ada di halaman.

saya sudah mencoba sesuatu seperti di bawah ini.

const setUp = () => {
    cy.apiPatchSomethings(something1)
        .then(() => {
            cy.reload();
        });
}

describe('Suite name', () => {
    before(() => {
        setUp();
    });
    it('test case', () => {
        cy.contains('span');
    }
});

kode di atas tidak berfungsi. bahkan sebelum elemen span terlihat di halaman, ia memeriksa elemen span.

jika saya menggunakan cy.wait(10000) seperti di bawah ini berfungsi

it('test case', () => {
    cy.wait(10000);
    cy.contains('span');
});

tapi saya tidak ingin menggunakan cy.tunggu. apakah ada cara lain untuk mengatasi ini. bisakah seseorang membantu saya dengan ini. terima kasih.


person stackuser    schedule 07.01.2021    source sumber
comment
Apakah cy.apiPatchSomethings mengembalikan janji?   -  person Jonah    schedule 08.01.2021


Jawaban (2)


Perintah Cypress cy.contains() ketika dipanggil dengan satu argumen adalah mencari konten,

Sintaks
cy.contains(konten)
cy.contains(konten, opsi)
cy.contains(pemilih, konten)
cy.contains( pemilih, konten, opsi)

tapi saya rasa Anda sedang mencari elemen span, jadi gunakanlah

cy.get('span')

or

cy.contains('span', 'my-content-in-span')

Dengan asumsi bukan itu masalahnya, hanya beberapa kode contoh arbitrer...

Anda dapat memodifikasi fungsi pengaturan untuk mengembalikan janji, untuk menunggu pemuatan ulang.

const setUp = () => {
  return cy.apiPatchSomethings(something1)     // need a return here
    .then(() => {
      return new Cypress.Promise(resolve => {  // inner return also
        cy.reload()
        resolve(true)                          // resolve will signal reload is finished
      })
    });
}

Karena setup() dipanggil di dalam before() Cypress akan menunggu janji diselesaikan sebelum melanjutkan.

Harap jangan menambahkan waktu tunggu atau waktu tunggu tambahan, yang sering kali disarankan. Ini hanya akan menghasilkan tes yang tidak stabil.

Catatan jika Anda tidak keberatan membuang fungsi setup(), ini menjadi jauh lebih sederhana

describe('Suite name', () => {

  before(() => {
    cy.apiPatchSomethings(something1)
      .then(() => cy.reload() );      // all commands here will be completed
                                      // before the tests start
  });

  it('test case', () => {
    cy.contains('span', 'my-content-in-span');
  }
});
person Community    schedule 08.01.2021

1.Anda dapat menunggu hingga span terlihat. Batas waktu default yang disediakan cypress adalah 4 detik.

cy.contains('span').should('be.visible')

2.Jika Anda ingin memberikan batas waktu khusus (misalnya 10 detik) khusus untuk perintah ini, Anda dapat menggunakan:

cy.contains('span', { timeout: 10000 }).should('be.visible')

3.Jika Anda ingin menambah batas waktu secara global, sebutkan ini di file cypress.json Anda:

"defaultCommandTimeout": 10000

dan, kemudian gunakan saja:

cy.contains('span').should('be.visible')

Sekarang, semua perintah Anda akan memiliki batas waktu default selama 10 detik.

person Alapan Das    schedule 08.01.2021