πΈοΈΠΠ²ΠΎΡΡΠΎΠ΄Π½ΡΠ΅ Π»ΠΎΠΊΠ°ΡΠΎΡΡ π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()
}
}