This commit is contained in:
Lukáš Kaňka
2023-08-15 18:27:27 +02:00
commit a117466599
116 changed files with 6597 additions and 0 deletions

4
PWLukTS/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
node_modules/
/test-results/
/playwright-report/
/playwright/.cache/

8
PWLukTS/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

9
PWLukTS/.idea/PWLukTS.iml generated Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
PWLukTS/.idea/misc.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
PWLukTS/.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/PWLukTS.iml" filepath="$PROJECT_DIR$/.idea/PWLukTS.iml" />
</modules>
</component>
</project>

7
PWLukTS/.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

Binary file not shown.

View File

@ -0,0 +1,8 @@
{
"ExpandedNodes": [
"",
"\\tests"
],
"SelectedNode": "\\tests\\cookies.test.spec.ts",
"PreviewInSolutionExplorer": false
}

BIN
PWLukTS/.vs/slnx.sqlite Normal file

Binary file not shown.

46
PWLukTS/README.md Normal file
View File

@ -0,0 +1,46 @@
Vítám tě na mém účtu GitHub.
Teď jsi na mám hřišti Playwright kde objevuji jeho funkce a další možnosti. Postupně to tu pomalu rozšiřuji.
Můžeš se podívat i na mé další projekty, poznáš je, že jsou Public. Vše co je Private jsou mé placené kurzy (které jsem koupil a nesmí se šířit) nebo projekty od jiných skvělých programátorů co většinou dělají tutoriály na YouTube.
Krátký popis kde co je:
PWlkTS - testování v Playwright na mém druhém blogu lukaskanka.cz : https://github.com/LukasKanka/PWlkTS
CY_Auta_TS - testování Cypress v TS na stránkách jednoho bazaru (ať je vše pestřejší): https://github.com/LukasKanka/CY_Auta_TS
PLaywright_GH_TS - nekolik menších testíku v Playwright: https://github.com/LukasKanka/Playwright_GH_TS
PWlkPY - Playwright v Pythonu: https://github.com/LukasKanka/PWlkPY
CyLukTS - zde zkouším Cypress s Playwright na svém blogu:https://github.com/LukasKanka/CyLukTs
Tutorials - místo kde jsem si sepsal několik základů, hlavně kolem testingu. Delší dobu neaktualizované: https://github.com/LukasKanka/Tutorials
MSTest_Win - testování na webu zive.cz v MSTest + C#: https://github.com/LukasKanka/MSTest_Win
Testing_Win - testování v Frameworcích MSTest, Nunit, xUnit: https://github.com/LukasKanka/Testing_Win
Testing_Ubuntu - testování v .Net, pokus testování jak to jde v Ubuntu: https://github.com/LukasKanka/Testing_Ubuntu
Nunit_Win - testování v Nunit a C#: https://github.com/LukasKanka/Nunit_Win
xUnit.NET - testování v xUnit a C#: https://github.com/LukasKanka/xUnit.NET
MSTest_VSCode - testování v MSTest a C#: https://github.com/LukasKanka/MSTest_VSCode
html_hints - můj pomocník s HTML: https://github.com/LukasKanka/html_hints

8
PWLukTS/helpers.ts Normal file
View File

@ -0,0 +1,8 @@
export async function loadHomepage ( page ) {
await page.goto('https://Lukan.cz');
await page.getByText('Accept').click();
};
export async function cokieeAccept ( page ) {
await page.getByText('Accept').click();
};

67
PWLukTS/package-lock.json generated Normal file
View File

@ -0,0 +1,67 @@
{
"name": "lukan",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "lukan",
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"@playwright/test": "^1.34.3"
}
},
"node_modules/@playwright/test": {
"version": "1.34.3",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.34.3.tgz",
"integrity": "sha512-zPLef6w9P6T/iT6XDYG3mvGOqOyb6eHaV9XtkunYs0+OzxBtrPAAaHotc0X+PJ00WPPnLfFBTl7mf45Mn8DBmw==",
"dev": true,
"dependencies": {
"@types/node": "*",
"playwright-core": "1.34.3"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=14"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/@types/node": {
"version": "20.2.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz",
"integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==",
"dev": true
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/playwright-core": {
"version": "1.34.3",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.34.3.tgz",
"integrity": "sha512-2pWd6G7OHKemc5x1r1rp8aQcpvDh7goMBZlJv6Co5vCNLVcQJdhxRL09SGaY6HcyHH9aT4tiynZabMofVasBYw==",
"dev": true,
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=14"
}
}
}
}

