Skip to content

Commit fba74fa

Browse files
committed
[tests] Added get_browser_errors to SeleniumTestMixin
1 parent 19d2ab8 commit fba74fa

3 files changed

Lines changed: 53 additions & 0 deletions

File tree

docs/developer/test-utilities.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,24 @@ Logs into the Django admin dashboard.
299299
- Defaults to using ``admin`` / ``password`` credentials.
300300
- Navigates to ``/admin/login/`` and fills in the login form.
301301

302+
``get_browser_logs(driver=None)``
303+
+++++++++++++++++++++++++++++++++
304+
305+
Returns all browser console logs captured for the current page.
306+
307+
This includes ``INFO``, ``WARNING`` and ``SEVERE`` entries, so tests which
308+
only need to assert the absence of JavaScript errors should prefer
309+
``get_browser_errors()``.
310+
311+
``get_browser_errors(driver=None)``
312+
+++++++++++++++++++++++++++++++++++
313+
314+
Returns relevant ``SEVERE`` browser console entries only.
315+
316+
This helper filters known Firefox internal messages emitted in headless
317+
environments, for example ``BackupService.sys.mjs``. Use this method when
318+
a test needs to assert that a page did not emit JavaScript errors.
319+
302320
``find_element(by, value, timeout=2, driver=None, wait_for='visibility')``
303321
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
304322

openwisp_utils/tests/selenium.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ class SeleniumTestMixin:
4343
retry_delay = 0
4444
retry_successes_required = 2
4545
retry_threshold = None
46+
ignored_browser_log_messages = (
47+
"BackupService.sys.mjs",
48+
"PrivateBrowsingUtils.sys.mjs",
49+
"PathUtils.join: PathUtils does not support empty paths",
50+
)
4651
_db_conn_lock = threading.RLock()
4752
_db_conn_serialized = False
4853

@@ -312,6 +317,17 @@ def get_browser_logs(self, driver=None):
312317
return list(driver._console_logs)
313318
return driver.get_log("browser")
314319

320+
def get_browser_errors(self, driver=None):
321+
return [
322+
log
323+
for log in self.get_browser_logs(driver=driver)
324+
if log.get("level") == "SEVERE"
325+
if not any(
326+
ignored_message in log.get("message", "")
327+
for ignored_message in self.ignored_browser_log_messages
328+
)
329+
]
330+
315331
def _flush_firefox_console_logs(self, driver, timeout=2):
316332
"""Wait for pending BiDi console messages to be delivered.
317333

tests/test_project/tests/test_selenium.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,25 @@ def test_get_browser_logs(self):
919919
self.get_browser_logs(), [{"level": "INFO", "message": "test"}]
920920
)
921921

922+
def test_get_browser_errors(self):
923+
self.web_driver._console_logs.extend(
924+
[
925+
{
926+
"level": "SEVERE",
927+
"message": "resource:///modules/backup/BackupService.sys.mjs",
928+
},
929+
{
930+
"level": "SEVERE",
931+
"message": "TypeError: application error",
932+
},
933+
{"level": "INFO", "message": "expected lifecycle log"},
934+
]
935+
)
936+
self.assertEqual(
937+
self.get_browser_errors(),
938+
[{"level": "SEVERE", "message": "TypeError: application error"}],
939+
)
940+
922941
def test_get_browser_logs_captures_page_load_logs(self):
923942
# Logs emitted during page load (before readyState === "complete") must
924943
# be captured too; this is what distinguishes the BiDi capture from a

0 commit comments

Comments
 (0)