Khi sử dụng Selenium để kiểm thử ứng dụng Web hoặc ứng dụng sử dụng Electronjs/Cef, đôi khi cần xác định xem một hành động có gây ra yêu cầu mạng hay không và các tham số của yêu cầu có chính xác không.
Để đạt được điều này, chúng ta có thể kích hoạt nhật ký hiệu năng của Chrome và sử dụng phương thức
driver.get_log("performance") để lọc các bản ghi liên quan đến mạng như sau:
Bước 1: Kích hoạt Nhật ký Hiệu năng Chrome
---------------------------------------
import json
from selenium import webdriver
capabilities = {
'browserName': 'chrome',
'version': '',
'platform': 'ANY',
'goog:loggingPrefs': {'performance': 'ALL'},
'goog:chromeOptions': {'extensions': [], 'args': ['--headless']}
}
browser = webdriver.Chrome(desired_capabilities=capabilities)
browser.get('https://httpbin.org/get')
logs = browser.get_log("performance")
for entry in logs:
log_entry = json.loads(entry["message"])["message"]
if "Network.response" in log_entry["method"] or "Network.request" in log_entry["method"] or "Network.webSocket" in log_entry["method"]:
print(log_entry)
Kết quả chạy mã trên:
{
'method': 'Network.responseReceived',
'params': {'frameId': '2445B94E9E1DB51A1B1F4F3B0A3F03F5',
'loaderId': 'D0DE1754D5C5F1E54DC3B0DB2A09ADD6',
'requestId': 'D0DE1754D5C5F1E54DC3B0DB2A09ADD6',
'response': {'connectionId': 0,
'connectionReused': False,
'encodedDataLength': -1,
'fromDiskCache': False,
'fromPrefetchCache': False,
'fromServiceWorker': False,
'headers': {'Content-Type': 'text/plain;charset=US-ASCII'},
'mimeType': 'text/plain',
'protocol': 'data',
'remoteIPAddress': '',
'remotePort': 0,
'securityState': 'secure',
'status': 200,
'statusText': 'OK',
'url': 'data:,'},
'timestamp': 57524.763168,
'type': 'Document'}}
{'method': 'Network.requestWillBeSent',
'params': {'documentURL': 'https://httpbin.org/get',
'frameId': '2445B94E9E1DB51A1B1F4F3B0A3F03F5',
'hasUserGesture': False,
'initiator': {'type': 'other'},
'loaderId': '8BB61F3D2448E8BC91A4A5AD7E690673',
'request': {'headers': {'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/91.0.4472.114 Safari/537.36'},
'initialPriority': 'VeryHigh',
'method': 'GET',
'mixedContentType': 'none',
'referrerPolicy': 'strict-origin-when-cross-origin',
'url': 'https://httpbin.org/get'},
'requestId': '8BB61F3D2448E8BC91A4A5AD7E690673',
'timestamp': 57524.961438,
'type': 'Document',
'wallTime': 1626501610.512192}}
Bước 2: Lấy thông tin Yêu cầu và Phản hồi
---------------------------------------
Do nhật ký không chứa dữ liệu từ phía máy chủ và phản hồi, chúng ta có thể sử dụng CDP Command để lấy thông tin chi tiết hơn như sau:
import json
from selenium import webdriver
capabilities = {
'browserName': 'chrome',
'version': '',
'platform': 'ANY',
'goog:loggingPrefs': {'performance': 'ALL'},
'goog:chromeOptions': {'extensions': [], 'args': ['--headless']}
}
browser = webdriver.Chrome(desired_capabilities=capabilities)
browser.get('https://httpbin.org/get')
logs = browser.get_log("performance")
for entry in logs:
log_entry = json.loads(entry["message"])["message"]
if log_entry["method"] == 'Network.responseReceived':
request_url = log_entry['params']['response']['url']
if request_url == 'data:,': # Bỏ qua trang ban đầu
continue
print('Yêu cầu:', request_url)
request_id = log_entry['params']['requestId']
try:
request_post_data = browser.execute_cdp_cmd('Network.getRequestPostData', {'requestId': request_id})
except Exception:
request_post_data = None
response_body = browser.execute_cdp_cmd('Network.getResponseBody', {'requestId': request_id})['body']
print('Phản hồi:', response_body)
Kết quả chạy mã trên:
Yêu cầu: https://httpbin.org/get
Phản hồi: {
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en-US",
"Cache-Control": "max-age=0",
"Host": "httpbin.org",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/91.0.4472.114 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-60f2dd9d-6533f9526707f25f7d6c38de"
},
"origin": "123.118.150.190",
"url": "https://httpbin.org/get"
}