Skip to content

Commit df8b8b2

Browse files
feat: add ability to get console logs (#434)
[ADDON-73881](https://splunk.atlassian.net/browse/ADDON-73881) As a smartx enjoyer, I want to get access to the browser console logs to fail my tests if there are JS errors. ## Changes - Add capability to track logs in Chrome - Add a helper to access an array of logs ## Example of usage ```python severe_console_logs = get_browser_logs(ucc_smartx_selenium_helper.browser, log_level=LogLevel.SEVERE, log_source=LogSource.CONSOLE_API) assert not severe_console_logs, f"Unexpected severe console logs found: {severe_console_logs}" ``` Currently, this feature is only supported with the Chrome browser. Analysis on adding support for other browser: https://splunk.atlassian.net/browse/ADDON-73881?focusedCommentId=15449369 --------- Co-authored-by: Darshan Varasani <dvarasani@splunk.com>
1 parent 385ca1f commit df8b8b2

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

pytest_splunk_addon_ui_smartx/base_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ def get_local_ie_opts():
151151
@staticmethod
152152
def get_local_chrome_opts(headless_run):
153153
chrome_opts = webdriver.ChromeOptions()
154+
chrome_opts.set_capability("goog:loggingPrefs", {"browser": "ALL"})
154155
chrome_opts.add_argument("--ignore-ssl-errors=yes")
155156
chrome_opts.add_argument("--ignore-certificate-errors")
156157
chrome_opts.add_argument("--disable-dev-shm-usage")

pytest_splunk_addon_ui_smartx/utils.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16+
17+
from typing import List, NamedTuple, Optional
18+
from enum import Enum, auto
19+
20+
1621
def backend_retry(retry_count):
1722
# The decorator itself
1823
def backend_retry_decorator(method):
@@ -33,3 +38,55 @@ def retry_method(*args, **kwargs):
3338
return retry_method
3439

3540
return backend_retry_decorator
41+
42+
43+
class LogLevel(Enum):
44+
INFO = auto()
45+
DEBUG = auto()
46+
WARNING = auto()
47+
SEVERE = auto()
48+
49+
50+
class LogSource(Enum):
51+
NETWORK = "network"
52+
CONSOLE_API = "console-api"
53+
RECOMMENDATION = "recommendation"
54+
SECURITY = "security"
55+
INTERVENTION = "intervention"
56+
57+
58+
class LogEntry(NamedTuple):
59+
level: LogLevel
60+
message: str
61+
source: LogSource
62+
timestamp: int
63+
64+
65+
def get_browser_logs(
66+
browser,
67+
log_level: Optional[LogLevel] = None,
68+
log_source: Optional[LogSource] = None,
69+
) -> List[LogEntry]:
70+
"""
71+
Retrieve and optionally filter browser console logs.
72+
"""
73+
if browser.name.lower() != "chrome":
74+
return []
75+
76+
logs = browser.get_log("browser")
77+
filtered_logs: List[LogEntry] = []
78+
79+
for log in logs:
80+
entry = LogEntry(
81+
level=LogLevel[log["level"]],
82+
message=log["message"],
83+
source=LogSource(log["source"]),
84+
timestamp=log["timestamp"],
85+
)
86+
87+
if (log_level is None or entry.level == log_level) and (
88+
log_source is None or entry.source == log_source
89+
):
90+
filtered_logs.append(entry)
91+
92+
return filtered_logs

tests/ui/test_splunk_ta_example_addon_logging.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import pytest
44
import random
55

6+
from pytest_splunk_addon_ui_smartx.utils import LogSource, LogLevel, get_browser_logs
7+
68
TA_NAME = "Splunk_TA_UCCExample"
79
TA_CONF = "splunk_ta_uccexample_settings"
810

@@ -31,4 +33,26 @@ def test_logging_select_random_log_level(
3133
level = random.choice(levels)
3234
logging.log_level.select(level)
3335
logging.save()
36+
3437
self.assert_util(logging.log_level.get_value().lower(), level.lower())
38+
39+
info_console_logs = get_browser_logs(
40+
ucc_smartx_selenium_helper.browser,
41+
log_level=LogLevel.INFO,
42+
log_source=LogSource.CONSOLE_API,
43+
)
44+
ucc_framework_logs = [
45+
log for log in info_console_logs if "UCC Framework" in log.message
46+
]
47+
assert (
48+
len(ucc_framework_logs) > 0
49+
), "No INFO log entry containing 'UCC Framework' found"
50+
51+
severe_console_logs = get_browser_logs(
52+
ucc_smartx_selenium_helper.browser,
53+
log_level=LogLevel.SEVERE,
54+
log_source=LogSource.CONSOLE_API,
55+
)
56+
assert (
57+
len(severe_console_logs) == 0
58+
), f"Unexpected severe console logs found: {severe_console_logs}"

0 commit comments

Comments
 (0)