Pliki HAR - HTTP archive #
Plik JSON wykorzystuje kodowanie UTF-8. Zawiera zapytania, które przeglądarka wysyła podczas sesji. Zapisuje czas trwania żądań i odpowiedzi HTTP. Specyfikacja wersji 1.2 pochodzi z okolic 2012 roku. Link har_analyzer, na końcu wpisu, szczegółowo opisuje, jak nagrywać sesję.
Praktyczne zastosowania #
- Wykrywanie błędów
- Wykrywanie zbyt długo trwających zapytań
- Wizualizacja zapytań HTTP w przeglądarce za pomocą narzędzi deweloperskich (
F12) - Analiza przekierowań
- Podstawa pod mocki w Playwright
- Tworzenie komend curl na bazie pliku, za pomocą zewnętrznych narzędzi
Format #
Przykładowy okrojony plik. Szczegóły schematu formatu HAR znajdują się w jednym ze źródeł (har-schema).
{
"log": {
"version": "1.2",
"creator": { "name": "Chrome", "version": "120.0" },
"entries": [
{
"pageref": "page_0",
"startedDateTime": "2009-04-16T12:07:23.596Z",
"time": 50,
"request": {
"method": "GET",
"url": "http://www.example.com/path/?param=value",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [],
"queryString" : [],
"postData" : {},
"headersSize" : 150,
"bodySize" : 0
},
"response": {
"statusText": "OK",
"httpVersion": "HTTP/1.1",
"cookies": [],
"headers": [],
"content": {},
"redirectURL": "",
"headersSize" : 160,
"bodySize" : 850
},
"cache": {...},
"timings": {...},
"serverIPAddress": "10.0.0.1",
"connection": "52492"
},
...
]
}
}
Analiza pliku #
# kod niekompatybilny ze statusami http
jq '[ .log.entries[] | select(.response.status < 100) ]' example_file.har
# błędy klienta
jq '[ .log.entries[] | select(.response.status >= 400 and .response.status < 500) ]' example_file.har
# błędy serwera
jq '[ .log.entries[] | select(.response.status >= 500 and .response.status < 600) ]' example_file.har
# odpowiedź z wybranymi polami, gdzie status wynosi -1
jq '[ .log.entries[] | select(.response.status == -1) | {method: .request.method, url: .request.url, response: .response, cache: .cache, timings: .timings} ]' example_file.har
# posortowane malejąco zależnie od czasu odpowiedzi
jq '[ .log.entries[] ] | sort_by(.time) | reverse' example_file.har
# posortowane malejąco zależnie od czasu odpowiedzi odpowiedniego komponentu
jq '[ .log.entries[] ] | sort_by(.timings.dns) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.ssl) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.wait) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.connect) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.receive) | reverse' example_file.har
# wpisy dotyczące example.com
jq '.log.entries[] | select(.request.url | test("example.com"))'
# ilość wpisów
jq -r '.log.entries[] | select(.request.url | test("example.com")) | length'
# uproszczony zapis
jq -r '.log.entries[] | "- \(.request.method) \"\(.request.url)\"\n \(.response.status // "") \(.response.redirectURL // "") \(.response._error // "")"'
Inne linki #
- https://toolbox.googleapps.com/apps/har_analyzer/
- https://medium.com/@thananjayan1988/transforming-ui-testing-harnessing-har-files-in-playwright-520ae03227da
- https://playwright.dev/docs/mock
Źródła #
- https://en.wikipedia.org/wiki/HAR_%28file_format%29
- http://www.softwareishard.com/blog/har-12-spec/
- https://w3c.github.io/web-performance/specs/HAR/Overview.html
- https://dev.to/webviziodotcom/how-to-work-with-har-files-a-step-by-step-guide-with-examples-5g8e
- https://github.com/ahmadnassri/har-schema