údržba
This commit is contained in:
4
PWLukTS/.gitignore
vendored
Normal file
4
PWLukTS/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
node_modules/
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/playwright/.cache/
|
8
PWLukTS/.idea/.gitignore
generated
vendored
Normal file
8
PWLukTS/.idea/.gitignore
generated
vendored
Normal 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
9
PWLukTS/.idea/PWLukTS.iml
generated
Normal 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
6
PWLukTS/.idea/misc.xml
generated
Normal 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
8
PWLukTS/.idea/modules.xml
generated
Normal 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
7
PWLukTS/.idea/vcs.xml
generated
Normal 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.
BIN
PWLukTS/.vs/PWLukTS/v17/.wsuo
Normal file
BIN
PWLukTS/.vs/PWLukTS/v17/.wsuo
Normal file
Binary file not shown.
8
PWLukTS/.vs/VSWorkspaceState.json
Normal file
8
PWLukTS/.vs/VSWorkspaceState.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"ExpandedNodes": [
|
||||
"",
|
||||
"\\tests"
|
||||
],
|
||||
"SelectedNode": "\\tests\\cookies.test.spec.ts",
|
||||
"PreviewInSolutionExplorer": false
|
||||
}
|
BIN
PWLukTS/.vs/slnx.sqlite
Normal file
BIN
PWLukTS/.vs/slnx.sqlite
Normal file
Binary file not shown.
46
PWLukTS/README.md
Normal file
46
PWLukTS/README.md
Normal 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
8
PWLukTS/helpers.ts
Normal 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
67
PWLukTS/package-lock.json
generated
Normal 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
13
PWLukTS/package.json
Normal 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"
|
||||
}
|
||||
}
|
83
PWLukTS/page-objects/HomePage.ts
Normal file
83
PWLukTS/page-objects/HomePage.ts
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
7
PWLukTS/page-objects/LoginPage.ts
Normal file
7
PWLukTS/page-objects/LoginPage.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { Locator, Page
|
||||
} from "@playwright/test";
|
||||
export class LoginPage{
|
||||
page: Page;
|
||||
|
||||
|
||||
}
|
78
PWLukTS/playwright.config.ts
Normal file
78
PWLukTS/playwright.config.ts
Normal 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,
|
||||
// },
|
||||
});
|
437
PWLukTS/tests-examples/demo-todo-app.spec.ts
Normal file
437
PWLukTS/tests-examples/demo-todo-app.spec.ts
Normal 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);
|
||||
}
|
19
PWLukTS/tests/cookies.test.spec.ts
Normal file
19
PWLukTS/tests/cookies.test.spec.ts
Normal 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();
|
||||
});
|
18
PWLukTS/tests/example.spec.ts
Normal file
18
PWLukTS/tests/example.spec.ts
Normal 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/);
|
||||
});
|
10
PWLukTS/tests/help.spec.ts
Normal file
10
PWLukTS/tests/help.spec.ts
Normal 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);
|
||||
|
||||
|
||||
});
|
1
PWLukTS/tests/login.spec.ts
Normal file
1
PWLukTS/tests/login.spec.ts
Normal file
@ -0,0 +1 @@
|
||||
// login deaktivován
|
12
PWLukTS/tests/menuButton.test.spec.ts
Normal file
12
PWLukTS/tests/menuButton.test.spec.ts
Normal 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();
|
||||
});
|
29
PWLukTS/tests/primary.menu.spec.ts
Normal file
29
PWLukTS/tests/primary.menu.spec.ts
Normal 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);
|
||||
|
||||
|
||||
});
|
10
PWLukTS/tests/search.spec.ts
Normal file
10
PWLukTS/tests/search.spec.ts
Normal 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();
|
||||
|
||||
});
|
26
PWLukTS/tests/social.test.spec.ts
Normal file
26
PWLukTS/tests/social.test.spec.ts
Normal 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);
|
||||
})
|
6
PWLukTS/tests/test-1.spec.ts
Normal file
6
PWLukTS/tests/test-1.spec.ts
Normal 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();
|
||||
});
|
9
PWLukTS/tests/tittle.spec.ts
Normal file
9
PWLukTS/tests/tittle.spec.ts
Normal 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');
|
||||
|
||||
});
|
89
PWLukTS/tests/vsechny.spec.ts
Normal file
89
PWLukTS/tests/vsechny.spec.ts
Normal 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);
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
Reference in New Issue
Block a user