13
PWLukTS/package.json Normal file
View File

@ -0,0 +1,13 @@
{
"name": "lukan",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@playwright/test": "^1.34.3"
}
}

View File

@ -0,0 +1,83 @@
import { Locator, Page, expect
} from "@playwright/test";
export class HomePage{
page: Page;
cookiesButtonAccept: Locator;
cookiesButtonDecline: Locator;
menuButtonUvodniStrana: Locator;
menuButtonOMne: Locator;
menuButtonZasadyOchranyOsobnichUdaju: Locator;
menuButtonPodporovatele: Locator;
searchButton: Locator;
searchFieldInput: Locator;
// verifyTitleHomePage: Locator;
XsocialButton: Locator;
constructor(page: Page){
this.page = page;
this.cookiesButtonAccept = page.getByText('Accept');
this.cookiesButtonDecline = page.getByText('Decline');
this.menuButtonUvodniStrana = page.getByRole('link', { name: 'Úvodní stránka' });
this.menuButtonOMne = page.getByRole('link' , { name: 'O Mně' });
this.menuButtonZasadyOchranyOsobnichUdaju = page.getByRole('link' , { name: 'Zásady ochrany osobních údajů' });
this.menuButtonPodporovatele = page.getByRole('link' , { name: 'Podporovatelé' });
this.searchFieldInput = page.locator('//*[@id="search-7"]/form/label/input');
this.searchButton = page.locator('#search-7 > form > button > svg > use');
// this.verifyTitleHomePage = expect.toHaveTitle('Lukáš bloguje - Blog o všem možném i nemožném');
this.XsocialButton = page.locator('#block-54 > ul > li.wp-social-link.wp-social-link-twitter.wp-block-social-link > a > svg > path');
}
async gotoHome() {
await this.page.goto('https://www.lukan.cz/');
return this;
}
async clickCookiesButtonAccept() {
await this.cookiesButtonAccept.click();
return this;
}
async clickCookiesButtonDecline() {
await this.cookiesButtonDecline.click();
return this;
}
async clickUvodniStranaButton() {
await this.menuButtonUvodniStrana.click();
return this;
}
async clickOMneButton() {
await this.menuButtonOMne.click();
return this;
}
async clickZOOUButton() {
await this.menuButtonZasadyOchranyOsobnichUdaju.click();
return this;
}
async clickPodporovateleButton() {
await this.menuButtonPodporovatele.click();
return this;
}
async enterTextSearchFields() {
await this.searchFieldInput.fill('Test');
return this;
}
async clickSearchButton() {
await this.searchButton.click();
return this;
}
async clickXsocialButton() {
await this.XsocialButton.click();
return this;
}
}

View File

@ -0,0 +1,7 @@
import { Locator, Page
} from "@playwright/test";
export class LoginPage{
page: Page;
}

View File

@ -0,0 +1,78 @@
import { defineConfig, devices } from '@playwright/test';
/**
* Read environment variables from file.
* https://github.com/motdotla/dotenv
*/
// require('dotenv').config();
/**
* See https://playwright.dev/docs/test-configuration.
*/
export default defineConfig({
testDir: './tests',
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
forbidOnly: !!process.env.CI,
/* Retry on CI only */
retries: process.env.CI ? 2 : 0,
/* Opt out of parallel tests on CI. */
workers: process.env.CI ? 1 : undefined,
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
reporter: 'html',
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
use: {
headless: false,
/* 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-first-retry',
},
/* Configure projects for major browsers */
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
/*
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
*/
/* Test against mobile viewports. */
// {
// name: 'Mobile Chrome',
// use: { ...devices['Pixel 5'] },
// },
// {
// name: 'Mobile Safari',
// use: { ...devices['iPhone 12'] },
// },
/* Test against branded browsers. */
// {
// name: 'Microsoft Edge',
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
// },
// {
// name: 'Google Chrome',
// use: { ..devices['Desktop Chrome'], channel: 'chrome' },
// },
],
/* Run your local dev server before starting the tests */
// webServer: {
// command: 'npm run start',
// url: 'http://127.0.0.1:3000',
// reuseExistingServer: !process.env.CI,
// },
});

View File

