December 10

πŸ•ΈοΈΠ”Π²ΠΎΡŽΡ€ΠΎΠ΄Π½Ρ‹Π΅ Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ 🎭Playwright

На индСксы нСльзя ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ, Ссли порядок элСмСнтов Π½Π΅ послСдоватСлСн, ΠΈΠ»ΠΈ количСство элСмСнтов мСняСтся.

ИспользованиС динамичСских тСстовых ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (Ρ‚ΠΈΠΏΠ° edit-${username}-button) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТным Π² создании ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ, ΠΈΠ±ΠΎ зависит ΠΎΡ‚ форматирования динамичСской части Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Π°.

Если страница ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ нСсколько экзСмпляров ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ элСмСнта (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°), стратСгия Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΌΠ΅Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½ для тСста.

На индСксы нСльзя ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ, Ссли порядок элСмСнтов Π½Π΅ послСдоватСлСн, ΠΈΠ»ΠΈ количСство элСмСнтов мСняСтся. ИспользованиС динамичСских тСстовых ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (Ρ‚ΠΈΠΏΠ° edit-${username}-button) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТным Π² создании ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ, ΠΈΠ±ΠΎ зависит ΠΎΡ‚ форматирования динамичСской части Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Π°.

ИспользованиС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π°Π·Ρ‹Π²Π°ΡŽ Β«Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ-ΠΊΡƒΠ·Π΅Π½Π°ΠΌΠΈΒ» ΠΈΠ»ΠΈ Π΄Π²ΠΎΡŽΡ€ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (cousin locators), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ сСйчас элСмСнт, являСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ я Ρ…ΠΎΡ‡Ρƒ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«EditΒ» для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Dawn Summers.

Если ΠΌΡ‹ просто попытаСмся Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ рСдактирования, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, тСст Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сущСствуСт нСсколько элСмСнтов, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… этому Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€Ρƒ.

await page.getByTestId('edit-profile-button').click()

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ поиска, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ искал ΠΊΠ½ΠΎΠΏΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ профиля Π”ΠΎΠ½.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ с Π²Ρ‹Π±ΠΎΡ€Π° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π² этом сцСнарии. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, Ρ‡Ρ‚ΠΎ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π”ΠΎΠ½ остаСтся постоянным ΠΌΠ΅ΠΆΠ΄Ρƒ тСстовыми запусками, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ этот элСмСнт, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

page.getByTestId(β€˜user-id’).filter({hasText: β€˜920437’})

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²Π²Π΅Ρ€Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

getProfileContainer(userId: string) {
  const userIdElement = page.getByTestId(β€˜user-id’).filter({hasText: userId})
  return page.getByTestId(β€˜profile-container’).filter({has: userIdElement})
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ профиля, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° Π½ΡƒΠΆΠ½ΡƒΡŽ Π½Π°ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ рСдактирования.

async clickEditProfileButton(userId: string) {
  const profileContainer = getProfileContainer(userId);
  await profileContainer.getByTestId(β€˜edit-profile-button’).click()
}

Π’ΠΎΡ‚ ΠΈ всС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° основС прСдоставлСнного Π½Π°ΠΌΠΈ ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ΠΎΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π²ΠΈΠ΄ этого ΠΊΠΎΠ΄Π° Π² Ρ„Π°ΠΉΠ»Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ страницы (Page Object Model file):

export class profileList {
  readonly page: Page;
  readonly profileContainer: Locator;
  readonly userId: Locator;
  readonly editProfileButton: Locator;

  constructor(page: Page) {
    this.page = page;
    this.profileContainer = page.getByTestId(β€˜profile-container’);
    this.userId = page.getByTestId(β€˜user-id’);
    this.editProfileButton = page.getByTestId(β€˜edit-profile-button’);
  }

  getProfileContainer(userId: string) {
    const userIdElement = this.userId.filter({hasText: userId})
    return this.profileContainer.filter({has: userIdElement})
  }

  async clickEditProfileButton(userId: string) {
    const profileContainer = this.getProfileContainer(userId);
    await profileContainer.locator(this.editProfileButton).click()
  }

}

Зоя КлСгг