SeleniumBase/seleniumbase/core/sb_driver.py

266 lines
9.5 KiB
Python

"""Add new methods to extend the driver"""
from contextlib import suppress
from selenium.webdriver.remote.webelement import WebElement
from seleniumbase.fixtures import js_utils
from seleniumbase.fixtures import page_actions
from seleniumbase.fixtures import page_utils
class DriverMethods():
def __init__(self, driver):
self.driver = driver
def find_element(self, by=None, value=None):
if not value:
value = by
by = "css selector"
elif not by:
by = "css selector"
else:
value, by = page_utils.swap_selector_and_by_if_reversed(value, by)
return self.driver.default_find_element(by=by, value=value)
def find_elements(self, by=None, value=None):
if not value:
value = by
by = "css selector"
elif not by:
by = "css selector"
else:
value, by = page_utils.swap_selector_and_by_if_reversed(value, by)
return self.driver.default_find_elements(by=by, value=value)
def locator(self, selector, by=None):
if not by:
by = "css selector"
else:
selector, by = page_utils.swap_selector_and_by_if_reversed(
selector, by
)
with suppress(Exception):
return self.driver.default_find_element(by=by, value=selector)
raise Exception('No such Element: {%s} (by="%s")!' % (selector, by))
def get_attribute(self, selector, attribute, by="css selector"):
element = self.locator(selector, by=by)
return element.get_attribute(attribute)
def get_page_source(self):
return self.driver.page_source
def get_title(self):
return self.driver.title
def open_url(self, *args, **kwargs):
page_actions.open_url(self.driver, *args, **kwargs)
def click(self, *args, **kwargs):
page_actions.click(self.driver, *args, **kwargs)
def click_link(self, *args, **kwargs):
page_actions.click_link(self.driver, *args, **kwargs)
def click_if_visible(self, *args, **kwargs):
page_actions.click_if_visible(self.driver, *args, **kwargs)
def click_active_element(self, *args, **kwargs):
page_actions.click_active_element(self.driver, *args, **kwargs)
def send_keys(self, *args, **kwargs):
page_actions.send_keys(self.driver, *args, **kwargs)
def press_keys(self, *args, **kwargs):
page_actions.press_keys(self.driver, *args, **kwargs)
def update_text(self, *args, **kwargs):
page_actions.update_text(self.driver, *args, **kwargs)
def submit(self, *args, **kwargs):
page_actions.submit(self.driver, *args, **kwargs)
def assert_element_visible(self, *args, **kwargs):
page_actions.assert_element_visible(self.driver, *args, **kwargs)
def assert_element_present(self, *args, **kwargs):
page_actions.assert_element_present(self.driver, *args, **kwargs)
def assert_element_not_visible(self, *args, **kwargs):
page_actions.assert_element_not_visible(self.driver, *args, **kwargs)
def assert_text(self, *args, **kwargs):
page_actions.assert_text(self.driver, *args, **kwargs)
def assert_exact_text(self, *args, **kwargs):
page_actions.assert_exact_text(self.driver, *args, **kwargs)
def assert_non_empty_text(self, *args, **kwargs):
return page_actions.assert_non_empty_text(
self.driver, *args, **kwargs
)
def assert_text_not_visible(self, *args, **kwargs):
return page_actions.assert_text_not_visible(
self.driver, *args, **kwargs
)
def wait_for_element(self, *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):
return page_actions.wait_for_text(self.driver, *args, **kwargs)
def wait_for_exact_text(self, *args, **kwargs):
return page_actions.wait_for_exact_text(self.driver, *args, **kwargs)
def wait_for_non_empty_text(self, *args, **kwargs):
return page_actions.wait_for_non_empty_text(
self.driver, *args, **kwargs
)
def wait_for_text_not_visible(self, *args, **kwargs):
return page_actions.wait_for_text_not_visible(
self.driver, *args, **kwargs
)
def wait_for_and_accept_alert(self, *args, **kwargs):
return page_actions.wait_for_and_accept_alert(
self.driver, *args, **kwargs
)
def wait_for_and_dismiss_alert(self, *args, **kwargs):
return page_actions.wait_for_and_dismiss_alert(
self.driver, *args, **kwargs
)
def is_element_present(self, *args, **kwargs):
return page_actions.is_element_present(self.driver, *args, **kwargs)
def is_element_visible(self, *args, **kwargs):
return page_actions.is_element_visible(self.driver, *args, **kwargs)
def is_text_visible(self, *args, **kwargs):
return page_actions.is_text_visible(self.driver, *args, **kwargs)
def is_exact_text_visible(self, *args, **kwargs):
return page_actions.is_exact_text_visible(self.driver, *args, **kwargs)
def is_attribute_present(self, *args, **kwargs):
return page_actions.has_attribute(self.driver, *args, **kwargs)
def is_non_empty_text_visible(self, *args, **kwargs):
return page_actions.is_non_empty_text_visible(
self.driver, *args, **kwargs
)
def is_online(self):
return self.driver.execute_script("return navigator.onLine;")
def js_click(self, *args, **kwargs):
return page_actions.js_click(self.driver, *args, **kwargs)
def get_text(self, *args, **kwargs):
return page_actions.get_text(self.driver, *args, **kwargs)
def get_active_element_css(self, *args, **kwargs):
return js_utils.get_active_element_css(self.driver, *args, **kwargs)
def get_locale_code(self, *args, **kwargs):
return js_utils.get_locale_code(self.driver, *args, **kwargs)
def get_origin(self, *args, **kwargs):
return js_utils.get_origin(self.driver, *args, **kwargs)
def get_user_agent(self, *args, **kwargs):
return js_utils.get_user_agent(self.driver, *args, **kwargs)
def highlight(self, *args, **kwargs):
if "scroll" in kwargs:
kwargs.pop("scroll")
w_args = kwargs.copy()
if "loops" in w_args:
w_args.pop("loops")
element = page_actions.wait_for_element(self.driver, *args, **w_args)
browser = self.driver.capabilities["browserName"].lower()
js_utils.slow_scroll_to_element(self.driver, element, browser)
if "timeout" in kwargs:
kwargs.pop("timeout")
js_utils.highlight(self.driver, *args, **kwargs)
def highlight_click(self, *args, **kwargs):
self.highlight(*args, **kwargs)
if "loops" in kwargs:
kwargs.pop("loops")
if "scroll" in kwargs:
kwargs.pop("scroll")
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_default_window(self):
self.driver.switch_to.window(self.driver.window_handles[0])
def switch_to_newest_window(self):
self.driver.switch_to.window(self.driver.window_handles[-1])
def open_new_window(self, switch_to=True):
if switch_to:
try:
self.driver.switch_to.new_window("tab")
except Exception:
self.driver.execute_script("window.open('');")
self.switch_to_newest_window()
else:
self.driver.execute_script("window.open('');")
def open_new_tab(self, switch_to=True):
self.open_new_window(switch_to=switch_to)
def switch_to_window(self, *args, **kwargs):
page_actions.switch_to_window(self.driver, *args, **kwargs)
def switch_to_tab(self, *args, **kwargs):
self.switch_to_window(*args, **kwargs)
def switch_to_frame(self, frame="iframe"):
if isinstance(frame, WebElement):
self.driver.switch_to.frame(frame)
else:
iframe = self.locator(frame)
self.driver.switch_to.frame(iframe)
def set_wire_proxy(self, string):
"""Set a proxy server for selenium-wire mode ("--wire")
Examples: (ONLY avilable if using selenium-wire mode!)
driver.set_wire_proxy("SERVER:PORT")
driver.set_wire_proxy("socks5://SERVER:PORT")
driver.set_wire_proxy("USERNAME:PASSWORD@SERVER:PORT")
"""
the_http = "http"
the_https = "https"
if string.startswith("socks4://"):
the_http = "socks4"
the_https = "socks4"
elif string.startswith("socks5://"):
the_http = "socks5"
the_https = "socks5"
string = string.split("//")[-1]
if hasattr(self.driver, "proxy"):
self.driver.proxy = {
"http": "%s://%s" % (the_http, string),
"https": "%s://%s" % (the_https, string),
"no_proxy": "localhost,127.0.0.1",
}