@ -0,0 +1,437 @@
import { test, expect, type Page } from '@playwright/test';
test.beforeEach(async ({ page }) => {
await page.goto('https://demo.playwright.dev/todomvc');
});
const TODO_ITEMS = [
'buy some cheese',
'feed the cat',
'book a doctors appointment'
];
test.describe('New Todo', () => {
test('should allow me to add todo items', async ({ page }) => {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
// Create 1st todo.
await newTodo.fill(TODO_ITEMS[0]);
await newTodo.press('Enter');
// Make sure the list only has one todo item.
await expect(page.getByTestId('todo-title')).toHaveText([
TODO_ITEMS[0]
]);
// Create 2nd todo.
await newTodo.fill(TODO_ITEMS[1]);
await newTodo.press('Enter');
// Make sure the list now has two todo items.
await expect(page.getByTestId('todo-title')).toHaveText([
TODO_ITEMS[0],
TODO_ITEMS[1]
]);
await checkNumberOfTodosInLocalStorage(page, 2);
});
test('should clear text input field when an item is added', async ({ page }) => {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
// Create one todo item.
await newTodo.fill(TODO_ITEMS[0]);
await newTodo.press('Enter');
// Check that input is empty.
await expect(newTodo).toBeEmpty();
await checkNumberOfTodosInLocalStorage(page, 1);
});
test('should append new items to the bottom of the list', async ({ page }) => {
// Create 3 items.
await createDefaultTodos(page);
// create a todo count locator
const todoCount = page.getByTestId('todo-count')
// Check test using different methods.
await expect(page.getByText('3 items left')).toBeVisible();
await expect(todoCount).toHaveText('3 items left');
await expect(todoCount).toContainText('3');
await expect(todoCount).toHaveText(/3/);
// Check all items in one call.
await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS);
await checkNumberOfTodosInLocalStorage(page, 3);
});
});
test.describe('Mark all as completed', () => {
test.beforeEach(async ({ page }) => {
await createDefaultTodos(page);
await checkNumberOfTodosInLocalStorage(page, 3);
});
test.afterEach(async ({ page }) => {
await checkNumberOfTodosInLocalStorage(page, 3);
});
test('should allow me to mark all items as completed', async ({ page }) => {
// Complete all todos.
await page.getByLabel('Mark all as complete').check();
// Ensure all todos have 'completed' class.
await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']);
await checkNumberOfCompletedTodosInLocalStorage(page, 3);
});
test('should allow me to clear the complete state of all items', async ({ page }) => {
const toggleAll = page.getByLabel('Mark all as complete');
// Check and then immediately uncheck.
await toggleAll.check();
await toggleAll.uncheck();
// Should be no completed classes.
await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']);
});
test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => {
const toggleAll = page.getByLabel('Mark all as complete');
await toggleAll.check();
await expect(toggleAll).toBeChecked();
await checkNumberOfCompletedTodosInLocalStorage(page, 3);
// Uncheck first todo.
const firstTodo = page.getByTestId('todo-item').nth(0);
await firstTodo.getByRole('checkbox').uncheck();
// Reuse toggleAll locator and make sure its not checked.
await expect(toggleAll).not.toBeChecked();
await firstTodo.getByRole('checkbox').check();
await checkNumberOfCompletedTodosInLocalStorage(page, 3);
// Assert the toggle all is checked again.
await expect(toggleAll).toBeChecked();
});
});
test.describe('Item', () => {
test('should allow me to mark items as complete', async ({ page }) => {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
// Create two items.
for (const item of TODO_ITEMS.slice(0, 2)) {
await newTodo.fill(item);
await newTodo.press('Enter');
}
// Check first item.
const firstTodo = page.getByTestId('todo-item').nth(0);
await firstTodo.getByRole('checkbox').check();
await expect(firstTodo).toHaveClass('completed');
// Check second item.
const secondTodo = page.getByTestId('todo-item').nth(1);
await expect(secondTodo).not.toHaveClass('completed');
await secondTodo.getByRole('checkbox').check();
// Assert completed class.
await expect(firstTodo).toHaveClass('completed');
await expect(secondTodo).toHaveClass('completed');
});
test('should allow me to un-mark items as complete', async ({ page }) => {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
// Create two items.
for (const item of TODO_ITEMS.slice(0, 2)) {
await newTodo.fill(item);
await newTodo.press('Enter');
}
const firstTodo = page.getByTestId('todo-item').nth(0);
const secondTodo = page.getByTestId('todo-item').nth(1);
const firstTodoCheckbox = firstTodo.getByRole('checkbox');
await firstTodoCheckbox.check();
await expect(firstTodo).toHaveClass('completed');
await expect(secondTodo).not.toHaveClass('completed');
await checkNumberOfCompletedTodosInLocalStorage(page, 1);
await firstTodoCheckbox.uncheck();
await expect(firstTodo).not.toHaveClass('completed');
await expect(secondTodo).not.toHaveClass('completed');
await checkNumberOfCompletedTodosInLocalStorage(page, 0);
});
test('should allow me to edit an item', async ({ page }) => {
await createDefaultTodos(page);
const todoItems = page.getByTestId('todo-item');
const secondTodo = todoItems.nth(1);
await secondTodo.dblclick();
await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]);
await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages');
await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter');
// Explicitly assert the new text value.
await expect(todoItems).toHaveText([
TODO_ITEMS[0],
'buy some sausages',
TODO_ITEMS[2]
]);
await checkTodosInLocalStorage(page, 'buy some sausages');
});
});
test.describe('Editing', () => {
test.beforeEach(async ({ page }) => {
await createDefaultTodos(page);
await checkNumberOfTodosInLocalStorage(page, 3);
});
test('should hide other controls when editing', async ({ page }) => {
const todoItem = page.getByTestId('todo-item').nth(1);
await todoItem.dblclick();
await expect(todoItem.getByRole('checkbox')).not.toBeVisible();
await expect(todoItem.locator('label', {
hasText: TODO_ITEMS[1],
})).not.toBeVisible();
await checkNumberOfTodosInLocalStorage(page, 3);
});
test('should save edits on blur', async ({ page }) => {
const todoItems = page.getByTestId('todo-item');
await todoItems.nth(1).dblclick();
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages');
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur');
await expect(todoItems).toHaveText([
TODO_ITEMS[0],
'buy some sausages',
TODO_ITEMS[2],
]);
await checkTodosInLocalStorage(page, 'buy some sausages');
});
test('should trim entered text', async ({ page }) => {
const todoItems = page.getByTestId('todo-item');
await todoItems.nth(1).dblclick();
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages ');
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter');
await expect(todoItems).toHaveText([
TODO_ITEMS[0],
'buy some sausages',
TODO_ITEMS[2],
]);
await checkTodosInLocalStorage(page, 'buy some sausages');
});
test('should remove the item if an empty text string was entered', async ({ page }) => {
const todoItems = page.getByTestId('todo-item');
await todoItems.nth(1).dblclick();
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('');
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter');
await expect(todoItems).toHaveText([
TODO_ITEMS[0],
TODO_ITEMS[2],
]);
});
test('should cancel edits on escape', async ({ page }) => {
const todoItems = page.getByTestId('todo-item');
await todoItems.nth(1).dblclick();
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages');
await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape');
await expect(todoItems).toHaveText(TODO_ITEMS);
});
});
test.describe('Counter', () => {
test('should display the current number of todo items', async ({ page }) => {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
// create a todo count locator
const todoCount = page.getByTestId('todo-count')
await newTodo.fill(TODO_ITEMS[0]);
await newTodo.press('Enter');
await expect(todoCount).toContainText('1');
await newTodo.fill(TODO_ITEMS[1]);
await newTodo.press('Enter');
await expect(todoCount).toContainText('2');
await checkNumberOfTodosInLocalStorage(page, 2);
});
});
test.describe('Clear completed button', () => {
test.beforeEach(async ({ page }) => {
await createDefaultTodos(page);
});
test('should display the correct text', async ({ page }) => {
await page.locator('.todo-list li .toggle').first().check();
await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible();
});
test('should remove completed items when clicked', async ({ page }) => {
const todoItems = page.getByTestId('todo-item');
await todoItems.nth(1).getByRole('checkbox').check();
await page.getByRole('button', { name: 'Clear completed' }).click();
await expect(todoItems).toHaveCount(2);
await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]);
});
test('should be hidden when there are no items that are completed', async ({ page }) => {
await page.locator('.todo-list li .toggle').first().check();
await page.getByRole('button', { name: 'Clear completed' }).click();
await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden();
});
});
test.describe('Persistence', () => {
test('should persist its data', async ({ page }) => {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
for (const item of TODO_ITEMS.slice(0, 2)) {
await newTodo.fill(item);
await newTodo.press('Enter');
}
const todoItems = page.getByTestId('todo-item');
const firstTodoCheck = todoItems.nth(0).getByRole('checkbox');
await firstTodoCheck.check();
await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]);
await expect(firstTodoCheck).toBeChecked();
await expect(todoItems).toHaveClass(['completed', '']);
// Ensure there is 1 completed item.
await checkNumberOfCompletedTodosInLocalStorage(page, 1);
// Now reload.
await page.reload();
await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]);
await expect(firstTodoCheck).toBeChecked();
await expect(todoItems).toHaveClass(['completed', '']);
});
});
test.describe('Routing', () => {
test.beforeEach(async ({ page }) => {
await createDefaultTodos(page);
// make sure the app had a chance to save updated todos in storage
// before navigating to a new view, otherwise the items can get lost :(
// in some frameworks like Durandal
await checkTodosInLocalStorage(page, TODO_ITEMS[0]);
});
test('should allow me to display active items', async ({ page }) => {
const todoItem = page.getByTestId('todo-item');
await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
await checkNumberOfCompletedTodosInLocalStorage(page, 1);
await page.getByRole('link', { name: 'Active' }).click();
await expect(todoItem).toHaveCount(2);
await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]);
});
test('should respect the back button', async ({ page }) => {
const todoItem = page.getByTestId('todo-item');
await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
await checkNumberOfCompletedTodosInLocalStorage(page, 1);
await test.step('Showing all items', async () => {
await page.getByRole('link', { name: 'All' }).click();
await expect(todoItem).toHaveCount(3);
});
await test.step('Showing active items', async () => {
await page.getByRole('link', { name: 'Active' }).click();
});
await test.step('Showing completed items', async () => {
await page.getByRole('link', { name: 'Completed' }).click();
});
await expect(todoItem).toHaveCount(1);
await page.goBack();
await expect(todoItem).toHaveCount(2);
await page.goBack();
await expect(todoItem).toHaveCount(3);
});
test('should allow me to display completed items', async ({ page }) => {
await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
await checkNumberOfCompletedTodosInLocalStorage(page, 1);
await page.getByRole('link', { name: 'Completed' }).click();
await expect(page.getByTestId('todo-item')).toHaveCount(1);
});
test('should allow me to display all items', async ({ page }) => {
await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check();
await checkNumberOfCompletedTodosInLocalStorage(page, 1);
await page.getByRole('link', { name: 'Active' }).click();
await page.getByRole('link', { name: 'Completed' }).click();
await page.getByRole('link', { name: 'All' }).click();
await expect(page.getByTestId('todo-item')).toHaveCount(3);
});
test('should highlight the currently applied filter', async ({ page }) => {
await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected');
//create locators for active and completed links
const activeLink = page.getByRole('link', { name: 'Active' });
const completedLink = page.getByRole('link', { name: 'Completed' });
await activeLink.click();
// Page change - active items.
await expect(activeLink).toHaveClass('selected');
await completedLink.click();
// Page change - completed items.
await expect(completedLink).toHaveClass('selected');
});
});
async function createDefaultTodos(page: Page) {
// create a new todo locator
const newTodo = page.getByPlaceholder('What needs to be done?');
for (const item of TODO_ITEMS) {
await newTodo.fill(item);
await newTodo.press('Enter');
}
}
async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) {
return await page.waitForFunction(e => {
return JSON.parse(localStorage['react-todos']).length === e;
}, expected);
}
async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) {
return await page.waitForFunction(e => {
return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e;
}, expected);
}
async function checkTodosInLocalStorage(page: Page, title: string) {
return await page.waitForFunction(t => {
return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t);
}, title);
}

