Skip to content

Commit

Permalink
Additional examples
Browse files Browse the repository at this point in the history
  • Loading branch information
itaiag committed Feb 24, 2024
1 parent c6760f2 commit e794b36
Show file tree
Hide file tree
Showing 14 changed files with 342 additions and 83 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,4 @@ dist
/playwright/.cache/
/*-snapshots/
*.png
test-results.json
23 changes: 23 additions & 0 deletions infra/reporter/my-reporter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import type {
FullConfig, FullResult, Reporter, Suite, TestCase, TestResult
} from '@playwright/test/reporter';

class MyReporter implements Reporter {
onBegin(config: FullConfig, suite: Suite) {
console.log(`Starting the run with ${suite.allTests().length} tests`);
}

onTestBegin(test: TestCase, result: TestResult) {
console.log(`Starting test ${test.title}`);
}

onTestEnd(test: TestCase, result: TestResult) {
console.log(`Finished test ${test.title}: ${result.status}`);
}

onEnd(result: FullResult) {
console.log(`Finished the run: ${result.status}`);
}
}

export default MyReporter;
16 changes: 14 additions & 2 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,30 @@ export default defineConfig({
/* Retry on CI only */
retries: 1,
/* Opt out of parallel tests on CI. */
workers: 4,
workers: 1,
// workers: process.env.CI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: 'html',
reporter: [
['list'],
['html'],
['json', {  outputFile: 'test-results.json' }]
],



/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */

use: {
baseURL: 'https://demo.playwright.dev/todomvc/',
/* Base URL to use in actions like `await page.goto('/')`. */
// baseURL: 'http://127.0.0.1:3000',

/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on',
video: {
mode: 'on', /* 'on', 'off', 'retain-on-failure', 'on-first-retry' */

}
},

/* Configure projects for major browsers */
Expand Down
23 changes: 23 additions & 0 deletions tests/acme-bank/test-acme-bank.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { test, expect } from '@playwright/test';

test(`should have $350 in account`, async ({ page }) => {
await page.goto('https://demo.applitools.com/');
await page.getByPlaceholder('Enter your username').click();
await page.getByPlaceholder('Enter your username').fill('user');
await page.getByPlaceholder('Enter your password').click();
await page.getByPlaceholder('Enter your password').fill('password');
await page.getByRole('link', { name: 'Sign in' }).click();
await page.locator('.os-icon').first().click();
await page.getByRole('link', { name: ' Make Payment' }).click();
await page.getByRole('link', { name: ' Add Account' }).click();
await page.locator('.avatar-w > img').first().click();
await page.locator('.menu-w > .logged-user-w > .logged-user-i > .avatar-w > img').click();
await page.locator('.logged-user-toggler-arrow > .os-icon').click();
await page.getByRole('link', { name: '  Credit cards' }).click();
await page.getByRole('link', { name: '  Debit cards' }).click();
await page.getByRole('link', { name: '  Loans' }).click();
await page.getByRole('link', { name: '  Mortgages' }).click();
await page.getByRole('link', { name: 'View Statement ' }).click();
await expect(page.locator('body')).toContainText('$350');
await page.locator('.logged-user-w').first().click();
});
67 changes: 36 additions & 31 deletions tests/login-demo/test-demo-application.spec.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,52 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../../infra/po/demo-app';

