Skip to content

Commit baab337

Browse files
committed
adding feature to override ignored exceptions - #69
1 parent 120409b commit baab337

2 files changed

Lines changed: 24 additions & 7 deletions

File tree

screenpy_selenium/actions/wait.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
if TYPE_CHECKING:
1717
from screenpy import Actor
18+
from selenium.types import WaitExcTypes
1819
from typing_extensions import Self
1920

2021
from ..target import Target
@@ -54,6 +55,7 @@ class Wait:
5455
args: Iterable[Any]
5556
timeout: float
5657
log_detail: str | None
58+
ignored_exceptions: WaitExcTypes | None
5759

5860
@classmethod
5961
def for_the(cls, target: Target) -> Self:
@@ -128,6 +130,11 @@ def log_message(self) -> str:
128130

129131
return self.log_detail.format(*self.args)
130132

133+
def ignoring(self, *ignored_exceptions: type[Exception]) -> Self:
134+
"""Set the expception classes to ignore."""
135+
self.ignored_exceptions = ignored_exceptions
136+
return self
137+
131138
def describe(self) -> str:
132139
"""Describe the Action in present tense."""
133140
return f"Wait {self.timeout} seconds {self.log_message}."
@@ -138,9 +145,9 @@ def perform_as(self, the_actor: Actor) -> None:
138145
browser = the_actor.ability_to(BrowseTheWeb).browser
139146

140147
try:
141-
WebDriverWait(browser, self.timeout, settings.POLLING).until(
142-
self.condition(*self.args)
143-
)
148+
WebDriverWait(
149+
browser, self.timeout, settings.POLLING, self.ignored_exceptions
150+
).until(self.condition(*self.args))
144151
except WebDriverException as e:
145152
msg = (
146153
f"Encountered an exception using {self.condition.__name__} with "
@@ -155,3 +162,4 @@ def __init__(
155162
self.timeout = seconds if seconds is not None else settings.TIMEOUT
156163
self.condition = EC.visibility_of_element_located
157164
self.log_detail = None
165+
self.ignored_exceptions = None

tests/test_actions.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
from screenpy import DeliveryError, Describable, Performable, UnableToAct, settings
1111
from screenpy.configuration import ScreenPySettings
1212
from screenpy_pyotp.abilities import AuthenticateWith2FA
13-
from selenium.common.exceptions import WebDriverException
13+
from selenium.common.exceptions import (
14+
NoSuchFrameException,
15+
StaleElementReferenceException,
16+
WebDriverException,
17+
)
1418
from selenium.webdriver.common.keys import Keys
1519
from selenium.webdriver.remote.webelement import WebElement
1620
from selenium.webdriver.support import expected_conditions as EC
@@ -1525,7 +1529,7 @@ def test_defaults(
15251529
Wait.for_the(test_target).perform_as(Tester)
15261530

15271531
mocked_webdriverwait.assert_called_once_with(
1528-
mocked_browser, settings.TIMEOUT, settings.POLLING
1532+
mocked_browser, settings.TIMEOUT, settings.POLLING, None
15291533
)
15301534
mocked_ec.visibility_of_element_located.assert_called_once_with(test_target)
15311535
mocked_webdriverwait(
@@ -1544,10 +1548,15 @@ def test_override(
15441548
mocked_browser = get_mocked_browser(Tester)
15451549
timeout = 4
15461550

1547-
Wait(timeout).seconds_for(test_target).perform_as(Tester)
1551+
Wait(timeout).seconds_for(test_target).ignoring(
1552+
StaleElementReferenceException, NoSuchFrameException
1553+
).perform_as(Tester)
15481554

15491555
mocked_webdriverwait.assert_called_once_with(
1550-
mocked_browser, timeout, settings.POLLING
1556+
mocked_browser,
1557+
timeout,
1558+
settings.POLLING,
1559+
(StaleElementReferenceException, NoSuchFrameException),
15511560
)
15521561
mocked_ec.visibility_of_element_located.assert_called_once_with(test_target)
15531562
mocked_webdriverwait(mocked_browser, timeout).until.assert_called_once_with(

0 commit comments

Comments
 (0)