StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • SEO & Performance Sprint
  • QA & Stabilizacja
  • Konsultacje Product / Delivery
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
SEOQA

Automatyczne testy regresji SEO w GitHub Actions — noindex, canonical i redirecty pod kontrolą CI/CD

Przypadkowy noindex potrafi wyciąć stronę z Google na tygodnie. Pokazuję, jak testami w Playwright i GitHub Actions zablokować regresje SEO — meta tagi, canonical i redirecty — zanim trafią na produkcję.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
30 maja 2026 11:00
Czytanie
5 min czytania
Aktualizacja
Wersja pierwotna

Jedna linijka w niewłaściwym miejscu — <meta name="robots" content="noindex">, która miała zostać tylko na środowisku testowym — i strona znika z Google na tygodnie. To jeden z najdroższych błędów w SEO technicznym, ponieważ długo pozostaje niewidoczny: build przechodzi, strona działa, użytkownicy niczego nie zauważają, a ruch organiczny po cichu się osuwa. Dobra wiadomość jest taka, że tę klasę błędów da się złapać automatycznie, zanim kod w ogóle trafi na produkcję. W tym artykule pokazuję, jak zbudować testy regresji SEO w Playwright i wpiąć je w GitHub Actions, żeby pull request z zepsutym canonicalem czy przypadkowym noindexem po prostu nie przeszedł.

Artykuł w skrócie

  • Przypadkowy noindex to jeden z najdroższych błędów SEO — wycina stronę z indeksu i może długo pozostać niewidoczny.
  • CI/CD przesuwa wykrycie z produkcji na pull request — zamiast dowiadywać się po spadku ruchu, dowiadujesz się od czerwonego testu, jeszcze przed zmergowaniem zmiany.
  • Test SEO to sprawdzenie <head> i przekierowań — meta robots, canonical, tytuł, description, hreflang oraz status redirectów. Za pomocą lekkich asercji, a nie pełnych scenariuszy E2E.
  • Playwright to dziś rozsądny domyślny wybór — wyższa stabilność testów i natywna integracja z GitHub Actions; Cypress również się nadaje.
  • Redirecty testuj bez podążania za nimi — sprawdzaj status pierwszej odpowiedzi i nagłówek Location, żeby wyłapać podmianę 301 na 302 i zerwane przekierowania.
  • Koszt minimalny, a ochrona realna — kilkanaście asercji wykonuje się w sekundy, a chroni przed regresją, której naprawa liczona jest w tygodniach utraconego ruchu.

Dlaczego SEO też zasługuje na testy regresji

W praktyce testujemy logikę biznesową, komponenty, ścieżki użytkownika — a metadane SEO traktujemy często tak, jakby były odporne na zmiany. Tymczasem to właśnie one są wyjątkowo kruche, ponieważ zależą od konfiguracji, która może się łatwo wymknąć spod kontroli przy refaktorze. Przykładowo, ktoś zmienia komponent layoutu i niechcący usuwa tag canonical; ktoś inny dodaje noindex na środowisku staging i zapomina go zdjąć przed mergem do głównej gałęzi. Migracja routingu podmienia 301 na 302, przez co Google przestaje przekazywać moc linków. Scenariuszy jest mnóstwo i nieuwaga może drogo kosztować.

Wspólnym mianownikiem tych błędów jest to, że żaden z nich nie wywoła awarii widocznej dla użytkownika. Aplikacja działa sobie bez zarzutu, testy funkcjonalne są zielone, a problem ujawnia się dopiero, gdy ruch organiczny zaczyna spadać — czyli z perspektywy biznesu o wiele za późno. Test regresji SEO domyka tę lukę, bo sprawdza dokładnie te rzeczy, których nie widać gołym okiem, ale które decydują o tym, jak stronę traktuje wyszukiwarka.

Co dokładnie testować

Zanim napiszemy kod, warto ustalić zakres. Dobry zestaw testów SEO koncentruje się na kilku obszarach, które najczęściej ulegają regresji.

Pierwszy to Meta robots to znacznik (np. <meta name='robots' content='noindex'>) albo nagłówek HTTP, który mówi wyszukiwarce, czy strona ma być indeksowana i czy robot ma podążać za linkami. Wartość noindex wyklucza stronę z wyników wyszukiwania. — najważniejsza asercja w całym zestawie. Strony, które mają się indeksować, nie mogą zawierać noindex. Drugi to Canonical (rel=canonical) to znacznik wskazujący wyszukiwarce, który adres URL jest wersją podstawową danej treści. Zapobiega problemom z duplikacją, gdy ta sama treść dostępna jest pod wieloma adresami. — musi istnieć, być bezwzględnym adresem i wskazywać właściwą wersję strony. Trzeci to podstawowe metadane, czyli tytuł i meta description, których brak albo pustka oznacza utratę kontroli nad tym, jak strona prezentuje się w wynikach.

