💻 Frontend

Pobranie informacji z obiektu strony dataLayer w Playwright

Language
date
Aug 27, 2023
slug
pobranie-obiektu-window-w-playwright
author
status
Public
tags
TypeScript
Playwright
Porady
Automatyzacja
summary
Na przykładzie obiektu testowanej strony: dataLayer, dowiesz się jak szybko odnaleźć niezbędne wartości w Playwright
type
Post
thumbnail
pobranie-obiektu-window-w-playwright.jpg
updatedAt
Oct 5, 2023 10:46 AM
category
💻 Frontend
Testowana strona może przechowywać dane na różne sposoby.
Jednym z nich może być plik dataLayer, który może być elementem testowanej przez nas strony internetowe
 

Czym jest dataLayer?

 
dataLayer to globalny obiekt, który jest często używany w kontekście śledzenia wydarzeń i analizy na stronach internetowych. Jest szczególnie popularny w zastosowaniach związanych z narzędziami do analityki, takimi jak Google Tag Manager (GTM) czy inne systemy śledzenia wydarzeń.
 

Przykład z dataLayer

 
Sprawdźmy taki obiekt na przykładzie znanej stronie do pytań i odpowiedzi programistycznych (i testerskich też). Wybieram tutaj konkretny (i testerski) wpis:
 
Aby dostać się do obiektu dataLayer należy otworzyć narzędzia deweloperskie (DevTools). Następnie wystarczy przejść do konsoli i po prostu wpisać nazwę obiektu dataLayer, aby otrzymać jego zawartość:
notion image
Jak widzisz jest to lista obiektów.
 
Czasem może wystąpić potrzeba przetestowania wartości właśnie z takiej listy.

Jak pobrać obiekt dataLayer w teście Playwright?

 
Przygotujmy prosty test wspomnianej strony aby pobrać i wypisać na konsolę obiekt dataLayer :
test('check dataLayer', async ({ page }) => { await page.goto( 'https://stackoverflow.com/questions/75163236/how-to-update-upgrade-playwrigh' ); const dataLayer: [object] = await page.evaluate('dataLayer'); console.log(dataLayer); });
Kluczowym tutaj kodem jest skorzystanie z page.evaluate('window.dataLayer') i pobranie dataLayer poprzez obiekt window.
 
page.evaluate działa w ten sposób, że kod JavaScript przekazany do tej metody jest wykonywany w przeglądarce, a jego wynik zostaje zwrócony do testu.
 

Jak odfiltrować obiekt dataLayer w teście Playwright?

 

Wybieramy element do wyszukania

Załóżmy, że z obiektu dataLayer chcemy pozyskać wartość z 7 elementu o kluczu event.
notion image

Kod testu

Aby dostać się do określonego elementu tego obiektu możemy zastosować taką technikę:
test('check dataLayer', async ({ page }) => { await page.goto( 'https://stackoverflow.com/questions/75163236/how-to-update-upgrade-playwrigh' ); const dataLayer: [object] = await page.evaluate('dataLayer'); console.log(dataLayer); const searchKey = 'event'; const dataFound = dataLayer.find((item) => item.hasOwnProperty(searchKey)); console.log( `${dataFound?.[searchKey] ?? 'Key ' + searchKey + ' not found in object'}` ); });
Najważniejszym kodem będzie odnalezienie obiektu, które zawiera dany klucz z użyciem konstrukcji find: searchKey = 'event';
const dataFound = dataLayer.find((item) => item.hasOwnProperty(searchKey));
W naszym przypadku searchKey (zawierający szukaną wartość event) jest unikalnym kluczem we wszystkich obiektach z listy dataLayer. Uzyskamy dzięki temu jako wynik tylko jeden obiekt.

Stosowanie hasOwnProperty

Dodatkowo stosujemy hasOwnProperty. Jest to metoda wbudowana w obiekty w języku JavaScript. Służy do sprawdzania, czy obiekt posiada konkretną właściwość o określonej nazwie.
 
Gdyby nasze narzędzia do lintowania nie pozwalały na bezpośredni użycie hasOwnProperty, możemy zastosować poniższy kod:
Object.prototype.hasOwnProperty.call(item, searchKey)
 
Taki kod jest zgodny z typowymi regułami statycznej analizy kodu (której drobiazgową konfigurację opisujemy w Programie 🔗TESTY AUTOMATYCZNE Z PLAYWRIGHT).
 

Wypisanie wartości na konsole

Na koniec wypisujemy wartość dla klucza odnalezionego obiektu (a pytajniki zabezpieczają nas przed tym, gdyby obiekt nie został znaleziony):
console.log(`${dataFound?.[searchKey] ?? 'Key ' + searchKey + ' not found in object'}` );
 

Podsumowanie

 
W zaprezentowanym przykładzie z dataLayer możesz odnaleźć wiele inspiracji do rozwoju i nauki nowych technik z pozyskiwaniem informacji ze stron internetowych😉
 
Dodatkowo zachęcam do przetestowania kodu w celu wyszukania innych obiektów z listy dataLayer czy też sprawdzenia jak zachowa się w przypadku nieodnalezienia frazy, której wyszukujemy.