@@ -117,7 +117,6 @@ def __init__(self, *args, **kwargs):
117
117
self.__device_width = None
118
118
self.__device_height = None
119
119
self.__device_pixel_ratio = None
120
- self.__driver_browser_map = {}
121
120
self.__changed_jqc_theme = False
122
121
self.__jqc_default_theme = None
123
122
self.__jqc_default_color = None
@@ -131,6 +130,7 @@ def __init__(self, *args, **kwargs):
131
130
self._html_report_extra = [] # (Used by pytest_plugin.py)
132
131
self._default_driver = None
133
132
self._drivers_list = []
133
+ self._drivers_browser_map = {}
134
134
self._chart_data = {}
135
135
self._chart_count = 0
136
136
self._chart_label = {}
@@ -1028,7 +1028,11 @@ def click_link_text(self, link_text, timeout=None):
1028
1028
self.__demo_mode_highlight_if_active(link_text, by=By.LINK_TEXT)
1029
1029
try:
1030
1030
element.click()
1031
- except (StaleElementReferenceException, ENI_Exception):
1031
+ except (
1032
+ StaleElementReferenceException,
1033
+ ENI_Exception,
1034
+ ECI_Exception,
1035
+ ):
1032
1036
self.wait_for_ready_state_complete()
1033
1037
time.sleep(0.16)
1034
1038
element = self.wait_for_link_text_visible(
@@ -1153,7 +1157,11 @@ def click_partial_link_text(self, partial_link_text, timeout=None):
1153
1157
)
1154
1158
try:
1155
1159
element.click()
1156
- except (StaleElementReferenceException, ENI_Exception):
1160
+ except (
1161
+ StaleElementReferenceException,
1162
+ ENI_Exception,
1163
+ ECI_Exception,
1164
+ ):
1157
1165
self.wait_for_ready_state_complete()
1158
1166
time.sleep(0.16)
1159
1167
element = self.wait_for_partial_link_text(
@@ -1665,7 +1673,7 @@ def click_nth_visible_element(
1665
1673
try:
1666
1674
self.__scroll_to_element(element)
1667
1675
element.click()
1668
- except (StaleElementReferenceException, ENI_Exception):
1676
+ except (StaleElementReferenceException, ENI_Exception, ECI_Exception ):
1669
1677
time.sleep(0.12)
1670
1678
self.wait_for_ready_state_complete()
1671
1679
self.wait_for_element_present(selector, by=by, timeout=timeout)
@@ -3043,7 +3051,7 @@ def get_new_driver(
3043
3051
device_pixel_ratio=d_p_r,
3044
3052
)
3045
3053
self._drivers_list.append(new_driver)
3046
- self.__driver_browser_map [new_driver] = browser_name
3054
+ self._drivers_browser_map [new_driver] = browser_name
3047
3055
if switch_to:
3048
3056
self.driver = new_driver
3049
3057
self.browser = browser_name
@@ -3124,16 +3132,16 @@ def switch_to_driver(self, driver):
3124
3132
You may need this if using self.get_new_driver() in your code."""
3125
3133
self.__check_scope()
3126
3134
self.driver = driver
3127
- if self.driver in self.__driver_browser_map :
3128
- self.browser = self.__driver_browser_map [self.driver]
3135
+ if self.driver in self._drivers_browser_map :
3136
+ self.browser = self._drivers_browser_map [self.driver]
3129
3137
self.bring_active_window_to_front()
3130
3138
3131
3139
def switch_to_default_driver(self):
3132
- """ Sets self.driver to the default/original driver. """
3140
+ """ Sets self.driver to the default/initial driver. """
3133
3141
self.__check_scope()
3134
3142
self.driver = self._default_driver
3135
- if self.driver in self.__driver_browser_map :
3136
- self.browser = self.__driver_browser_map [self.driver]
3143
+ if self.driver in self._drivers_browser_map :
3144
+ self.browser = self._drivers_browser_map [self.driver]
3137
3145
self.bring_active_window_to_front()
3138
3146
3139
3147
def save_screenshot(
@@ -9919,6 +9927,73 @@ def switch_to_alert(self, timeout=None):
9919
9927
9920
9928
############
9921
9929
9930
+ def quit_extra_driver(self, driver=None):
9931
+ """ Quits the driver only if it's not the default/initial driver.
9932
+ If a driver is given, quits that, otherwise quits the active driver.
9933
+ Raises an Exception if quitting the default/initial driver.
9934
+ Should only be called if a test has already called get_new_driver().
9935
+ Afterwards, self.driver points to the default/initial driver
9936
+ if self.driver was the one being quit.
9937
+ ----
9938
+ If a test never calls get_new_driver(), this method isn't needed.
9939
+ SeleniumBase automatically quits browsers after tests have ended.
9940
+ Even if tests do call get_new_driver(), you don't need to use this
9941
+ method unless you want to quit extra browsers before a test ends.
9942
+ ----
9943
+ Terminology and important details:
9944
+ * Active driver: The one self.driver is set to. Used within methods.
9945
+ * Default/initial driver: The one that is spun up when tests start.
9946
+ Initially, the active driver and the default driver are the same.
9947
+ The active driver can change when one of these methods is called:
9948
+ > self.get_new_driver()
9949
+ > self.switch_to_default_driver()
9950
+ > self.switch_to_driver()
9951
+ > self.quit_extra_driver()
9952
+ """
9953
+ self.__check_scope()
9954
+ if not driver:
9955
+ driver = self.driver
9956
+ if type(driver).__name__ == "NoneType":
9957
+ raise Exception("The driver to quit was a NoneType variable!")
9958
+ elif (
9959
+ not hasattr(driver, "get")
9960
+ or not hasattr(driver, "name")
9961
+ or not hasattr(driver, "quit")
9962
+ or not hasattr(driver, "capabilities")
9963
+ or not hasattr(driver, "window_handles")
9964
+ ):
9965
+ raise Exception("The driver to quit does not match a Driver!")
9966
+ elif self._reuse_session and driver == self._default_driver:
9967
+ raise Exception(
9968
+ "Cannot quit the initial driver in --reuse-session mode!\n"
9969
+ "This is done automatically after all tests have ended.\n"
9970
+ "Use this method only if get_new_driver() has been called."
9971
+ )
9972
+ elif (
9973
+ driver == self._default_driver
9974
+ or (driver in self._drivers_list and len(self._drivers_list) == 1)
9975
+ ):
9976
+ raise Exception(
9977
+ "Cannot quit the default/initial driver!\n"
9978
+ "This is done automatically at the end of each test.\n"
9979
+ "Use this method only if get_new_driver() has been called."
9980
+ )
9981
+ try:
9982
+ driver.quit()
9983
+ except AttributeError:
9984
+ pass
9985
+ except Exception:
9986
+ pass
9987
+ if driver in self._drivers_list:
9988
+ self._drivers_list.remove(driver)
9989
+ if driver in self._drivers_browser_map:
9990
+ del self._drivers_browser_map[driver]
9991
+ # If the driver to quit was the active driver, switch drivers
9992
+ if driver == self.driver:
9993
+ self.switch_to_default_driver()
9994
+
9995
+ ############
9996
+
9922
9997
def __assert_eq(self, *args, **kwargs):
9923
9998
""" Minified assert_equal() using only the list diff. """
9924
9999
minified_exception = None
@@ -11410,6 +11485,11 @@ def setUp(self, masterqa_mode=False):
11410
11485
self._default_driver = self.driver
11411
11486
if self._reuse_session:
11412
11487
sb_config.shared_driver = self.driver
11488
+ if len(self._drivers_list) == 0:
11489
+ # The user is overriding self.get_new_driver()
11490
+ # (Otherwise this code shouldn't be reachable)
11491
+ self._drivers_list.append(self.driver)
11492
+ self._drivers_browser_map[self.driver] = self.browser
11413
11493
11414
11494
if self.browser in ["firefox", "ie", "safari", "opera"]:
11415
11495
# Only Chrome and Edge browsers have the mobile emulator.
0 commit comments