Tidak dapat melaksanakan blok cuba tangkap berdasarkan keterlihatan elemen dalam playwright dengan typescript


Saya mempunyai satu senario untuk diautomasikan di mana jika saya melihat bahawa tajuk halaman adalah "Tajuk Contoh", maka saya boleh menanda ujian itu sebagai lulus. Jika tidak, jika itu tidak mungkin, saya perlu mengklik sesuatu yang lain yang tersedia di halaman tersebut dan kemudian mengesahkan jika tajuk itu adalah "Tajuk Contoh".

Kod saya: Saya telah mencuba menggunakan blok try catch, tetapi entah bagaimana sentiasa mendapat ralat tamat masa. Berikut adalah petikan kod

try {
    await expect.soft(page).toHaveTitle("Example title",{ timeout: 30000 })
  }
  catch (error){
    await page.getByRole('link', { name: 'here' }).click();
    await expect.soft(page).toHaveTitle("Example title",{ timeout: 30000 })
  }

Apa yang saya jangkakan adalah skrip itu akan melaksanakan blok try terlebih dahulu, dan apabila ralat tamat masa berlaku ia akan ditangkap dan blok catch kemudian akan dilaksanakan. Tetapi kod itu tidak pernah sampai ke blok catch. Sebaliknya saya mendapat ralat berikut:

Ralat:

Masa tamat ujian 30000ms telah melebihi.

Error: expect(locator).toHaveTitle(expected)

Locator: locator(':root')
Expected string: "Example title"
Received string: "Some Count Exceeded"
Call log:
  - expect.soft.toHaveTitle with timeout 30000ms
  - waiting for locator(':root')
  -   locator resolved to <html>…</html>
  -   unexpected value "dfretgrt"
  ...



>  19 |
      20 |   try {
    > 21 |     await expect.soft(page).toHaveTitle("Example title",{ timeout: 30000 })
         |                             ^
      22 |
      23 |   }
      24 |   catch (error){

Jawapan #1

Gunakan penentu "OR".

Mewujudkan penentu yang sepadan dengan salah satu daripada dua penentu. Ini boleh digunakan dalam pelbagai keadaan termasuk keadaan anda.

Contoh Penggunaan

Pertimbangkan satu senario di mana anda ingin mengklik butang "E-mel baru", tetapi kadangkala dialog tetapan keselamatan muncul sebaliknya. Dalam kes ini, anda boleh menunggu sama ada butang "E-mel baru" atau dialog dan bertindak sewajarnya.

const newEmail = page.getByRole('button', { name: 'New' });
const dialog = page.getByText('Confirm security settings');
await expect(newEmail.or(dialog)).toBeVisible();
if (await dialog.isVisible())
  await page.getByRole('button', { name: 'Dismiss' }).click();
await newEmail.click();

Rujukan: https://playwright.dev/docs/api/class-locator#locator-or