View File

@ -0,0 +1,19 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
// test odsouhlasení cookies
test('HomePage click Accept cookies', async ({ page }) => {
const homePage = new HomePage(page);
await (await homePage.gotoHome())
.clickCookiesButtonAccept();
});
// test zamítnutí cookies
test('HomaPage click Decline cookies' , async ({page}) => {
const homePage = new HomePage(page);
await (await homePage.gotoHome())
.clickCookiesButtonDecline();
});

View File

@ -0,0 +1,18 @@
import { test, expect } from '@playwright/test';
test('has title', async ({ page }) => {
await page.goto('https://playwright.dev/');
// Expect a title "to contain" a substring.
await expect(page).toHaveTitle(/Playwright/);
});
test('get started link', async ({ page }) => {
await page.goto('https://playwright.dev/');
// Click the get started link.
await page.getByRole('link', { name: 'Get started' }).click();
// Expects the URL to contain intro.
await expect(page).toHaveURL(/.*intro/);
});

View File

@ -0,0 +1,10 @@
import { test, expect } from '@playwright/test';
import { loadHomepage, cokieeAccept
} from "../helpers";
test('1' , async ({ page }) => {
await loadHomepage(page);
await cokieeAccept(page);
});

View File

@ -0,0 +1 @@
// login deaktivován

