* Initial import of playwright tests * Pipeline changes for automated tests * Modified pipeline for testing * Attempt #2 * Attempt #3 * Added missing paren * Removed debug stuff from pipeline * Changes from playwright repo * Changed pipeline for debugging * Fix for ServiceLocationPage playwright locators * Change pipeline to run with TEST APIs * Moved more of Siraj's changes to this repo * Changed where updating env occurs * Changed location of env update again * Escaped double quotes * Added visible report in Azure * Moved changes into main pipeline * Made it so dotenv only runs config in local
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;
|
|
url = process.env['BASE_URL']! + '/?issPage=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()}`);
|
|
}
|
|
} |