From 748d30e1d8cc365216a825c506bbed593303b155 Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Tue, 25 Nov 2025 12:32:43 +0530 Subject: [PATCH 1/7] DAPT-26 : add page interaction to resolve browser metric --- app/selenium_ui/conftest.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index a52243165..108337e11 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -8,6 +8,7 @@ import sys from datetime import timezone from pprint import pprint +from selenium.webdriver.common.by import By from time import sleep, time import filelock @@ -296,11 +297,15 @@ def get_requests_by_url(requests, url_path): def get_wait_browser_metrics(webdriver, expected_metrics): + body_element = webdriver.find_element(By.TAG_NAME, "body") attempts = 15 sleep_time = 0.5 data = {} for i in range(attempts): + if i > 0: + body_element.click() + print("Successfully clicked on page body") requests = get_performance_logs(webdriver) requests_bulk = get_requests_by_url(requests, 'bulk') data.update(requests_bulk) From 003bb380415fcf25a1d46bc97ce0e34b8c25796a Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Tue, 25 Nov 2025 15:52:33 +0530 Subject: [PATCH 2/7] DAPT-26 : add reusable click_page_body utility method to base_page --- app/selenium_ui/base_page.py | 8 ++++++++ app/selenium_ui/confluence/modules.py | 8 ++++++++ app/selenium_ui/conftest.py | 15 +++++---------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/selenium_ui/base_page.py b/app/selenium_ui/base_page.py index cff6e289e..0d6f0ff56 100644 --- a/app/selenium_ui/base_page.py +++ b/app/selenium_ui/base_page.py @@ -188,6 +188,14 @@ def delete_all_cookies(self): def scroll_down_till_bottom(self): self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") + def click_page_body(self): + try: + body_element = self.driver.find_element(By.TAG_NAME, "body") + body_element.click() + print("Successfully clicked on page body") + except Exception as e: + print(f"Failed to click on page body: {e}") + class AnyEc: """ Use with WebDriverWait to combine expected_conditions diff --git a/app/selenium_ui/confluence/modules.py b/app/selenium_ui/confluence/modules.py index d19524df5..535386408 100644 --- a/app/selenium_ui/confluence/modules.py +++ b/app/selenium_ui/confluence/modules.py @@ -84,6 +84,7 @@ def sub_measure(): if login_page.is_first_login(): login_page.first_user_setup() all_updates_page.wait_for_page_loaded() + all_updates_page.click_page_body() measure_dom_requests(webdriver, interaction="selenium_login:login_and_view_dashboard") if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_login']) @@ -111,6 +112,7 @@ def view_page(webdriver, datasets): def measure(): page.go_to() page.wait_for_page_loaded() + page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_view_page", description=page_description) if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_view_page']) @@ -130,6 +132,7 @@ def view_page_from_cache(webdriver, datasets): def measure(): page.go_to() page.wait_for_page_loaded() + page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_view_page_from_cache", description=page_description) if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, @@ -149,6 +152,7 @@ def view_blog(webdriver, datasets): def measure(): blog.go_to() blog.wait_for_page_loaded() + blog.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_view_blog", description=blog_description) if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_view_blog']) @@ -163,6 +167,7 @@ def view_dashboard(webdriver, datasets): def measure(): dashboard_page.go_to() dashboard_page.wait_for_page_loaded() + dashboard_page.click_page_body() measure_dom_requests(webdriver, interaction="selenium_view_dashboard") if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, @@ -182,6 +187,7 @@ def sub_measure(): nav_panel.click_create() PopupManager(webdriver).dismiss_default_popup() create_page.wait_for_create_page_open() + create_page.click_page_body() measure_dom_requests(webdriver, interaction="selenium_create_page:open_create_page_editor") if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, @@ -217,6 +223,7 @@ def measure(): def sub_measure(): edit_page.go_to() edit_page.wait_for_page_loaded() + edit_page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_edit_page_by_url:open_create_page_editor", description=page_description) if CONFLUENCE_SETTINGS.extended_metrics: @@ -253,6 +260,7 @@ def sub_measure(): PopupManager(webdriver).dismiss_default_popup() page.click_edit() edit_page.wait_for_page_loaded() + edit_page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_quick_edit_page_click:open_create_page_editor", description=page_description) if CONFLUENCE_SETTINGS.extended_metrics: diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index 108337e11..034f4edeb 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -8,7 +8,6 @@ import sys from datetime import timezone from pprint import pprint -from selenium.webdriver.common.by import By from time import sleep, time import filelock @@ -135,8 +134,8 @@ def datetime_now(prefix): def is_docker(): path = '/proc/self/cgroup' return ( - os.path.exists('/.dockerenv') or - os.path.isfile(path) and any('docker' in line for line in open(path)) + os.path.exists('/.dockerenv') or + os.path.isfile(path) and any('docker' in line for line in open(path)) ) @@ -270,9 +269,9 @@ def get_performance_logs(webdriver): for entry in logs: log = json.loads(entry["message"])["message"] if log["method"] == "Network.requestWillBeSent" or \ - log["method"] == "Network.responseReceived" or \ - log["method"] == "Network.requestServedFromCache" or \ - log["method"] == "Network.loadingFinished": + log["method"] == "Network.responseReceived" or \ + log["method"] == "Network.requestServedFromCache" or \ + log["method"] == "Network.loadingFinished": needed_logs.append(log) sorted_requests = {} @@ -297,15 +296,11 @@ def get_requests_by_url(requests, url_path): def get_wait_browser_metrics(webdriver, expected_metrics): - body_element = webdriver.find_element(By.TAG_NAME, "body") attempts = 15 sleep_time = 0.5 data = {} for i in range(attempts): - if i > 0: - body_element.click() - print("Successfully clicked on page body") requests = get_performance_logs(webdriver) requests_bulk = get_requests_by_url(requests, 'bulk') data.update(requests_bulk) From 5641e03458c978da4f44a544ef4d28fbf6af1ee1 Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Tue, 25 Nov 2025 15:58:36 +0530 Subject: [PATCH 3/7] DAPT-26 : fix formatting --- app/selenium_ui/conftest.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index 034f4edeb..a52243165 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -134,8 +134,8 @@ def datetime_now(prefix): def is_docker(): path = '/proc/self/cgroup' return ( - os.path.exists('/.dockerenv') or - os.path.isfile(path) and any('docker' in line for line in open(path)) + os.path.exists('/.dockerenv') or + os.path.isfile(path) and any('docker' in line for line in open(path)) ) @@ -269,9 +269,9 @@ def get_performance_logs(webdriver): for entry in logs: log = json.loads(entry["message"])["message"] if log["method"] == "Network.requestWillBeSent" or \ - log["method"] == "Network.responseReceived" or \ - log["method"] == "Network.requestServedFromCache" or \ - log["method"] == "Network.loadingFinished": + log["method"] == "Network.responseReceived" or \ + log["method"] == "Network.requestServedFromCache" or \ + log["method"] == "Network.loadingFinished": needed_logs.append(log) sorted_requests = {} From a09f051c0d15df3b85d6ab8f47902dc89a96ada8 Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Thu, 27 Nov 2025 18:35:18 +0530 Subject: [PATCH 4/7] DAPT-26 : ignore browser metric resolution time --- app/selenium_ui/base_page.py | 8 ---- app/selenium_ui/confluence/modules.py | 54 ++++++++++++------------ app/selenium_ui/conftest.py | 59 ++++++++++++++++++++++++++- 3 files changed, 83 insertions(+), 38 deletions(-) diff --git a/app/selenium_ui/base_page.py b/app/selenium_ui/base_page.py index 0d6f0ff56..cff6e289e 100644 --- a/app/selenium_ui/base_page.py +++ b/app/selenium_ui/base_page.py @@ -188,14 +188,6 @@ def delete_all_cookies(self): def scroll_down_till_bottom(self): self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") - def click_page_body(self): - try: - body_element = self.driver.find_element(By.TAG_NAME, "body") - body_element.click() - print("Successfully clicked on page body") - except Exception as e: - print(f"Failed to click on page body: {e}") - class AnyEc: """ Use with WebDriverWait to combine expected_conditions diff --git a/app/selenium_ui/confluence/modules.py b/app/selenium_ui/confluence/modules.py index 535386408..29f9ec283 100644 --- a/app/selenium_ui/confluence/modules.py +++ b/app/selenium_ui/confluence/modules.py @@ -1,5 +1,5 @@ import random -from selenium_ui.conftest import print_timing, measure_browser_navi_metrics, measure_dom_requests +from selenium_ui.conftest import print_timing, measure_timing, measure_browser_navi_metrics, measure_dom_requests, measure_with_browser_metrics from selenium_ui.confluence.pages.pages import Login, AllUpdates, PopupManager, Page, Dashboard, TopNavPanel, Editor, \ Logout @@ -84,7 +84,6 @@ def sub_measure(): if login_page.is_first_login(): login_page.first_user_setup() all_updates_page.wait_for_page_loaded() - all_updates_page.click_page_body() measure_dom_requests(webdriver, interaction="selenium_login:login_and_view_dashboard") if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_login']) @@ -108,16 +107,17 @@ def view_page(webdriver, datasets): datasets['current_session']['view_page_cache'] = random_page page = Page(webdriver, page_id=page_id) - @print_timing("selenium_view_page") def measure(): page.go_to() page.wait_for_page_loaded() - page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_view_page", description=page_description) - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_view_page']) - measure() + measure_with_browser_metrics( + "selenium_view_page", + webdriver, + datasets, + measure + ) def view_page_from_cache(webdriver, datasets): @@ -128,18 +128,17 @@ def view_page_from_cache(webdriver, datasets): page = Page(webdriver, page_id=page_id) - @print_timing("selenium_view_page_from_cache") def measure(): page.go_to() page.wait_for_page_loaded() - page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_view_page_from_cache", description=page_description) - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, - expected_metrics=browser_metrics['selenium_view_page_from_cache']) - - measure() + measure_with_browser_metrics( + "selenium_view_page_from_cache", + webdriver, + datasets, + measure + ) def view_blog(webdriver, datasets): random_blog = random.choice(datasets[BLOGS]) @@ -148,33 +147,33 @@ def view_blog(webdriver, datasets): blog = Page(webdriver, page_id=blog_id) datasets['current_session']['view_blog'] = random_blog - @print_timing("selenium_view_blog") def measure(): blog.go_to() blog.wait_for_page_loaded() - blog.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_view_blog", description=blog_description) - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_view_blog']) - measure() + measure_with_browser_metrics( + "selenium_view_blog", + webdriver, + datasets, + measure + ) def view_dashboard(webdriver, datasets): dashboard_page = Dashboard(webdriver) - @print_timing("selenium_view_dashboard") def measure(): dashboard_page.go_to() dashboard_page.wait_for_page_loaded() - dashboard_page.click_page_body() measure_dom_requests(webdriver, interaction="selenium_view_dashboard") - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, - expected_metrics=browser_metrics['selenium_view_dashboard']) - - measure() + measure_with_browser_metrics( + "selenium_view_dashboard", + webdriver, + datasets, + measure + ) def create_confluence_page(webdriver, datasets): nav_panel = TopNavPanel(webdriver) @@ -187,7 +186,6 @@ def sub_measure(): nav_panel.click_create() PopupManager(webdriver).dismiss_default_popup() create_page.wait_for_create_page_open() - create_page.click_page_body() measure_dom_requests(webdriver, interaction="selenium_create_page:open_create_page_editor") if CONFLUENCE_SETTINGS.extended_metrics: measure_browser_navi_metrics(webdriver, datasets, @@ -223,7 +221,6 @@ def measure(): def sub_measure(): edit_page.go_to() edit_page.wait_for_page_loaded() - edit_page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_edit_page_by_url:open_create_page_editor", description=page_description) if CONFLUENCE_SETTINGS.extended_metrics: @@ -260,7 +257,6 @@ def sub_measure(): PopupManager(webdriver).dismiss_default_popup() page.click_edit() edit_page.wait_for_page_loaded() - edit_page.click_page_body() measure_dom_requests(webdriver, interaction=f"selenium_quick_edit_page_click:open_create_page_editor", description=page_description) if CONFLUENCE_SETTINGS.extended_metrics: diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index a52243165..ea41ba3bb 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -18,6 +18,7 @@ from util.common_util import webdriver_pretty_debug from util.conf import CONFLUENCE_SETTINGS, JIRA_SETTINGS, BITBUCKET_SETTINGS, JSM_SETTINGS, BAMBOO_SETTINGS +from util.confluence.browser_metrics import browser_metrics from util.exceptions import WebDriverExceptionPostpone from util.project_paths import JIRA_DATASET_ISSUES, JIRA_DATASET_JQLS, JIRA_DATASET_KANBAN_BOARDS, \ JIRA_DATASET_PROJECTS, JIRA_DATASET_SCRUM_BOARDS, JIRA_DATASET_USERS, JIRA_DATASET_CUSTOM_ISSUES, BITBUCKET_USERS, \ @@ -139,6 +140,46 @@ def is_docker(): ) +def measure_timing(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + start = time() + func(*args, **kwargs) + end = time() + return end - start + return wrapper + + +def measure_with_browser_metrics(interaction_name, webdriver, datasets, measure_func): + """ + Helper function that combines measure_timing + ready_for_user_timing. + """ + # Step 1: Measure core operations + @measure_timing + def measure1(): + measure_func() + + timing = measure1() + + # Step 2: Measure browser metrics AFTER core operations (not included in core timing) + ready_for_user_timing = None + if CONFLUENCE_SETTINGS.extended_metrics: + ready_for_user_timing = measure_browser_navi_metrics( + webdriver, datasets, expected_metrics=browser_metrics[interaction_name] + ) + + # Step 3: Calculate combined timing + if ready_for_user_timing is not None: + timing = timing + (int(ready_for_user_timing) / 1000) + + # Step 4: Record combined timing using print_timing with explicit_timing + @print_timing(interaction_name, explicit_timing=timing) + def record_result(): + pass + + record_result() + + def print_timing(interaction=None, explicit_timing=None): assert interaction is not None, "Interaction name is not passed to print_timing decorator" @@ -295,11 +336,22 @@ def get_requests_by_url(requests, url_path): return filtered_requests +def click_page_body(webdriver): + try: + body_element = webdriver.find_element("tag name", "body") + body_element.click() + print("Successfully clicked on page body") + except Exception as e: + print(f"Failed to click on page body: {e}") + + def get_wait_browser_metrics(webdriver, expected_metrics): attempts = 15 sleep_time = 0.5 data = {} + click_page_body(webdriver) #this resolves browser metric + for i in range(attempts): requests = get_performance_logs(webdriver) requests_bulk = get_requests_by_url(requests, 'bulk') @@ -398,8 +450,11 @@ def measure_browser_navi_metrics(webdriver, dataset, expected_metrics): lockfile = f'{selenium_results_file}.lock' error_msg = 'Success' success = True + ready_for_user_timing = None + if not metrics: - return + return ready_for_user_timing + with filelock.SoftFileLock(lockfile): with open(selenium_results_file, "a+") as jtl_file: for metric in metrics: @@ -411,6 +466,8 @@ def measure_browser_navi_metrics(webdriver, dataset, expected_metrics): f"{timestamp},{ready_for_user_timing},{interaction},,{error_msg},,{success},0,0,0,0,{node_ip},0\n") print( f"{timestamp},{ready_for_user_timing},{interaction},{error_msg},{success},{node_ip}") + + return ready_for_user_timing @pytest.fixture(scope="module") From c9faf83b16ad6829e3db8b16f810d413543ad917 Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Thu, 27 Nov 2025 21:28:26 +0530 Subject: [PATCH 5/7] DAPT-26 : convert explicit timing to integer --- app/selenium_ui/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index ea41ba3bb..56d3d1348 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -224,7 +224,7 @@ def wrapper(*args, **kwargs): timestamp = round(time() * 1000) if explicit_timing: jtl_file.write( - f"{timestamp},{explicit_timing*1000},{interaction},,{error_msg}," + f"{timestamp},{str(int(explicit_timing * 1000))},{interaction},,{error_msg}," f",{success},0,0,0,0,,0\n") else: jtl_file.write( From d85d9d18e372a1188baab21b0dc9197b43ca4500 Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Fri, 28 Nov 2025 13:33:27 +0530 Subject: [PATCH 6/7] DAPT-26 : include logic to measure post browser metric execution --- app/selenium_ui/confluence/modules.py | 163 ++++++++++++-------------- app/selenium_ui/conftest.py | 17 ++- 2 files changed, 91 insertions(+), 89 deletions(-) diff --git a/app/selenium_ui/confluence/modules.py b/app/selenium_ui/confluence/modules.py index 29f9ec283..6c2003860 100644 --- a/app/selenium_ui/confluence/modules.py +++ b/app/selenium_ui/confluence/modules.py @@ -1,5 +1,5 @@ import random -from selenium_ui.conftest import print_timing, measure_timing, measure_browser_navi_metrics, measure_dom_requests, measure_with_browser_metrics +from selenium_ui.conftest import print_timing, measure_timing, measure_dom_requests, measure_with_browser_metrics from selenium_ui.confluence.pages.pages import Login, AllUpdates, PopupManager, Page, Dashboard, TopNavPanel, Editor, \ Logout @@ -57,45 +57,45 @@ def login(webdriver, datasets): login_page = Login(webdriver) webdriver.debug_info = generate_debug_session_info(webdriver, datasets) - @print_timing("selenium_login") - def measure(): - def sub_measure(): + def measure(): + login_page.go_to() + if login_page.is_logged_in(): + login_page.delete_all_cookies() login_page.go_to() - if login_page.is_logged_in(): - login_page.delete_all_cookies() - login_page.go_to() - login_page.wait_for_page_loaded() - node_id = login_page.get_node_id() - node_ip = rest_client.get_node_ip(node_id) - webdriver.node_ip = node_ip - print(f"node_id:{node_id}, node_ip: {webdriver.node_ip}") - measure_dom_requests(webdriver, interaction="selenium_login:open_login_page") - - sub_measure() + login_page.wait_for_page_loaded() + node_id = login_page.get_node_id() + node_ip = rest_client.get_node_ip(node_id) + webdriver.node_ip = node_ip + print(f"node_id:{node_id}, node_ip: {webdriver.node_ip}") + measure_dom_requests(webdriver, interaction="selenium_login:open_login_page") login_page.set_credentials(username=datasets['current_session']['username'], password=datasets['current_session']['password']) - def sub_measure(): - login_page.click_login_button() - all_updates_page = AllUpdates(webdriver) - all_updates_page.wait_for_page_loaded() - if login_page.is_first_login(): - login_page.first_user_setup() - all_updates_page.wait_for_page_loaded() - measure_dom_requests(webdriver, interaction="selenium_login:login_and_view_dashboard") - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, expected_metrics=browser_metrics['selenium_login']) + login_page.click_login_button() + all_updates_page = AllUpdates(webdriver) + all_updates_page.wait_for_page_loaded() + if login_page.is_first_login(): + login_page.first_user_setup() + all_updates_page.wait_for_page_loaded() + measure_dom_requests(webdriver, interaction="selenium_login:login_and_view_dashboard") - sub_measure() + + def post_metric_measure(): current_session_response = login_page.rest_api_get(url=f'{CONFLUENCE_SETTINGS.server_url}' f'/rest/api/user/current') if 'username' in current_session_response: actual_username = current_session_response['username'] assert actual_username == datasets['current_session']['username'] - measure() + measure_with_browser_metrics( + "selenium_login", + webdriver, + datasets, + measure, + post_metric_measure + ) PopupManager(webdriver).dismiss_default_popup() @@ -179,34 +179,33 @@ def create_confluence_page(webdriver, datasets): nav_panel = TopNavPanel(webdriver) create_page = Editor(webdriver) - @print_timing("selenium_create_page") def measure(): - def sub_measure(): - PopupManager(webdriver).dismiss_default_popup() - nav_panel.click_create() - PopupManager(webdriver).dismiss_default_popup() - create_page.wait_for_create_page_open() - measure_dom_requests(webdriver, interaction="selenium_create_page:open_create_page_editor") - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, - expected_metrics=browser_metrics['selenium_create_page']) + PopupManager(webdriver).dismiss_default_popup() + nav_panel.click_create() + PopupManager(webdriver).dismiss_default_popup() + create_page.wait_for_create_page_open() + measure_dom_requests(webdriver, interaction="selenium_create_page:open_create_page_editor") - sub_measure() + def post_metric_measure(): PopupManager(webdriver).dismiss_default_popup() create_page.write_title() create_page.write_content() - def sub_measure(): - create_page.click_submit() - page = Page(webdriver) - page.wait_for_page_loaded() - measure_dom_requests(webdriver, interaction="selenium_create_page:save_created_page") + create_page.click_submit() + page = Page(webdriver) + page.wait_for_page_loaded() + measure_dom_requests(webdriver, interaction="selenium_create_page:save_created_page") - sub_measure() - measure() + measure_with_browser_metrics( + "selenium_create_page", + webdriver, + datasets, + measure, + post_metric_measure + ) def edit_confluence_page_by_url(webdriver, datasets): @@ -216,29 +215,26 @@ def edit_confluence_page_by_url(webdriver, datasets): datasets['current_session']['edit_page'] = random_page edit_page = Editor(webdriver, page_id=page_id) - @print_timing("selenium_edit_page_by_url") def measure(): - def sub_measure(): - edit_page.go_to() - edit_page.wait_for_page_loaded() - measure_dom_requests(webdriver, interaction=f"selenium_edit_page_by_url:open_create_page_editor", - description=page_description) - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, - expected_metrics=browser_metrics['selenium_edit_page_by_url']) - - sub_measure() + edit_page.go_to() + edit_page.wait_for_page_loaded() + measure_dom_requests(webdriver, interaction=f"selenium_edit_page_by_url:open_create_page_editor", + description=page_description) + def post_metric_measure(): edit_page.write_content() - def sub_measure(): - edit_page.save_edited_page() - measure_dom_requests(webdriver, interaction=f"selenium_edit_page_by_url:save_edited_page", - description=page_description) + edit_page.save_edited_page() + measure_dom_requests(webdriver, interaction=f"selenium_edit_page_by_url:save_edited_page", + description=page_description) - sub_measure() - - measure() + measure_with_browser_metrics( + "selenium_edit_page_by_url", + webdriver, + datasets, + measure, + post_metric_measure + ) def edit_confluence_page_quick_edit(webdriver, datasets): @@ -250,32 +246,29 @@ def edit_confluence_page_quick_edit(webdriver, datasets): @print_timing("selenium_quick_edit_page_click") def measure(): - def sub_measure(): - page.go_to() - page.wait_for_resources_loaded() - page.wait_for_page_loaded() - PopupManager(webdriver).dismiss_default_popup() - page.click_edit() - edit_page.wait_for_page_loaded() - measure_dom_requests(webdriver, interaction=f"selenium_quick_edit_page_click:open_create_page_editor", - description=page_description) - if CONFLUENCE_SETTINGS.extended_metrics: - measure_browser_navi_metrics(webdriver, datasets, - expected_metrics=browser_metrics['selenium_quick_edit_page_click']) - - sub_measure() + page.go_to() + page.wait_for_resources_loaded() + page.wait_for_page_loaded() + PopupManager(webdriver).dismiss_default_popup() + page.click_edit() + edit_page.wait_for_page_loaded() + measure_dom_requests(webdriver, interaction=f"selenium_quick_edit_page_click:open_create_page_editor", + description=page_description) + def post_metric_measure(): edit_page.write_content() - def sub_measure(): - edit_page.save_edited_page() - measure_dom_requests(webdriver, interaction=f"selenium_quick_edit_page_click:save_edited_page", - description=page_description) - - sub_measure() - - measure() + edit_page.save_edited_page() + measure_dom_requests(webdriver, interaction=f"selenium_quick_edit_page_click:save_edited_page", + description=page_description) + measure_with_browser_metrics( + "selenium_quick_edit_page_click", + webdriver, + datasets, + measure, + post_metric_measure + ) def create_inline_comment(webdriver, datasets): page = random.choice(datasets[PAGES]) diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index 56d3d1348..57c63dd69 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -150,9 +150,9 @@ def wrapper(*args, **kwargs): return wrapper -def measure_with_browser_metrics(interaction_name, webdriver, datasets, measure_func): +def measure_with_browser_metrics(interaction_name, webdriver, datasets, measure_func, post_metric_measure_func=None): """ - Helper function that combines measure_timing + ready_for_user_timing. + Helper function that combines timing for measure_func + post_metric_measure_func + ready_for_user_timing. """ # Step 1: Measure core operations @measure_timing @@ -168,11 +168,20 @@ def measure1(): webdriver, datasets, expected_metrics=browser_metrics[interaction_name] ) - # Step 3: Calculate combined timing + # Step 3: Measure post_metric_measure_func (included in total timing) + if post_metric_measure_func is not None: + @measure_timing + def measure_post(): + post_metric_measure_func() + + post_timing = measure_post() + timing = timing + post_timing + + # Step 4: Calculate combined timing (core + post + ready_for_user) if ready_for_user_timing is not None: timing = timing + (int(ready_for_user_timing) / 1000) - # Step 4: Record combined timing using print_timing with explicit_timing + # Step 5: Record combined timing using print_timing with explicit_timing @print_timing(interaction_name, explicit_timing=timing) def record_result(): pass From e036667972a6f2b04e2fe27ca213f40a1f563617 Mon Sep 17 00:00:00 2001 From: Harsh Agrawal Date: Thu, 4 Dec 2025 14:11:28 +0530 Subject: [PATCH 7/7] DAPT-26 : refactor explicit_timing --- app/selenium_ui/conftest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/selenium_ui/conftest.py b/app/selenium_ui/conftest.py index 57c63dd69..4f4f12737 100644 --- a/app/selenium_ui/conftest.py +++ b/app/selenium_ui/conftest.py @@ -232,8 +232,9 @@ def wrapper(*args, **kwargs): with open(selenium_results_file, "a+") as jtl_file: timestamp = round(time() * 1000) if explicit_timing: + timing = str(int(explicit_timing * 1000)) jtl_file.write( - f"{timestamp},{str(int(explicit_timing * 1000))},{interaction},,{error_msg}," + f"{timestamp},{timing},{interaction},,{error_msg}," f",{success},0,0,0,0,,0\n") else: jtl_file.write(