View File

@ -0,0 +1,12 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
test('Click menu button with HomePage' , async ({ page }) => {
const homePage = new HomePage(page);
await (await (await (await (await (await homePage.gotoHome())
.clickCookiesButtonAccept())
.clickUvodniStranaButton())
.clickOMneButton())
.clickZOOUButton())
.clickPodporovateleButton();
});

View File

@ -0,0 +1,29 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
// test Textů v menu
test('Otestování textů v menu', async ({ page }) => {
const verifyTextMenu = [
"Úvodní stránka",
"O mně",
"Zásady ochrany osobních údajů",
"Podporovatelé"
];
const homepage = new HomePage(page);
await homepage.gotoHome();
const navLinks = page.locator('#menu-menu-1 li[id*=menu]');
for (const el of await navLinks.elementHandles()) {
console.log(await el.textContent());
}
expect(await navLinks.allTextContents()).toEqual(verifyTextMenu);
});

View File

@ -0,0 +1,10 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
test('Search web' , async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await homePage.enterTextSearchFields();
await homePage.clickSearchButton();
});

View File

@ -0,0 +1,26 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
test('Sociální sítě X- kliknutí na Homepage' , async ({page}) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
// Klikne na ikonu Twitter a přesměrujeme se na web Twitter
await homePage.clickXsocialButton();
const expectedUrl = 'https://twitter.com/KankysCZ';
// Kontrola odkazu z prokliku že jsem na správné stránce, než nám Musk změní adresu
const currentUrl = await page.url();
if (currentUrl === expectedUrl) {
console.log('Super jsi na správné stránce!');
} else {
console.log(`Průser jsi nejsi na správné stránce. Jsi tu ${currentUrl}`);
}
});
test('Sociální sítě LinkId - kliknutí na Hompage', ({page}) => {
const homePage = new HomePage(page);
})

