140 lines
No EOL
4.6 KiB
TypeScript
140 lines
No EOL
4.6 KiB
TypeScript
import { Page, Locator, expect } from '@playwright/test';
|
|
import { BasePage } from './BasePage';
|
|
|
|
/**
|
|
* Page object representing the Trainer Profile page
|
|
*/
|
|
export class ProfilePage extends BasePage {
|
|
// Page elements
|
|
readonly pageTitle: Locator;
|
|
readonly personalInfoSection: Locator;
|
|
readonly businessInfoSection: Locator;
|
|
readonly trainingInfoSection: Locator;
|
|
readonly statisticsSection: Locator;
|
|
readonly editProfileButton: Locator;
|
|
readonly dashboardLink: Locator;
|
|
readonly createEventLink: Locator;
|
|
readonly myEventsLink: Locator;
|
|
readonly logoutLink: Locator;
|
|
|
|
constructor(page: Page) {
|
|
super(page);
|
|
this.pageUrl = '/trainer-profile/';
|
|
|
|
// Initialize locators
|
|
this.pageTitle = page.locator('h1:has-text("Trainer Profile")');
|
|
this.personalInfoSection = page.locator('section.hvac-profile-section:has(h2:text("Personal Information"))');
|
|
this.businessInfoSection = page.locator('section.hvac-profile-section:has(h2:text("Business Information"))');
|
|
this.trainingInfoSection = page.locator('section.hvac-profile-section:has(h2:text("Training Information"))');
|
|
this.statisticsSection = page.locator('section.hvac-profile-section:has(h2:text("Training Statistics"))');
|
|
this.editProfileButton = page.locator('a:has-text("Edit Profile")');
|
|
this.dashboardLink = page.locator('a[href*="/hvac-dashboard/"]');
|
|
this.createEventLink = page.locator('a[href*="/manage-event/"]');
|
|
this.myEventsLink = page.locator('a[href*="/my-events/"]');
|
|
this.logoutLink = page.locator('a:has-text("Logout")');
|
|
}
|
|
|
|
/**
|
|
* Navigate to the profile page
|
|
*/
|
|
async navigate() {
|
|
await super.navigate();
|
|
await this.page.waitForLoadState('networkidle');
|
|
await expect(this.pageTitle).toBeVisible();
|
|
}
|
|
|
|
/**
|
|
* Verify all sections are present
|
|
*/
|
|
async verifyAllSectionsPresent() {
|
|
await expect(this.personalInfoSection).toBeVisible();
|
|
await expect(this.businessInfoSection).toBeVisible();
|
|
await expect(this.trainingInfoSection).toBeVisible();
|
|
await expect(this.statisticsSection).toBeVisible();
|
|
}
|
|
|
|
/**
|
|
* Get personal information
|
|
*/
|
|
async getPersonalInfo() {
|
|
const displayName = await this.personalInfoSection.locator('h3').textContent();
|
|
const email = await this.personalInfoSection.locator('p:has-text("Email:")').textContent();
|
|
|
|
return {
|
|
displayName: displayName?.trim(),
|
|
email: email?.trim().replace('Email:', '').trim(),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get business information
|
|
*/
|
|
async getBusinessInfo() {
|
|
const businessName = await this.businessInfoSection.locator('h3').textContent();
|
|
const businessType = await this.businessInfoSection.locator('p:has-text("Type:")').textContent();
|
|
|
|
return {
|
|
businessName: businessName?.trim(),
|
|
businessType: businessType?.trim().replace('Type:', '').trim(),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get training statistics
|
|
*/
|
|
async getTrainingStats() {
|
|
const totalEvents = await this.statisticsSection.locator('.hvac-stat-card:has(h3:text("Total Events")) .metric-value').textContent();
|
|
const upcomingEvents = await this.statisticsSection.locator('.hvac-stat-card:has(h3:text("Upcoming Events")) .metric-value').textContent();
|
|
const pastEvents = await this.statisticsSection.locator('.hvac-stat-card:has(h3:text("Past Events")) .metric-value').textContent();
|
|
const ticketsSold = await this.statisticsSection.locator('.hvac-stat-card:has(h3:text("Tickets Sold")) .metric-value').textContent();
|
|
const totalRevenue = await this.statisticsSection.locator('.hvac-stat-card:has(h3:text("Total Revenue")) .metric-value').textContent();
|
|
|
|
return {
|
|
totalEvents: totalEvents?.trim(),
|
|
upcomingEvents: upcomingEvents?.trim(),
|
|
pastEvents: pastEvents?.trim(),
|
|
ticketsSold: ticketsSold?.trim(),
|
|
totalRevenue: totalRevenue?.trim(),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Click Edit Profile button
|
|
*/
|
|
async clickEditProfile() {
|
|
await this.editProfileButton.click();
|
|
await this.page.waitForLoadState('networkidle');
|
|
}
|
|
|
|
/**
|
|
* Navigate to dashboard
|
|
*/
|
|
async goToDashboard() {
|
|
await this.dashboardLink.click();
|
|
await this.page.waitForLoadState('networkidle');
|
|
}
|
|
|
|
/**
|
|
* Navigate to create event page
|
|
*/
|
|
async goToCreateEvent() {
|
|
await this.createEventLink.click();
|
|
await this.page.waitForLoadState('networkidle');
|
|
}
|
|
|
|
/**
|
|
* Navigate to my events page
|
|
*/
|
|
async goToMyEvents() {
|
|
await this.myEventsLink.click();
|
|
await this.page.waitForLoadState('networkidle');
|
|
}
|
|
|
|
/**
|
|
* Logout the user
|
|
*/
|
|
async logout() {
|
|
await this.logoutLink.click();
|
|
await this.page.waitForLoadState('networkidle');
|
|
}
|
|
} |