Get response via copy button
(
page: AsyncPage, req_id: str, check_client_disconnected: Callable
)
| 969 | |
| 970 | |
| 971 | async def get_response_via_copy_button( |
| 972 | page: AsyncPage, req_id: str, check_client_disconnected: Callable |
| 973 | ) -> Optional[str]: |
| 974 | """Get response via copy button""" |
| 975 | logger.info(f"[{req_id}] (Helper) Attempting to get response via copy button...") |
| 976 | last_message_container = page.locator("ms-chat-turn").last |
| 977 | more_options_button = last_message_container.get_by_label("Open options") |
| 978 | copy_markdown_button = page.get_by_role("menuitem", name="Copy markdown") |
| 979 | |
| 980 | try: |
| 981 | logger.info( |
| 982 | f"[{req_id}] - Attempting to hover last message to show options..." |
| 983 | ) |
| 984 | await last_message_container.hover(timeout=CLICK_TIMEOUT_MS) |
| 985 | check_client_disconnected("Copy Response - after hover: ") |
| 986 | await asyncio.sleep(0.5) |
| 987 | check_client_disconnected("Copy Response - after hover delay: ") |
| 988 | logger.info(f"[{req_id}] - Hovered.") |
| 989 | |
| 990 | logger.info(f"[{req_id}] - Locating and clicking 'More options' button...") |
| 991 | try: |
| 992 | from playwright.async_api import expect as expect_async |
| 993 | |
| 994 | await expect_async(more_options_button).to_be_visible( |
| 995 | timeout=CLICK_TIMEOUT_MS |
| 996 | ) |
| 997 | check_client_disconnected( |
| 998 | "Copy Response - after more options button visible: " |
| 999 | ) |
| 1000 | await more_options_button.click(timeout=CLICK_TIMEOUT_MS) |
| 1001 | logger.info(f"[{req_id}] - 'More options' clicked (via get_by_label).") |
| 1002 | except (ClientDisconnectedError, asyncio.CancelledError): |
| 1003 | raise |
| 1004 | except Exception as more_opts_err: |
| 1005 | logger.error( |
| 1006 | f"[{req_id}] - 'More options' button (via get_by_label) not visible or click failed: {more_opts_err}" |
| 1007 | ) |
| 1008 | await save_error_snapshot(f"copy_response_more_options_failed_{req_id}") |
| 1009 | return None |
| 1010 | |
| 1011 | check_client_disconnected("Copy Response - after clicking more options: ") |
| 1012 | await asyncio.sleep(0.5) |
| 1013 | check_client_disconnected( |
| 1014 | "Copy Response - after delay following more options click: " |
| 1015 | ) |
| 1016 | |
| 1017 | logger.info(f"[{req_id}] - Locating and clicking 'Copy markdown' button...") |
| 1018 | copy_success = False |
| 1019 | try: |
| 1020 | await expect_async(copy_markdown_button).to_be_visible( |
| 1021 | timeout=CLICK_TIMEOUT_MS |
| 1022 | ) |
| 1023 | check_client_disconnected("Copy Response - after copy button visible: ") |
| 1024 | await copy_markdown_button.click(timeout=CLICK_TIMEOUT_MS, force=True) |
| 1025 | copy_success = True |
| 1026 | logger.info(f"[{req_id}] - 'Copy markdown' clicked (via get_by_role).") |
| 1027 | except (ClientDisconnectedError, asyncio.CancelledError): |
| 1028 | raise |