QA Kullanım Örnekleri
QA Kullanım Örnekleri: 1. Tam Tipli Page Object Model Production'a hazır TypeScript POM sınıfı // pages/LoginPage.ts // Full TypeScript Page Object Model using Playwright types i
1. Tam Tipli Page Object Model
Production'a hazır TypeScript POM sınıfı
// pages/LoginPage.ts // Full TypeScript Page Object Model using Playwright types import { type Page, type Locator } from "@playwright/test"; // Interface, genel sözleşmeyi tanımlar — bu sayfayla ne yapılabileceğini belirtir export interface ILoginPage { navigate(): Promise ; login(email: string, password: string): Promise ; getErrorMessage(): Promise ; isLoggedIn(): Promise ; } export class LoginPage implements ILoginPage { // private Locator'lar — dışarıdan selector'lara erişilemez // Tam IDE desteği için Playwright'ın 'Locator' tipini kullan private readonly emailInput: Locator; private readonly passwordInput: Locator; private readonly submitButton: Locator; private readonly errorMessage: Locator; private readonly userMenu: Locator; // Page dışarıdan enjekte edilir — dependency injection deseni constructor(private readonly page: Page) { // Tüm locator'ları constructor'da tanımla (selector değişirse hemen hata ver) this.emailInput = page.locator('[data-testid="email-input"]'); this.passwordInput = page.locator('[data-testid="password-input"]'); this.submitButton = page.locator('[data-testid="login-submit"]'); this.errorMessage = page.locator('[data-testid="error-message"]'); this.userMenu = page.locator('[data-testid="user-menu"]'); } // Tipli metod — Promise döndürür (aksiyon alır, değer döndürmez) async navigate(): Promise { await this.page.goto("/login"); await this.page.waitForLoadState("domcontentloaded"); } // Tipli parametreler — yanlış tip geçilirse TypeScript yakalar async login(email: string, password: string): Promise { await this.emailInput.fill(email); await this.passwordInput.fill(password); await this.submitButton.click(); } // string döndürür — çağıran her zaman string alacağını bilir async getErrorMessage(): Promise { await this.errorMessage.waitFor({ state: "visible" }); return await this.errorMessage.innerText(); } // boolean döndürür — assertion'lar için temiz API async isLoggedIn(): Promise { return await this.userMenu.isVisible(); } } // Test dosyasında kullanım: // test("login with valid credentials", async ({ page }) => { // const loginPage = new LoginPage(page); // page, Page tipi olarak tiplendirilmiş // await loginPage.navigate(); // await loginPage.login("user@test.com", "pass123"); // expect(await loginPage.isLoggedIn()).toBe(true); // });
Micro Lab: TypeScript kod yazma
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
TypeScript POM — interface + sınıf deseni
Interface sözleşmesi
ILoginPage interface'i dışarıdan görülen API'yi tanımlar — uygulama detayı gizlidir
private readonly selector'lar dışarıdan erişilemez — tek yetkili LoginPage sınıfıdır
Dependency injection
constructor(private readonly page: Page) — Page dışarıdan enjekte edilir, test izole kalır
TypeScript POM sınıfı oluşturma adımlarını sırala:
Interface'i tanımla (ne yapılabilir?)
Sınıfı interface'i uygulayarak yaz