test.describe('Test Demo Login Application', ()=>{

test.beforeEach(async({page}) => {
await page.goto('http://localhost:8080/#!/login');
test.describe('Test Demo Login Application', () => {
test.setTimeout(5000)
test.beforeEach(async ({ page }) => {
await page.goto('http://localhost:8090/#!/login');
})

test.afterEach(async({page}) => {
test.afterEach(async ({ page }) => {
await page.close()
})

test('Test with fluent page objects',async ({page}) => {
test('should perform registation and login successfuly with fluent api', async ({ page }) => {
let loginPage = new LoginPage(page);
let registerPage = (
await(await(await(await(await
await (await (await (await (await
loginPage.clickOnRegsiterLnk())
.typeToFirstNameTb('a'))
.typeToLastNameTb('a'))
.typeToUsernameTb('a'))
.typeToPasswordTb('a'))
.clickOnRegisterBtn();
.clickOnRegisterBtn();
expect(await loginPage.getAlertText()).toBe('Registration successful');
await loginPage.typeToUsernameTb('a');
await loginPage.typeToPasswordTb('a');
const welcomePage = await loginPage.clickOnLoginBtn();
await welcomePage.clickOnDeleteBtn();
await welcomePage.clickOnLogoutLnk();
await welcomePage.clickOnLogoutLnk();

})



test('Test with page objects',async ({page}) => {
test('should perform registation and login successfuly', async ({ page }) => {
let loginPage = new LoginPage(page);
let registerPage = await loginPage.clickOnRegsiterLnk();
await registerPage.typeToFirstNameTb('Itai');
await registerPage.typeToLastNameTb('Agmon');
await registerPage.typeToUsernameTb('itaiag');
await registerPage.typeToPasswordTb('secret');
loginPage = await registerPage.clickOnRegisterBtn();
expect(await loginPage.getAlertText()).toBe('Registration successful');
await loginPage.typeToUsernameTb('itaiag');
await loginPage.typeToPasswordTb('secret');
const overviewPage = await loginPage.clickOnLoginBtn();
await overviewPage.clickOnDeleteBtn();
await overviewPage.clickOnLogoutLnk();
})

test('should perform registation and login successfuly with nice reports', async ({ page }) => {
let loginPage = new LoginPage(page);
await test.step('Register', async () => {
let registerPage = await loginPage.clickOnRegsiterLnk();
Expand All @@ -41,48 +55,39 @@ test.describe('Test Demo Login Application', ()=>{
await registerPage.typeToUsernameTb('a');
await registerPage.typeToPasswordTb('a');
loginPage = await registerPage.clickOnRegisterBtn();
expect(await loginPage.getAlertText()).toBe('Registration successful');
} );
expect(await loginPage.getAlertText()).toBe('Registration successful');
});
let overviewPage;
await test.step('Login', async () => {
await loginPage.typeToUsernameTb('a');
await loginPage.typeToPasswordTb('a');
overviewPage = await loginPage.clickOnLoginBtn();
} );
});
await test.step('Logout', async () => {
await overviewPage.clickOnDeleteBtn();
await overviewPage.clickOnLogoutLnk();
await overviewPage.clickOnLogoutLnk();

});

})

test('Test image comparison', async ({page}) => {
await expect(page).toHaveScreenshot();
await page.getByRole('link', { name: 'Register' }).click();
await expect(page).toHaveScreenshot();
});

test('test without page objects', async ({ page }) => {

test('should perform successful registration and login with page objects', async ({ page }) => {
await page.getByRole('link', { name: 'Register' }).click();
await page.locator('#firstName').click();
await page.locator('#firstName').fill('a');
await page.locator('#Text1').click();
await page.locator('#Text1').fill('a');
await page.getByLabel('First name').click();
await page.locator('[name="lastName"]').fill('a');
await page.getByLabel('First name').fill('a');
await page.getByLabel('Password').click();
await page.getByLabel('Password').fill('a');
await page.getByRole('button', { name: 'Register' }).click();
await expect(page.locator('body')).toContainText('Registration successful');
await page.getByLabel('Username').click();
await expect(page.locator('.alert')).toContainText('Registration successful');
await page.getByLabel('Username').fill('a');
await page.getByLabel('Password').click();
await page.getByLabel('Password').fill('a');
await page.getByRole('button', { name: 'Login' }).click();
await expect(page.getByRole('heading', { name: 'Hi a!' })).toBeVisible();
await expect(page.getByRole('listitem')).toContainText('a (a a)');
await page.getByText('Delete').click();
await page.getByRole('link', { name: 'Logout' }).click();
});

})

13 changes: 7 additions & 6 deletions tests/openproject/test-openproject-flat-generated.spec.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import { test, expect } from '@playwright/test';
import { test, expect, Locator } from '@playwright/test';

test.describe.configure({ mode: 'parallel' });

test.describe('Test Open Project - Auto generated', () => {
test('Test add new task', async ({ page }) => {
test('should create new task', async ({ page }) => {
const randomTaskName = Math.random().toString(36).substring(7);
await page.goto('http://localhost:8080/');

await page.getByRole('link', { name: 'Sign in ' }).click();
await page.getByLabel('Username').fill('admin');
await page.getByLabel('Username').press('Tab');
let userNameTb: Locator = page.getByLabel('Username')
await userNameTb.fill('admin');
await page.getByLabel('Password').fill('adminadmin');
await page.getByRole('button', { name: 'Sign in' }).click();
await page.getByRole('link', { name: 'Select a project ' }).click();

await page.getByRole('link', { name: 'Select a project ' }).click();
await page.locator('#ui-id-2').getByRole('link', { name: 'Demo project' }).click();

await page.locator('#main-menu-work-packages').click();
await page.locator('wp-create-button').getByLabel('Create new work package').click();
await page.getByLabel('Task', { exact: true }).click();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { test, expect } from '@playwright/test';

test('login-demo - exercise 0', async({page}) => {
// Generate random username to avoid conflicts and assert that the user is logged in

await page.goto('http://localhost:8090/');
await page.getByRole('link', { name: 'Register' }).click();

await page.locator('#firstName').fill('A');

await page.locator('#Text1').fill('A'); // Replace with better selector

await page.getByLabel('First name').fill('A');
await page.getByLabel('Password').fill('A');
await page.getByRole('button', { name: 'Register' }).click();

await expect(page.locator('body')).toContainText('Registration successful'); // Replace with better selector
await page.getByLabel('Username').fill('A');
await page.getByLabel('Password').fill('A');
await page.getByRole('button', { name: 'Login' }).click();

await expect(page.locator('h1')).toContainText('Hi A!');
await page.getByRole('link', { name: 'Logout' }).click();
});

test('login-demo - solution 0', async({page}) => {
// Generate random username to avoid conflicts and assert that the user is logged in

await page.goto('http://localhost:8090/');
await page.getByRole('link', { name: 'Register' }).click();
await page.locator('#firstName').click();
await page.locator('#firstName').fill('A');

// Replace with better selector
await page.locator('#Text1').click();
await page.locator('#Text1').fill('A');

await page.getByLabel('First name').click();
await page.getByLabel('First name').fill('A');
await page.getByLabel('Password').click();
await page.getByLabel('Password').fill('A');
await page.getByRole('button', { name: 'Register' }).click();

// Replace with better selector
await expect(page.locator('body')).toContainText('Registration successful');
await page.getByLabel('Username').click();
await page.getByLabel('Username').fill('A');
await page.getByLabel('Password').click();
await page.getByLabel('Password').fill('A');
await page.getByRole('button', { name: 'Login' }).click();

await expect(page.locator('h1')).toContainText('Hi A!');
await page.getByRole('link', { name: 'Logout' }).click();
});
49 changes: 49 additions & 0 deletions tests/playwright-course-exercises/test-ts-exercise0.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { test, expect } from '@playwright/test';


test('getting Pokemon types - Promise', async ({ request }) => {
request.get('https://pokeapi.co/api/v2/type')
.then((response) => {
console.log("Response result: " + response.ok())
response.json().then((json) => {
console.log("About to print the json");
console.log(json);
const count = json.results.length;
console.log("Number of results" + count);
expect(count).toBe(20);
});
})
.catch((error) => {console.log(error)});

// We need to wait for the promise to resolve
await new Promise(r => setTimeout(r, 2000));
});

test("getting Pokemon types - await" , async({request}) =>{
const response = await request.get('https://pokeapi.co/api/v2/type')
const json = await response.json();
console.log(json);
const count = json.results.length;
expect(count).toBe(20);
});

export class PokemonType {

constructor(private name: string,private url: string) {
}

public toString() {
return "PokemonType: " + this.name + " " + this.url;
}
}

test("getting Pokemon types - store in list" , async({request}) =>{
const response = await request.get('https://pokeapi.co/api/v2/type')
const json = await response.json();
let poks: Array<PokemonType> = [];
for (let i in json.results) {
let pType = new PokemonType(json.results[i].name, json.results[i].url);
poks.push(pType);
}
console.log(poks);
});
35 changes: 35 additions & 0 deletions tests/playwright/test-playwright-before-after.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const { test } = require('@playwright/test');
class MyService {

async init() {
console.log('init');
}

async perform() {
console.log('perform');
}

async dispose() {
console.log('dispose');
}


}


test.describe('traditional way', () => {
let service: MyService
test.beforeEach(async ({ }) => {
service = new MyService();
service.init();
});

test.afterEach(async () => {
service.dispose();
});

test('should use service', async () => {
service.perform();
});

});
Loading

0 comments on commit e794b36

Please sign in to comment.