View File

@ -0,0 +1,6 @@
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://lukan.cz/');
await page.getByRole('link', { name: 'Úvodní stránka' }).click();
});

View File

@ -0,0 +1,9 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
test('Kontrola titulku', async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await expect(page).toHaveTitle('Lukáš bloguje - Blog o všem možném i nemožném');
});

View File

@ -0,0 +1,89 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../page-objects/HomePage';
test.describe('Kolekce testů', () => {
test('Kontrola titulku', async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await expect(page).toHaveTitle('Lukáš bloguje - Blog o všem možném i nemožném');
});
test('Kontrola textu na stránce', async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
const headingText = await page.locator('text=Lukáš bloguje Blog o všem možném i nemožném ');
await expect(headingText).toBeVisible();
await expect(page).toHaveURL(/./);
});
test('HomePage click Accept cookies', async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await homePage.clickCookiesButtonAccept();
});
// test zamítnutí cookies
test('HomaPage click Decline cookies' , async ({page}) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await homePage.clickCookiesButtonDecline();
})
test('Click menu button with HomePage' , async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await homePage.clickUvodniStranaButton();
await homePage.clickOMneButton();
await homePage.clickZOOUButton();
await homePage.clickPodporovateleButton();
});
test('Search web' , async ({ page }) => {
const homePage = new HomePage(page);
await homePage.gotoHome();
await homePage.enterTextSearchFields();
await homePage.clickSearchButton();
});
test('test', async ({ page }) => {
await page.goto('https://lukan.cz/');
await page.getByRole('link', { name: 'Úvodní stránka' }).click();
});
test('Otestování textů v menu', async ({ page }) => {
const verifyTextMenu = [
"Úvodní stránka",
"O mně",
"Zásady ochrany osobních údajů",
"Podporovatelé"
];
await page.goto('https://lukan.cz/')
const navLinks = page.locator('#menu-menu-1 li[id*=menu]');
for (const el of await navLinks.elementHandles()) {
console.log(await el.textContent());
}
expect(await navLinks.allTextContents()).toEqual(verifyTextMenu);
});
});