|
1 | 1 | import logging |
| 2 | +import re |
2 | 3 | from typing import Literal |
3 | 4 |
|
4 | | -from selenium.common.exceptions import TimeoutException |
| 5 | +from selenium.common.exceptions import StaleElementReferenceException, TimeoutException |
5 | 6 | from selenium.webdriver import ActionChains, Firefox |
6 | 7 | from selenium.webdriver.common.by import By |
7 | 8 | from selenium.webdriver.common.keys import Keys |
@@ -245,6 +246,21 @@ def click_download_button(self) -> BasePage: |
245 | 246 | self.get_download_button().click() |
246 | 247 | return self |
247 | 248 |
|
| 249 | + @BasePage.context_chrome |
| 250 | + def set_always_open_similar_files(self) -> BasePage: |
| 251 | + """ |
| 252 | + From the downloads panel, right-click the most recent download and set 'Always Open Similar Files'. |
| 253 | + """ |
| 254 | + downloads_button = self.get_download_button() |
| 255 | + downloads_button.click() |
| 256 | + |
| 257 | + # Locate the latest downloaded file in the panel, open context menu and choose 'Always Open Similar Files' |
| 258 | + download_item = self.get_element("download-panel-item") |
| 259 | + self.context_click(download_item) |
| 260 | + self.context_menu.get_element("context-menu-always-open-similar-files").click() |
| 261 | + |
| 262 | + return self |
| 263 | + |
248 | 264 | @BasePage.context_chrome |
249 | 265 | def wait_for_download_animation_finish( |
250 | 266 | self, downloads_button: WebElement |
@@ -298,6 +314,34 @@ def wait_for_item_to_download(self, filename: str) -> BasePage: |
298 | 314 | self.driver.implicitly_wait(original_timeout) |
299 | 315 | return self |
300 | 316 |
|
| 317 | + @BasePage.context_chrome |
| 318 | + def verify_download_name(self, expected_pattern: str) -> BasePage: |
| 319 | + """ |
| 320 | + Verify download name matches expected pattern. |
| 321 | + Argument: |
| 322 | + expected_pattern: Regex pattern to match against download name |
| 323 | + """ |
| 324 | + download_name = self.get_element("download-target-element") |
| 325 | + download_value = download_name.get_attribute("value") |
| 326 | + assert re.match(expected_pattern, download_value), ( |
| 327 | + f"The download name is incorrect: {download_value}" |
| 328 | + ) |
| 329 | + return self |
| 330 | + |
| 331 | + @BasePage.context_chrome |
| 332 | + def wait_for_download_completion(self) -> BasePage: |
| 333 | + """Wait until the most recent download reaches 100% progress.""" |
| 334 | + |
| 335 | + def _download_complete(_): |
| 336 | + try: |
| 337 | + element = self.get_element("download-progress-element") |
| 338 | + return element.get_attribute("value") == "100" |
| 339 | + except StaleElementReferenceException: |
| 340 | + return False |
| 341 | + |
| 342 | + self.wait.until(_download_complete) |
| 343 | + return self |
| 344 | + |
301 | 345 | @BasePage.context_chrome |
302 | 346 | def refresh_page(self) -> BasePage: |
303 | 347 | """ |
|
0 commit comments