Skip to content

Commit fea93d4

Browse files
Added Homepage and Register page POM class and Added Register page script
1 parent 68d1698 commit fea93d4

File tree

6 files changed

+140
-1
lines changed

6 files changed

+140
-1
lines changed

package-lock.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,8 @@
1818
"devDependencies": {
1919
"@playwright/test": "^1.49.1",
2020
"@types/node": "^22.10.5"
21+
},
22+
"dependencies": {
23+
"@faker-js/faker": "^9.3.0"
2124
}
2225
}

pages/HomePage.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class HomePage{
2+
constructor(page){
3+
this.page = page;
4+
}
5+
6+
7+
}

pages/LoginPage.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ class LoginPage {
44
this.emailInput = page.locator('#email');
55
this.passwordInput = page.locator('#password');
66
this.submitButton = page.getByRole('button', { name: 'Submit' });
7-
//this.errorMessage = page.getByText('Bad credentials! Please try');
87
}
98

109
async navigate() {

pages/RegisterPage.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class RegisterPage {
2+
constructor(page) {
3+
this.page = page;
4+
this.firstnameInput = page.locator('#firstName');
5+
this.lastnameInput = page.locator('#lastName');
6+
this.phonenumberInput = page.locator('#phone');
7+
this.countryDropdown = page.locator('#countries_dropdown_menu');
8+
this.emailInput = page.locator('#emailAddress');
9+
this.passwordInput = page.locator('#password');
10+
this.term_conditionCheckbox = page.locator('#exampleCheck1');
11+
this.registerButton = page.locator('#registerBtn');
12+
this.successMessage = page.locator('#message');
13+
this.errorMessage = page.locator('#errorMessage');
14+
}
15+
16+
async navigate() {
17+
await this.page.goto('https://qa-practice.netlify.app/register');
18+
}
19+
20+
async fillRegistrationForm(data) {
21+
await this.firstnameInput.fill(data.firstName);
22+
await this.lastnameInput.fill(data.lastName);
23+
await this.phonenumberInput.fill(data.phone);
24+
25+
// Wait for dropdown options to load
26+
await this.countryDropdown.waitFor({ state: 'visible' });
27+
28+
// Use selectOption with label or value
29+
await this.countryDropdown.selectOption({ label: data.country });
30+
31+
await this.emailInput.fill(data.email);
32+
await this.passwordInput.fill(data.password);
33+
34+
if (data.acceptTerms) {
35+
await this.term_conditionCheckbox.check();
36+
}
37+
}
38+
39+
async submitForm() {
40+
await this.registerButton.click();
41+
}
42+
}
43+
44+
module.exports = RegisterPage;

tests/Forms/Register.spec.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const { test, expect } = require('@playwright/test');
2+
const { faker } = require('@faker-js/faker');
3+
const RegisterPage = require('../../pages/RegisterPage');
4+
5+
let userData = {}; // Global variable to store user data for reuse
6+
7+
test.describe('Register Page Tests with Random Data', () => {
8+
let registerPage;
9+
10+
test.beforeEach(async ({ page }) => {
11+
// Initialize the RegisterPage object
12+
registerPage = new RegisterPage(page);
13+
14+
// Navigate to the registration page
15+
await registerPage.navigate();
16+
});
17+
18+
test('should require mandatory fields (empty form)', async () => {
19+
// Submit the form without filling any fields
20+
await registerPage.submitForm();
21+
22+
// Validate error message for empty fields
23+
const validationMessage = await registerPage.emailInput.evaluate(input => input.validationMessage);
24+
expect(validationMessage).toBe("Please fill out this field.");
25+
});
26+
27+
test('should successfully register with valid data', async () => {
28+
// Generate random user data with a valid password
29+
const randomFirstName = faker.person.firstName();
30+
const randomLastName = faker.person.lastName();
31+
const randomPhone = faker.phone.number('##########');
32+
const randomCountry = 'United States of America';
33+
const randomEmail = faker.internet.email(randomFirstName, randomLastName);
34+
const randomPassword = faker.internet.password(12, true);
35+
36+
// Store user data for later use
37+
userData = {
38+
firstName: randomFirstName,
39+
lastName: randomLastName,
40+
phone: randomPhone,
41+
country: randomCountry,
42+
email: randomEmail,
43+
password: randomPassword,
44+
};
45+
46+
// Log the generated data
47+
console.log('User successfully registered with the following details:');
48+
console.table(userData);
49+
50+
// Fill out the registration form
51+
await registerPage.fillRegistrationForm({
52+
firstName: randomFirstName,
53+
lastName: randomLastName,
54+
phone: randomPhone,
55+
country: randomCountry,
56+
email: randomEmail,
57+
password: randomPassword,
58+
acceptTerms: true,
59+
});
60+
61+
// Submit the form
62+
await registerPage.submitForm();
63+
64+
// Validate success message
65+
await expect(registerPage.successMessage).toBeVisible();
66+
await expect(registerPage.successMessage).toHaveText('The account has been successfully created!'); });
67+
});

0 commit comments

Comments
 (0)