typescript - Hogyan futtassunk egy Playwright tesztet adott böngészőkön és képernyőméreten
Van egy E2E tesztcsomagom Playwrighttal, amely különböző böngészőkön és nézetablakokon fut.
A különböző böngészőket és nézetablakokat a playwright.config.ts fájlomban adtam meg:
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'],
},
},
]
Vannak bizonyos tesztek, amelyeknek a nézetablak alapján különböző állításokat és kattintásokat kell végrehajtaniuk.
Például, amikor a nézőablak elég kicsi lesz, a fejléc egy hamburger menüvé zsugorodik. Asztali gépen a fejlécben van egy „kijelentkezés” gomb, de mobilon először meg kell nyitni a hamburger menüt, hogy látható legyen a „kijelentkezés” gomb.
Hogyan írhatok olyan tesztet, amely csak mobil nézetablakokon fut (és fordítva, olyan tesztet, amely csak asztali nézetablakokon fut)?
Sikerült működésre bírnom Playwrighttal, de nem tetszett a megoldásom, és gyanítom, hogy van jobb módja ennek.
A isMobile tulajdonságot a test függvényből vettem, majd hozzáadtam egy feltételes kattintást a hamburger menü mobilon való megnyitásához így:
test('given the user is logged in: lets the user log out', async ({
page,
baseURL,
isMobile,
browserName,
}) => {
const { id } = await loginAndSaveUserProfileToDatabase({ page });
await page.goto('./home');
if (isMobile) {
await page.getByRole('button', { name: /open main menu/i }).click();
}
// Logging the user out should redirect you to the landing page.
await page.getByRole('button', { name: /open user menu/i }).click();
await page.getByRole('menuitem', { name: /log out/i }).click();
expect(page.url()).toEqual(baseURL + '/');
// ...
}));
Nem szeretem ezt a megközelítést, mert feltételes utasítást visz a tesztbe, ami egy anti-pattern (és a Playwright ESLint plugin is jelzi). Emellett a isMobile nem működik Firefox alatt.
Ideális esetben lenne egy olyan funkció a Playwrightban, mint a TestCafe meta címkéi. A TestCafében hozzáadhatsz egy meta-t a teszthez, és ezen címke alapján szűrheted a teszteket.
test
.meta('mobile', true)
('My test that only runs on mobile', async t => { /* ... */});
De a dokumentációban nem találtam ilyet (a grep címkézést leszámítva, amiben nem vagyok biztos, hogy jól megfelelne ehhez az esethez), ezért teszem fel ezt a kérdést.
Válasz #1
A tesztjeidben használhatod a test.skip-et, hogy elkerüld a feltételes Lint hibákat, így valami ilyesmit: test.skip(!isMobile || browserName==firefox, 'nem mobil');
Ettől eltekintve csak a grep vagy a grepInvert jut eszembe. Talán összegyűjtheted a mobilos tesztjeidet describe blokkokban.
test.describe('mobile', () => {
test.beforeEach(async ({ page }) => {
await page.goto(pageUrl);
});
test('some test', async ({ page })=>{
});
});
És aztán a playwright konfigurációdban egyszerűen hozzáadsz egy grep-et vagy grepInvert-et a projektjeidhez. Például:
{
name: 'chromium',
grepInvert: /mobile/,
use: {
...devices['Desktop Chrome'],
},
},
{
name: 'Mobile Chrome',
grep: /mobile/,
use: {
...devices['Pixel 5'],
},
},