Na stronach wielojęzycznych dochodzą tagi Hreflang to atrybut wskazujący wyszukiwarce językowe i regionalne warianty tej samej strony, np. polski i angielski. Poprawnie ustawiony zapobiega duplikacji i kieruje użytkownika do właściwej wersji językowej., których spójność łatwo zepsuć przy zmianach w i18n. Wreszcie przekierowania — kluczowe redirecty muszą zwracać 301, a nie 302 czy, co gorsza, prowadzić przez łańcuch pośrednich adresów. Każdy z tych obszarów to jedna albo dwie proste asercje, a razem tworzą siatkę, przez którą typowe regresje SEO po prostu nie przejdą.

Testy metadanych w Playwright

Zacznijmy od najważniejszego — sprawdzenia zawartości <head> na kluczowych typach stron. Poniższy test weryfikuje, że strona produktowa indeksuje się poprawnie i ma komplet metadanych.

Code
// tests/seo/metadata.spec.ts
import { test, expect } from '@playwright/test'
 
test.describe('Regresja SEO — metadane', () => {
  test('strona produktu ma poprawne metadane i nie jest noindex', async ({
    page,
  }) => {
    await page.goto('/produkty/przykladowy-produkt')
 
    // Najważniejsze: brak przypadkowego noindex
    const robots = await page
      .locator('meta[name="robots"]')
      .getAttribute('content')
    expect(robots ?? '').not.toContain('noindex')
 
    // Canonical istnieje, jest bezwzględny i wskazuje właściwy adres
    const canonical = await page
      .locator('link[rel="canonical"]')
      .getAttribute('href')
    expect(canonical).toMatch(/^https:\/\//)
    expect(canonical).toContain('/produkty/przykladowy-produkt')
 
    // Tytuł i description są obecne i niepuste
    await expect(page).toHaveTitle(/.+/)
    const description = await page
      .locator('meta[name="description"]')
      .getAttribute('content')
    expect(description?.length ?? 0).toBeGreaterThan(0)
  })
})

Logika jest prosta i czytelna, ale dokładnie ta prostota jest zaletą — każdy w zespole rozumie, co test sprawdza i dlaczego jego niepowodzenie blokuje merge. Asercja na noindex jest tu celowo postawiona jako pierwsza, bo to ona chroni przed najkosztowniejszym scenariuszem.

Info

Zamiast testować każdą podstronę z osobna, sprawdzaj reprezentatywne typy stron: stronę główną, listę, kartę produktu albo wpis bloga, stronę kategorii. Jeśli komponenty metadanych są współdzielone, jeden test na typ wyłapie regresję wspólną dla wszystkich stron tego typu. To utrzymuje zestaw szybkim i łatwym w utrzymaniu.

Testy przekierowań

Drugi filar to przekierowania. Tutaj kluczowy jest jeden szczegół: żeby sprawdzić status redirectu, nie wolno za nim automatycznie podążać, bo wtedy zobaczysz dopiero stronę docelową, a nie samo przekierowanie. W Playwright wykonujemy więc surowe żądanie z wyłączonym podążaniem za redirectami.

Code
// tests/seo/redirects.spec.ts
import { test, expect } from '@playwright/test'
 
test.describe('Regresja SEO — przekierowania', () => {
  test('stary adres przekierowuje 301 na nowy, bez łańcucha', async ({
    request,
  }) => {
    const response = await request.get('/stary-adres-produktu', {
      maxRedirects: 0,
    })
 
    // Status musi być 301 (trwałe), nie 302 (tymczasowe)
    expect(response.status()).toBe(301)
 
    // Location wskazuje docelowy, kanoniczny adres
    expect(response.headers()['location']).toBe('/nowy-adres-produktu')
  })
})

Ten test wyłapuje trzy typowe regresje naraz: podmianę trwałego 301 na tymczasowy 302 (przez co Google nie przenosi pozycji na nowy adres), zerwanie przekierowania, które zaczyna zwracać 404, oraz pojawienie się łańcucha pośrednich redirectów. Każdy z tych przypadków potrafi po cichu kosztować pozycje wypracowane latami, a tutaj kończy się czerwonym testem w pull requeście. Jeśli prowadzisz większą migrację adresów, warto połączyć to z wiedzą z artykułu o migracji treści i redirectach 301 przy przejściu z WordPressa na Next.js.

Wpięcie w GitHub Actions

Same testy nie chronią niczego, dopóki nie uruchamiają się automatycznie przy każdej zmianie. Centralną częścią automatyzacji jest GitHub Actions to wbudowany w GitHub system CI/CD, który uruchamia zdefiniowane zadania (workflow) w odpowiedzi na zdarzenia, np. push albo otwarcie pull requesta. Pozwala zablokować merge, gdy testy nie przejdą., gdzie definiujemy workflow uruchamiany na każdy pull request.

Code
# .github/workflows/seo-regression.yml
name: Regresja SEO
 
on:
  pull_request:
    branches: [main]
 
jobs:
  seo-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
 
      - run: npm ci
      - run: npx playwright install --with-deps chromium
 
      # Build i start aplikacji w tle
      - run: npm run build
      - run: npm start &
      - run: npx wait-on http://localhost:3000
 
      # Tylko testy SEO — szybko i celowo
      - run: npx playwright test tests/seo

Po dodaniu tego workflow każdy pull request automatycznie buduje aplikację i uruchamia na niej zestaw testów SEO. Jeśli któryś nie przejdzie — bo ktoś zostawił noindex albo zepsuł canonical — GitHub oznaczy sprawdzenie jako nieudane i zablokuje merge. Aby ta blokada faktycznie działała, ustaw ten workflow jako wymagane sprawdzenie statusu w regułach ochrony gałęzi main. Dopiero wtedy zielony test staje się warunkiem wejścia kodu na produkcję, a nie tylko informacją, którą można zignorować.

Werdykt Labu

Regresja SEO to wyjątkowo podstępna i paskudna klasa błędów, bo nie wywołuje żadnej widocznej awarii — aplikacja normalnie działa, testy funkcjonalne są zielone, a strona po cichu wypada z Google. Przypadkowy noindex, zepsuty canonical czy podmieniony status przekierowania potrafią kosztować tygodnie ruchu, zanim ktokolwiek zauważy problem. Właśnie dlatego te rzeczy zasługują na taką samą ochronę testami jak logika biznesowa.

Mechanika jest bardzo prosta i tania we wdrożeniu: kilkanaście lekkich asercji w Playwright sprawdza zawartość <head> i zachowanie przekierowań, a GitHub Actions uruchamia je na każdym pull requeście i blokuje merge, gdy coś się nie zgadza. Koszt to sekundy w pipelinie, a w zamian zyskujemy bezpieczeństwo i święty spokój.

Jeśli chcesz wpiąć testy regresji SEO w pipeline swojego projektu Next.js, ale nie wiesz, od czego zacząć ani co dokładnie objąć asercjami, napisz do mnie — pomagam budować takie siatki bezpieczeństwa dopasowane do konkretnej architektury serwisu.

  • Dlaczego SEO też zasługuje na testy regresji1 min
  • Co dokładnie testować1 min
  • Testy metadanych w Playwright1 min
  • Testy przekierowań1 min
  • Wpięcie w GitHub Actions1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i dokumentacjaZweryfikowano: 30 maja 2026

API testowe, obsługę przekierowań i integrację z CI zweryfikowano na podstawie oficjalnej dokumentacji Playwright, GitHub i Google:

Playwright: API testing (request), Playwright: GitHub Actions, GitHub: Required status checks, Google: robots meta tag i noindex.

Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Cursor czy Antigravity? Co wybrać do kodowania z AI
Cursor czy Antigravity? Co wybrać do kodowania z AI

Cursor czy Antigravity w 2026? Porównanie dwóch filozofii kodowania z AI — pilot kontra autonomiczni agenci. Modele, ceny, limity, stabilność i realna przydatność we frontendzie.

Maciej Sala

Maciej Sala

Founder Strivelab

1 czerwca 2026
Audyt SEO to nie lista TODO — dlaczego zalecenia techniczne muszą zamieniać się w PR-y
Audyt SEO to nie lista TODO — dlaczego zalecenia techniczne muszą zamieniać się w PR-y

Większość audytów SEO kończy się jako PDF, którego nikt nie wdraża. Pokazuję, dlaczego techniczna optymalizacja działa dopiero, gdy zalecenia zamieniają się w pull requesty, i jak zorganizować ten proces.

Maciej Sala

Maciej Sala

Founder Strivelab

30 maja 2026
WordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracją
WordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracją

Zanim zaczniesz migrację, musisz wiedzieć dokąd. Matryca pięciu zmiennych (rozmiar serwisu, wydajność, e-commerce, model edycji treści, częstotliwość zmian) pokazuje, czy Twój następny stack to Astro, Next.js, czy nadal WordPress — zanim wydasz złotówkę na przepisywanie strony.

Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026