In scenarios that reach the order confirmation page, the query string includes more than the issPageValue, whiche was breaking validateURL
58 lines
No EOL
2.6 KiB
TypeScript
58 lines
No EOL
2.6 KiB
TypeScript
import { expect, type Locator, type Page } from '@playwright/test';
|
|
import { BasePage } from './BasePage';
|
|
import { IAppointmentDetails } from '@business-logic/types/CustomerDetails';
|
|
import { formatDate, formatTime } from '@impl/utils/DateUtils';
|
|
import { ServiceLocation } from '@business-logic/types/Enums';
|
|
|
|
export class SchedulePage extends BasePage {
|
|
readonly page: Page;
|
|
issPageValue = 'schedule-page';
|
|
readonly firstAvailableDate: Locator;
|
|
readonly firstAvailableTime: Locator;
|
|
readonly modalContinueButton: Locator;
|
|
readonly dropOffButton: Locator;
|
|
readonly dateText: Locator;
|
|
readonly viewMoreDatesLink: Locator;
|
|
|
|
constructor(page: Page) {
|
|
super(page);
|
|
this.page = page;
|
|
this.firstAvailableDate = this.page.locator('.selectable-day').locator('nth=0');
|
|
this.firstAvailableTime = this.page.locator('label').filter({ hasText: /AM|PM/ }).locator('div').locator('nth=0');
|
|
this.modalContinueButton = this.page.locator('#modalbtn');
|
|
this.dropOffButton = this.page.getByText('Drop off your vehicle', { exact: true });
|
|
this.dateText = this.page.locator('[class="modal-header mb-2 mt-2"]');
|
|
this.viewMoreDatesLink = this.page.getByText(/View more dates/).first();
|
|
}
|
|
|
|
async scheduleAppointment(appointmentDetails: IAppointmentDetails) {
|
|
const formattedDate = formatDate(appointmentDetails.appointmentDate!);
|
|
const formattedTime = formatTime(appointmentDetails.appointmentDate!);
|
|
const dateInput = this.page.locator(`div[id="${formattedDate}"]`);
|
|
const timeButton = this.page.locator(`div[aria-label="${formattedTime}"]`);
|
|
if (await dateInput.isVisible()) {
|
|
await dateInput.click();
|
|
} else {
|
|
await this.viewMoreDatesLink.click();
|
|
await dateInput.click();
|
|
}
|
|
await timeButton.click();
|
|
await this.modalContinueButton.click();
|
|
}
|
|
|
|
async scheduleFirstAppointment(serviceLocation: ServiceLocation) {
|
|
if (await this.firstAvailableDate.isVisible()) {
|
|
await this.firstAvailableDate.click();
|
|
} else {
|
|
await this.viewMoreDatesLink.click();
|
|
while(await this.firstAvailableDate.isHidden()){
|
|
await this.viewMoreDatesLink.click();
|
|
}
|
|
await this.firstAvailableDate.click();
|
|
}
|
|
|
|
serviceLocation === ServiceLocation.DropOff ? await this.dropOffButton.click() : await this.firstAvailableTime.click();
|
|
await this.modalContinueButton.click();
|
|
return (`${await this.dateText.allInnerTexts()}`);
|
|
}
|
|
} |