Add methods and update UC Mode

This commit is contained in:
Michael Mintz 2024-03-09 18:07:23 -05:00
parent 5bd9f74990
commit dc86046193
6 changed files with 104 additions and 3 deletions

View File

@ -370,6 +370,8 @@ self.highlight_type(selector, text, by="css selector", loops=3, scroll=True, tim
# self.highlight_update_text( # self.highlight_update_text(
# selector, text, by="css selector", loops=3, scroll=True, timeout=None) # selector, text, by="css selector", loops=3, scroll=True, timeout=None)
self.highlight_if_visible(selector, by="css selector", loops=4, scroll=True)
self.highlight(selector, by="css selector", loops=4, scroll=True, timeout=None) self.highlight(selector, by="css selector", loops=4, scroll=True, timeout=None)
self.press_up_arrow(selector="html", times=1, by="css selector") self.press_up_arrow(selector="html", times=1, by="css selector")
@ -742,6 +744,7 @@ self.generate_traffic_chain(pages, loops=1)
self.get_element(selector, by="css selector", timeout=None) self.get_element(selector, by="css selector", timeout=None)
# Duplicates: # Duplicates:
# self.wait_for_selector(selector, by="css selector", timeout=None)
# self.locator(selector, by="css selector", timeout=None) # self.locator(selector, by="css selector", timeout=None)
# self.wait_for_element_present(selector, by="css selector", timeout=None) # self.wait_for_element_present(selector, by="css selector", timeout=None)
@ -957,6 +960,12 @@ driver.assert_exact_text(text, selector)
driver.wait_for_element(selector) driver.wait_for_element(selector)
driver.wait_for_element_visible(selector)
driver.wait_for_element_present(selector)
driver.wait_for_selector(selector)
driver.wait_for_text(text, selector) driver.wait_for_text(text, selector)
driver.wait_for_exact_text(text, selector) driver.wait_for_exact_text(text, selector)
@ -991,6 +1000,8 @@ driver.highlight(selector)
driver.highlight_click(selector) driver.highlight_click(selector)
driver.highlight_if_visible(selector)
driver.sleep(seconds) driver.sleep(seconds)
driver.locator(selector) driver.locator(selector)
@ -1015,6 +1026,10 @@ driver.uc_open_with_reconnect(url, reconnect_time=None)
driver.reconnect(timeout) driver.reconnect(timeout)
driver.disconnect()
driver.connect()
driver.uc_click( driver.uc_click(
selector, by="css selector", selector, by="css selector",
timeout=settings.SMALL_TIMEOUT, reconnect_time=None) timeout=settings.SMALL_TIMEOUT, reconnect_time=None)

View File

@ -169,6 +169,9 @@ def extend_driver(driver):
driver.assert_text = DM.assert_text driver.assert_text = DM.assert_text
driver.assert_exact_text = DM.assert_exact_text driver.assert_exact_text = DM.assert_exact_text
driver.wait_for_element = DM.wait_for_element driver.wait_for_element = DM.wait_for_element
driver.wait_for_element_visible = DM.wait_for_element_visible
driver.wait_for_element_present = DM.wait_for_element_present
driver.wait_for_selector = DM.wait_for_selector
driver.wait_for_text = DM.wait_for_text driver.wait_for_text = DM.wait_for_text
driver.wait_for_exact_text = DM.wait_for_exact_text driver.wait_for_exact_text = DM.wait_for_exact_text
driver.wait_for_and_accept_alert = DM.wait_for_and_accept_alert driver.wait_for_and_accept_alert = DM.wait_for_and_accept_alert
@ -186,6 +189,7 @@ def extend_driver(driver):
driver.get_user_agent = DM.get_user_agent driver.get_user_agent = DM.get_user_agent
driver.highlight = DM.highlight driver.highlight = DM.highlight
driver.highlight_click = DM.highlight_click driver.highlight_click = DM.highlight_click
driver.highlight_if_visible = DM.highlight_if_visible
driver.sleep = time.sleep driver.sleep = time.sleep
driver.get_attribute = DM.get_attribute driver.get_attribute = DM.get_attribute
driver.get_page_source = DM.get_page_source driver.get_page_source = DM.get_page_source
@ -458,27 +462,34 @@ def uc_click(
by = "css selector" by = "css selector"
except Exception: except Exception:
pass pass
element = driver.wait_for_element(selector, by=by, timeout=timeout) element = driver.wait_for_selector(selector, by=by, timeout=timeout)
if not element.tag_name == "span": # Element must be "visible"
element = driver.wait_for_element(selector, by=by, timeout=timeout)
try: try:
element.uc_click( element.uc_click(
driver, selector, by=by, reconnect_time=reconnect_time driver, selector, by=by, reconnect_time=reconnect_time
) )
except ElementClickInterceptedException: except ElementClickInterceptedException:
time.sleep(0.16)
driver.js_click(selector, by=by, timeout=timeout) driver.js_click(selector, by=by, timeout=timeout)
if not reconnect_time:
driver.reconnect(0.1)
else:
driver.reconnect(reconnect_time)
def uc_switch_to_frame(driver, frame, reconnect_time=None): def uc_switch_to_frame(driver, frame, reconnect_time=None):
from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.remote.webelement import WebElement
if isinstance(frame, WebElement): if isinstance(frame, WebElement):
if not reconnect_time: if not reconnect_time:
driver.reconnect(0.15) driver.reconnect(0.1)
else: else:
driver.reconnect(reconnect_time) driver.reconnect(reconnect_time)
driver.switch_to.frame(frame) driver.switch_to.frame(frame)
else: else:
iframe = driver.locator(frame) iframe = driver.locator(frame)
if not reconnect_time: if not reconnect_time:
driver.reconnect(0.15) driver.reconnect(0.1)
else: else:
driver.reconnect(reconnect_time) driver.reconnect(reconnect_time)
driver.switch_to.frame(iframe) driver.switch_to.frame(iframe)

View File

@ -97,6 +97,15 @@ class DriverMethods():
def wait_for_element(self, *args, **kwargs): def wait_for_element(self, *args, **kwargs):
return page_actions.wait_for_element(self.driver, *args, **kwargs) return page_actions.wait_for_element(self.driver, *args, **kwargs)
def wait_for_element_visible(self, *args, **kwargs):
return page_actions.wait_for_element(self.driver, *args, **kwargs)
def wait_for_element_present(self, *args, **kwargs):
return page_actions.wait_for_selector(self.driver, *args, **kwargs)
def wait_for_selector(self, *args, **kwargs):
return page_actions.wait_for_selector(self.driver, *args, **kwargs)
def wait_for_text(self, *args, **kwargs): def wait_for_text(self, *args, **kwargs):
return page_actions.wait_for_text(self.driver, *args, **kwargs) return page_actions.wait_for_text(self.driver, *args, **kwargs)
@ -147,6 +156,8 @@ class DriverMethods():
return js_utils.get_user_agent(self.driver, *args, **kwargs) return js_utils.get_user_agent(self.driver, *args, **kwargs)
def highlight(self, *args, **kwargs): def highlight(self, *args, **kwargs):
if "scroll" in kwargs:
kwargs.pop("scroll")
w_args = kwargs.copy() w_args = kwargs.copy()
if "loops" in w_args: if "loops" in w_args:
w_args.pop("loops") w_args.pop("loops")
@ -161,8 +172,16 @@ class DriverMethods():
self.highlight(*args, **kwargs) self.highlight(*args, **kwargs)
if "loops" in kwargs: if "loops" in kwargs:
kwargs.pop("loops") kwargs.pop("loops")
if "scroll" in kwargs:
kwargs.pop("scroll")
page_actions.click(self.driver, *args, **kwargs) page_actions.click(self.driver, *args, **kwargs)
def highlight_if_visible(
self, selector, by="css selector", loops=4, scroll=True
):
if self.is_element_visible(selector, by=by):
self.highlight(selector, by=by, loops=loops, scroll=scroll)
def switch_to_frame(self, frame): def switch_to_frame(self, frame):
if isinstance(frame, WebElement): if isinstance(frame, WebElement):
self.driver.switch_to.frame(frame) self.driver.switch_to.frame(frame)

View File

@ -5601,6 +5601,14 @@ class BaseCase(unittest.TestCase):
self.__highlight(selector, by=by, loops=loops, scroll=scroll) self.__highlight(selector, by=by, loops=loops, scroll=scroll)
self.update_text(selector, text, by=by) self.update_text(selector, text, by=by)
def highlight_if_visible(
self, selector, by="css selector", loops=4, scroll=True,
):
"""Highlights the element if the element is visible."""
self.__check_scope()
if self.is_element_visible(selector, by=by):
self.__highlight(selector, by=by, loops=loops, scroll=scroll)
def __highlight( def __highlight(
self, selector, by="css selector", loops=None, scroll=True self, selector, by="css selector", loops=None, scroll=True
): ):
@ -9089,6 +9097,11 @@ class BaseCase(unittest.TestCase):
The element does not need be visible (it may be hidden).""" The element does not need be visible (it may be hidden)."""
return self.wait_for_element_present(selector, by=by, timeout=timeout) return self.wait_for_element_present(selector, by=by, timeout=timeout)
def wait_for_selector(self, selector, by="css selector", timeout=None):
"""Same as wait_for_element_present() - returns the element.
The element does not need be visible (it may be hidden)."""
return self.wait_for_element_present(selector, by=by, timeout=timeout)
def wait_for_query_selector( def wait_for_query_selector(
self, selector, by="css selector", timeout=None self, selector, by="css selector", timeout=None
): ):

View File

@ -1752,6 +1752,27 @@ def wait_for_element(
) )
def wait_for_selector(
driver,
selector,
by="css selector",
timeout=settings.LARGE_TIMEOUT,
):
original_selector = None
if page_utils.is_valid_by(by):
original_selector = selector
elif page_utils.is_valid_by(selector):
original_selector = by
selector, by = page_utils.recalculate_selector(selector, by)
return wait_for_element_present(
driver=driver,
selector=selector,
by=by,
timeout=timeout,
original_selector=original_selector,
)
def wait_for_text( def wait_for_text(
driver, driver,
text, text,

View File

@ -442,6 +442,28 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
except Exception: except Exception:
pass pass
def disconnect(self):
"""Stops the chromedriver service that runs in the background.
To use driver methods again, you MUST call driver.connect()"""
if hasattr(self, "service"):
try:
self.service.stop()
except Exception:
pass
def connect(self):
"""Starts the chromedriver service that runs in the background
and recreates the session."""
if hasattr(self, "service"):
try:
self.service.start()
except Exception:
pass
try:
self.start_session()
except Exception:
pass
def start_session(self, capabilities=None): def start_session(self, capabilities=None):
if not capabilities: if not capabilities:
capabilities = self.options.to_capabilities() capabilities = self.options.to_capabilities()