diff --git a/examples/cdp_mode/ReadMe.md b/examples/cdp_mode/ReadMe.md index aa08a70d7fb..ff91a547414 100644 --- a/examples/cdp_mode/ReadMe.md +++ b/examples/cdp_mode/ReadMe.md @@ -419,6 +419,10 @@ sb.cdp.assert_text(text, selector="html") sb.cdp.assert_exact_text(text, selector="html") sb.cdp.assert_true() sb.cdp.assert_false() +sb.cdp.assert_equal(first, second) +sb.cdp.assert_not_equal(first, second) +sb.cdp.assert_in(first, second) +sb.cdp.assert_not_in(first, second) sb.cdp.scroll_into_view(selector) sb.cdp.scroll_to_y(y) sb.cdp.scroll_to_top() diff --git a/examples/cdp_mode/raw_fingerprint.py b/examples/cdp_mode/raw_fingerprint.py new file mode 100644 index 00000000000..575971a2ba2 --- /dev/null +++ b/examples/cdp_mode/raw_fingerprint.py @@ -0,0 +1,12 @@ +from seleniumbase import SB + +with SB(uc=True, test=True, incognito=True) as sb: + url = "https://demo.fingerprint.com/playground" + sb.activate_cdp_mode(url) + sb.sleep(1) + sb.cdp.highlight('a[href*="browser-bot-detection"]') + bot_row_selector = 'table:contains("Bot") tr:nth-of-type(3)' + print(sb.cdp.get_text(bot_row_selector)) + sb.cdp.assert_text("Bot Not detected", bot_row_selector) + sb.cdp.highlight(bot_row_selector) + sb.sleep(2) diff --git a/examples/cdp_mode/raw_handle_alerts.py b/examples/cdp_mode/raw_handle_alerts.py new file mode 100644 index 00000000000..55cd582e30c --- /dev/null +++ b/examples/cdp_mode/raw_handle_alerts.py @@ -0,0 +1,19 @@ +"""To handle alerts in CDP Mode, reconnect and use WebDriver.""" +from seleniumbase import SB + +with SB(uc=True, test=True) as sb: + url = "https://the-internet.herokuapp.com/javascript_alerts" + sb.activate_cdp_mode(url) + sb.reconnect() + sb.cdp.gui_click_element('button[onclick="jsAlert()"]') + sb.sleep(1) + sb.accept_alert() + sb.sleep(1) + sb.cdp.gui_click_element('button[onclick="jsConfirm()"]') + sb.sleep(1) + sb.dismiss_alert() + sb.sleep(1) + sb.cdp.gui_click_element('button[onclick="jsPrompt()"]') + sb.sleep(1) + sb.uc_gui_write("Here is my prompt answer\n") + sb.sleep(1) diff --git a/examples/migration/protractor/ReadMe.md b/examples/migration/protractor/ReadMe.md index 8770b155926..416f31bdfed 100644 --- a/examples/migration/protractor/ReadMe.md +++ b/examples/migration/protractor/ReadMe.md @@ -9,12 +9,12 @@ ```bash $ pytest --rs -v --guest =========================== test session starts ============================ -platform darwin -- Python 3.11.2, pytest-7.4.0, pluggy-1.2.0 -- /Users/michael/.virtualenvs/sb_venv/bin/python -metadata: {'Python': '3.11.2', 'Platform': 'macOS-13.2.1-arm64-arm-64bit', 'Packages': {'pytest': '7.4.0', 'pluggy': '1.2.0'}, 'Plugins': {'html': '2.0.1', 'rerunfailures': '12.0', 'metadata': '3.0.0', 'ordering': '0.6', 'xdist': '3.3.1', 'seleniumbase': '4.15.10'}} +platform darwin -- Python 3.11.9, pytest-8.3.3, pluggy-1.5.0 -- /Users/michael/.virtualenvs/sbase11/bin/python +metadata: {'Python': '3.11.9', 'Platform': 'macOS-13.2.1-arm64-arm-64bit', 'Packages': {'pytest': '8.3.3', 'pluggy': '1.5.0'}, 'Plugins': {'cov': '6.0.0', 'html': '2.0.1', 'metadata': '3.1.1', 'seleniumbase': '4.33.2', 'ordering': '0.6', 'rerunfailures': '15.0', 'xdist': '3.6.1'}} rootdir: /Users/michael/github/SeleniumBase/examples configfile: pytest.ini -plugins: html-2.0.1, rerunfailures-12.0, metadata-3.0.0, ordering-0.6, xdist-3.3.1, seleniumbase-4.15.10 -collected 4 items +plugins: html-2.0.1, metadata-3.1.1, seleniumbase-4.33.2, ordering-0.6, rerunfailures-15.0, xdist-3.6.1 +collected 4 items example_test.py::AngularJSHomePageTests::test_greet_user PASSED example_test.py::AngularJSHomePageTests::test_todo_list PASSED diff --git a/mkdocs.yml b/mkdocs.yml index dc02424dad9..e31c2d8d832 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -73,6 +73,7 @@ plugins: - CONTRIBUTING.md - SECURITY.md - examples/case_summary.md + - examples/migration/raw_selenium/ReadMe.md - help_docs/chinese.md - integrations/katalon/ReadMe.md - help_docs/ReadMe.md @@ -174,6 +175,7 @@ nav: - 📃 Desired Capabilities: help_docs/desired_capabilities.md - 📜 Useful grep commands: help_docs/useful_grep_commands.md - ⚙️ Downloading drivers: help_docs/webdriver_installation.md + - ✅ Selenium Migration: examples/migration/raw_selenium/ReadMe.md - ✔️ Verifying drivers: help_docs/verify_webdriver.md - Behave-BDD Integration: - 🐝 Behave-BDD ReadMe: examples/behave_bdd/ReadMe.md diff --git a/mkdocs_build/prepare.py b/mkdocs_build/prepare.py index aeafa524b01..2c796d634ba 100644 --- a/mkdocs_build/prepare.py +++ b/mkdocs_build/prepare.py @@ -76,14 +76,17 @@ def main(*args, **kwargs): scanned_dir_list = [] scanned_dir_list.append("help_docs") scanned_dir_list.append("examples") - scanned_dir_list.append("examples/behave_bdd") - scanned_dir_list.append("examples/example_logs") + scanned_dir_list.append("examples/cdp_mode") + scanned_dir_list.append("examples/master_qa") scanned_dir_list.append("examples/presenter") + scanned_dir_list.append("examples/behave_bdd") scanned_dir_list.append("examples/chart_maker") + scanned_dir_list.append("examples/example_logs") scanned_dir_list.append("examples/tour_examples") scanned_dir_list.append("examples/visual_testing") scanned_dir_list.append("integrations/google_cloud") scanned_dir_list.append("seleniumbase/console_scripts") + scanned_dir_list.append("examples/migration/raw_selenium") for scanned_dir in scanned_dir_list: for dir_ in os.listdir(ROOT_DIR / scanned_dir): files_to_process.append(os.path.join(scanned_dir, dir_)) @@ -159,6 +162,12 @@ def main(*args, **kwargs): ) if alt_link_badge in line: line = line.replace(alt_link_badge, back_to_gh) + changed = True + if "/help_docs/uc_mode/" in line and file_.count("/") >= 2: + line = line.replace( + "/help_docs/uc_mode/", "/../help_docs/uc_mode/" + ) + changed = True if "" in line: changed = True continue diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index ca10f028ed2..ed335a24092 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.33.1" +__version__ = "4.33.2" diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 2240410e938..5d32db78994 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -703,6 +703,10 @@ def uc_open_with_cdp_mode(driver, url=None): cdp.assert_exact_text = CDPM.assert_exact_text cdp.assert_true = CDPM.assert_true cdp.assert_false = CDPM.assert_false + cdp.assert_equal = CDPM.assert_equal + cdp.assert_not_equal = CDPM.assert_not_equal + cdp.assert_in = CDPM.assert_in + cdp.assert_not_in = CDPM.assert_not_in cdp.scroll_into_view = CDPM.scroll_into_view cdp.scroll_to_y = CDPM.scroll_to_y cdp.scroll_to_top = CDPM.scroll_to_top diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index 17c1683d4f7..3998c2d6dcf 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -135,23 +135,10 @@ def find_element( self.__add_light_pause() selector = self.__convert_to_css_if_xpath(selector) early_failure = False - if (":contains(" in selector): - tag_name = selector.split(":contains(")[0].split(" ")[-1] - text = selector.split(":contains(")[1].split(")")[0][1:-1] - with suppress(Exception): - self.loop.run_until_complete( - self.page.select(tag_name, timeout=timeout) - ) - self.loop.run_until_complete( - self.page.find(text, timeout=timeout) - ) - elements = [] - with suppress(Exception): - elements = self.find_elements_by_text(text, tag_name=tag_name) - if elements: - return self.__add_sync_methods(elements[0]) - else: - early_failure = True + if (":contains(") in selector: + selector, _ = page_utils.recalculate_selector( + selector, by="css selector", xp_ok=True + ) failure = False try: if early_failure: @@ -726,12 +713,16 @@ def set_value(self, selector, text, timeout=settings.SMALL_TIMEOUT): def evaluate(self, expression): """Run a JavaScript expression and return the result.""" + if expression.startswith("return "): + expression = expression[len("return "):] return self.loop.run_until_complete( self.page.evaluate(expression) ) def js_dumps(self, obj_name): """Similar to evaluate(), but for dictionary results.""" + if obj_name.startswith("return "): + obj_name = obj_name[len("return "):] return self.loop.run_until_complete( self.page.js_dumps(obj_name) ) @@ -1648,11 +1639,11 @@ def assert_text( text = text.strip() element = None try: - element = self.select(selector, timeout=timeout) + element = self.find_element(selector, timeout=timeout) except Exception: raise Exception("Element {%s} not found!" % selector) for i in range(30): - if self.is_element_visible(selector) and text in element.text_all: + if text in element.text_all: return True time.sleep(0.1) raise Exception( @@ -1683,11 +1674,27 @@ def assert_exact_text( def assert_true(self, expression): if not expression: - raise AssertionError("%s is not true") + raise AssertionError("%s is not true" % expression) def assert_false(self, expression): if expression: - raise AssertionError("%s is not false") + raise AssertionError("%s is not false" % expression) + + def assert_equal(self, first, second): + if first != second: + raise AssertionError("%s is not equal to %s" % (first, second)) + + def assert_not_equal(self, first, second): + if first == second: + raise AssertionError("%s is equal to %s" % (first, second)) + + def assert_in(self, first, second): + if first not in second: + raise AssertionError("%s is not in %s" % (first, second)) + + def assert_not_in(self, first, second): + if first in second: + raise AssertionError("%s is in %s" % (first, second)) def scroll_into_view(self, selector): self.find_element(selector).scroll_into_view() diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index a29c9d97819..0967fb8d731 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -392,7 +392,7 @@ def click( original_by = by selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - self.cdp.click(selector) + self.cdp.click(selector, timeout=timeout) return if delay and (type(delay) in [int, float]) and delay > 0: time.sleep(delay) @@ -885,7 +885,7 @@ def update_text( timeout = self.__get_new_timeout(timeout) selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - self.cdp.type(selector, text) + self.cdp.type(selector, text, timeout=timeout) return if self.__is_shadow_selector(selector): self.__shadow_type(selector, text, timeout) @@ -1112,7 +1112,7 @@ def send_keys(self, selector, text, by="css selector", timeout=None): def press_keys(self, selector, text, by="css selector", timeout=None): """Use send_keys() to press one key at a time.""" if self.__is_cdp_swap_needed(): - self.cdp.press_keys(selector, text) + self.cdp.press_keys(selector, text, timeout=timeout) return self.wait_for_ready_state_complete() element = self.wait_for_element_present( @@ -1597,7 +1597,7 @@ def click_link_text(self, link_text, timeout=None): """This method clicks link text on a page.""" self.__check_scope() if self.__is_cdp_swap_needed(): - self.cdp.find_element(link_text).click() + self.cdp.find_element(link_text, timeout=timeout).click() return self.__skip_if_esc() if not timeout: @@ -3380,6 +3380,8 @@ def open_html_file(self, html_file): def execute_script(self, script, *args, **kwargs): self.__check_scope() + if self.__is_cdp_swap_needed(): + return self.cdp.evaluate(script) self._check_browser() return self.driver.execute_script(script, *args, **kwargs) @@ -6308,7 +6310,7 @@ def js_click( If "all_matches" is False, only the first match is clicked. If "scroll" is False, won't scroll unless running in Demo Mode.""" if self.__is_cdp_swap_needed(): - self.cdp.click(selector) + self.cdp.click(selector, timeout=timeout) return self.wait_for_ready_state_complete() if not timeout or timeout is True: @@ -8245,7 +8247,7 @@ def enter_mfa_code( timeout = settings.SMALL_TIMEOUT if self.__is_cdp_swap_needed(): mfa_code = self.get_mfa_code(totp_key) - self.cdp.type(selector, mfa_code + "\n") + self.cdp.type(selector, mfa_code + "\n", timeout=timeout) return self.wait_for_element_visible(selector, by=by, timeout=timeout) if self.recorder_mode and self.__current_url_is_recordable(): @@ -9003,7 +9005,7 @@ def wait_for_element_visible( original_selector = selector selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - return self.cdp.select(selector) + return self.cdp.select(selector, timeout=timeout) if self.__is_shadow_selector(selector): return self.__get_shadow_element(selector, timeout) return page_actions.wait_for_element_visible( @@ -9026,7 +9028,7 @@ def wait_for_element_clickable( original_selector = selector selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - return self.cdp.select(selector) + return self.cdp.select(selector, timeout=timeout) elif self.__is_shadow_selector(selector): # If a shadow selector, use visible instead of clickable return self.__wait_for_shadow_element_visible(selector, timeout) @@ -9427,7 +9429,7 @@ def wait_for_element_present( original_selector = selector selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - return self.cdp.select(selector) + return self.cdp.select(selector, timeout=timeout) elif self.__is_shadow_selector(selector): return self.__wait_for_shadow_element_present(selector, timeout) return page_actions.wait_for_element_present( @@ -9449,7 +9451,7 @@ def wait_for_element(self, selector, by="css selector", timeout=None): original_selector = selector selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - return self.cdp.select(selector) + return self.cdp.select(selector, timeout=timeout) if self.recorder_mode and self.__current_url_is_recordable(): if self.get_session_storage_item("pause_recorder") == "no": if by == By.XPATH: @@ -9492,7 +9494,7 @@ def wait_for_query_selector( timeout = self.__get_new_timeout(timeout) css_selector = self.convert_to_css_selector(selector, by=by) if self.__is_cdp_swap_needed(): - return self.cdp.select(css_selector) + return self.cdp.select(css_selector, timeout=timeout) return js_utils.wait_for_css_query_selector( self.driver, css_selector, timeout ) @@ -9713,7 +9715,7 @@ def wait_for_text_visible( text = self.__get_type_checked_text(text) selector, by = self.__recalculate_selector(selector, by) if self.__is_cdp_swap_needed(): - return self.cdp.find_element(selector) + return self.cdp.find_element(selector, timeout=timeout) elif self.__is_shadow_selector(selector): return self.__wait_for_shadow_text_visible(text, selector, timeout) return page_actions.wait_for_text_visible( @@ -10093,7 +10095,7 @@ def assert_link_text(self, link_text, timeout=None): if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT: timeout = self.__get_new_timeout(timeout) if self.__is_cdp_swap_needed(): - self.cdp.find_element(link_text) + self.cdp.find_element(link_text, timeout=timeout) return self.wait_for_link_text_visible(link_text, timeout=timeout) if self.demo_mode: diff --git a/seleniumbase/fixtures/js_utils.py b/seleniumbase/fixtures/js_utils.py index 98db57bdb82..2d1801db656 100644 --- a/seleniumbase/fixtures/js_utils.py +++ b/seleniumbase/fixtures/js_utils.py @@ -14,6 +14,12 @@ from seleniumbase.fixtures import xpath_to_css +def execute_script(driver, script, *args, **kwargs): + if shared_utils.is_cdp_swap_needed(driver): + return driver.cdp.evaluate(script) + return driver.execute_script(script, *args, **kwargs) + + def wait_for_ready_state_complete(driver, timeout=settings.LARGE_TIMEOUT): """The DOM (Document Object Model) has a property called "readyState". When the value of this becomes "complete", page resources are considered @@ -31,7 +37,7 @@ def wait_for_ready_state_complete(driver, timeout=settings.LARGE_TIMEOUT): if sb_config.time_limit and not sb_config.recorder_mode: shared_utils.check_if_time_limit_exceeded() try: - ready_state = driver.execute_script("return document.readyState;") + ready_state = execute_script(driver, "return document.readyState;") except WebDriverException: # Bug fix for: [Permission denied to access property "document"] time.sleep(0.03) @@ -57,7 +63,7 @@ def wait_for_angularjs(driver, timeout=settings.LARGE_TIMEOUT, **kwargs): return with suppress(Exception): # This closes pop-up alerts - driver.execute_script("") + execute_script(driver, "") if ( (hasattr(driver, "_is_using_uc") and driver._is_using_uc) or not settings.WAIT_FOR_ANGULARJS @@ -126,7 +132,7 @@ def convert_to_css_selector(selector, by=By.CSS_SELECTOR): def is_html_inspector_activated(driver): try: - driver.execute_script("HTMLInspector;") # Fails if not defined + execute_script(driver, "HTMLInspector;") # Fails if not defined return True except Exception: return False @@ -134,7 +140,7 @@ def is_html_inspector_activated(driver): def is_jquery_activated(driver): try: - driver.execute_script("jQuery('html');") # Fails if jq is not defined + execute_script(driver, "jQuery('html');") # Fails if jq is not defined return True except Exception: return False @@ -148,7 +154,7 @@ def wait_for_jquery_active(driver, timeout=None): for x in range(timeout): # jQuery needs a small amount of time to activate. try: - driver.execute_script("jQuery('html');") + execute_script(driver, "jQuery('html');") wait_for_ready_state_complete(driver) wait_for_angularjs(driver) return @@ -188,7 +194,7 @@ def activate_jquery(driver): # This method is needed because jQuery is not always defined on web sites. with suppress(Exception): # Let's first find out if jQuery is already defined. - driver.execute_script("jQuery('html');") + execute_script(driver, "jQuery('html');") # Since that command worked, jQuery is defined. Let's return. return # jQuery is not defined. It will be loaded in the next part. @@ -197,7 +203,7 @@ def activate_jquery(driver): for x in range(36): # jQuery needs a small amount of time to activate. try: - driver.execute_script("jQuery('html');") + execute_script(driver, "jQuery('html');") return except Exception: if x == 18: @@ -243,7 +249,8 @@ def is_in_frame(driver): # Returns False if the driver was on default content. if shared_utils.is_cdp_swap_needed(driver): return False - in_basic_frame = driver.execute_script( + in_basic_frame = execute_script( + driver, """ var frame = window.frameElement; if (frame) { @@ -254,7 +261,7 @@ def is_in_frame(driver): } """ ) - location_href = driver.execute_script("""return window.location.href;""") + location_href = execute_script(driver, """return window.location.href;""") in_external_frame = False if driver.current_url != location_href: in_external_frame = True @@ -268,11 +275,11 @@ def safe_execute_script(driver, script): it's important that the jQuery library has been loaded first. This method will load jQuery if it wasn't already loaded.""" try: - driver.execute_script(script) + execute_script(driver, script) except Exception: # The likely reason this fails is because: "jQuery is not defined" activate_jquery(driver) # It's a good thing we can define it here - driver.execute_script(script) + execute_script(driver, script) def remove_extra_slashes(selector): @@ -328,7 +335,7 @@ def wait_for_css_query_selector( stop_ms = start_ms + (timeout * 1000.0) for x in range(int(timeout * 10)): try: - element = driver.execute_script(script) + element = execute_script(driver, script) if element: return element except Exception: @@ -359,7 +366,7 @@ def swap_selector_and_by_if_reversed(selector, by): def call_me_later(driver, script, ms): """Call script after ms passed.""" call = "function() {%s}" % script - driver.execute_script("window.setTimeout(%s, %s);" % (call, ms)) + execute_script(driver, "window.setTimeout(%s, %s);" % (call, ms)) def highlight(driver, selector, by="css selector", loops=4): @@ -387,7 +394,7 @@ def highlight(driver, selector, by="css selector", loops=4): def highlight_with_js(driver, selector, loops=4, o_bs=""): with suppress(Exception): # This closes any pop-up alerts - driver.execute_script("") + execute_script(driver, "") if selector == "html": selector = "body" selector_no_spaces = selector.replace(" ", "") @@ -407,7 +414,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return for n in range(loops): @@ -417,7 +424,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -427,7 +434,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -437,7 +444,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -447,7 +454,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -457,7 +464,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -467,7 +474,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -477,7 +484,7 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): o_bs, ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return @@ -485,13 +492,13 @@ def highlight_with_js(driver, selector, loops=4, o_bs=""): def highlight_element_with_js(driver, element, loops=4, o_bs=""): with suppress(Exception): # This closes any pop-up alerts - driver.execute_script("") + execute_script(driver, "") script = ( """arguments[0].style.boxShadow = '0px 0px 6px 6px rgba(128, 128, 128, 0.5)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return for n in range(loops): @@ -500,7 +507,7 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): '0px 0px 6px 6px rgba(255, 0, 0, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -509,7 +516,7 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): '0px 0px 6px 6px rgba(128, 0, 128, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -518,7 +525,7 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): '0px 0px 6px 6px rgba(0, 0, 255, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -527,7 +534,7 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): '0px 0px 6px 6px rgba(0, 255, 0, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -536,7 +543,7 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): '0px 0px 6px 6px rgba(128, 128, 0, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -545,13 +552,13 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): '0px 0px 6px 6px rgba(128, 0, 128, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) script = """arguments[0].style.boxShadow = '%s';""" % (o_bs) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return @@ -559,7 +566,7 @@ def highlight_element_with_js(driver, element, loops=4, o_bs=""): def highlight_with_jquery(driver, selector, loops=4, o_bs=""): with suppress(Exception): # This closes any pop-up alerts - driver.execute_script("") + execute_script(driver, "") if selector == "html": selector = "body" selector_no_spaces = selector.replace(" ", "") @@ -585,45 +592,45 @@ def highlight_with_jquery(driver, selector, loops=4, o_bs=""): '0px 0px 6px 6px rgba(255, 0, 0, 1)');""" % selector ) - driver.execute_script(script) + execute_script(driver, script) time.sleep(0.0181) script = ( """jQuery('%s').css('box-shadow', '0px 0px 6px 6px rgba(128, 0, 128, 1)');""" % selector ) - driver.execute_script(script) + execute_script(driver, script) time.sleep(0.0181) script = ( """jQuery('%s').css('box-shadow', '0px 0px 6px 6px rgba(0, 0, 255, 1)');""" % selector ) - driver.execute_script(script) + execute_script(driver, script) time.sleep(0.0181) script = ( """jQuery('%s').css('box-shadow', '0px 0px 6px 6px rgba(0, 255, 0, 1)');""" % selector ) - driver.execute_script(script) + execute_script(driver, script) time.sleep(0.0181) script = ( """jQuery('%s').css('box-shadow', '0px 0px 6px 6px rgba(128, 128, 0, 1)');""" % selector ) - driver.execute_script(script) + execute_script(driver, script) time.sleep(0.0181) script = ( """jQuery('%s').css('box-shadow', '0px 0px 6px 6px rgba(128, 0, 128, 1)');""" % selector ) - driver.execute_script(script) + execute_script(driver, script) time.sleep(0.0181) script = """jQuery('%s').css('box-shadow', '%s');""" % (selector, o_bs) - driver.execute_script(script) + execute_script(driver, script) def add_css_link(driver, css_link): @@ -638,7 +645,7 @@ def add_css_link(driver, css_link): } injectCSS("%s");""" css_link = escape_quotes_if_needed(css_link) - driver.execute_script(script_to_add_css % css_link) + execute_script(driver, script_to_add_css % css_link) def add_js_link(driver, js_link): @@ -654,7 +661,7 @@ def add_js_link(driver, js_link): } injectJS("%s");""" js_link = escape_quotes_if_needed(js_link) - driver.execute_script(script_to_add_js % js_link) + execute_script(driver, script_to_add_js % js_link) def add_css_style(driver, css_style): @@ -668,7 +675,7 @@ def add_css_style(driver, css_style): injectStyle("%s");""" css_style = css_style.replace("\n", "") css_style = escape_quotes_if_needed(css_style) - driver.execute_script(add_css_style_script % css_style) + execute_script(driver, add_css_style_script % css_style) def add_js_code_from_link(driver, js_link): @@ -685,7 +692,7 @@ def add_js_code_from_link(driver, js_link): ) js_code = js_code.replace("\n", " ") js_code = escape_quotes_if_needed(js_code) - driver.execute_script(add_js_code_script % js_code) + execute_script(driver, add_js_code_script % js_code) def add_js_code(driver, js_code): @@ -699,7 +706,7 @@ def add_js_code(driver, js_code): ) js_code = js_code.replace("\n", " ") js_code = escape_quotes_if_needed(js_code) - driver.execute_script(add_js_code_script % js_code) + execute_script(driver, add_js_code_script % js_code) def add_meta_tag(driver, http_equiv=None, content=None): @@ -720,12 +727,12 @@ def add_meta_tag(driver, http_equiv=None, content=None): http_equiv, content, ) - driver.execute_script(script_to_add_meta) + execute_script(driver, script_to_add_meta) def is_jquery_confirm_activated(driver): try: - driver.execute_script("jconfirm;") # Fails if jconfirm is not defined + execute_script(driver, "jconfirm;") # Fails if jconfirm is not defined return True except Exception: return False @@ -748,7 +755,7 @@ def activate_jquery_confirm(driver): add_css_link(driver, jq_confirm_css) add_js_link(driver, jq_confirm_js) try: - driver.execute_script("jconfirm;") + execute_script(driver, "jconfirm;") wait_for_ready_state_complete(driver) wait_for_angularjs(driver) return @@ -774,7 +781,7 @@ def activate_html_inspector(driver): for x in range(25): # HTML-Inspector needs a small amount of time to load & activate. try: - driver.execute_script("HTMLInspector;") + execute_script(driver, "HTMLInspector;") wait_for_ready_state_complete(driver) wait_for_angularjs(driver) return @@ -824,7 +831,8 @@ def activate_messenger(driver): for x in range(10): # Messenger needs a small amount of time to load & activate. try: - result = driver.execute_script( + result = execute_script( + driver, """ if (typeof Messenger === 'undefined') { return "U"; } """ ) if result == "U": @@ -835,7 +843,7 @@ def activate_messenger(driver): except Exception: time.sleep(0.02) try: - driver.execute_script(msg_style) + execute_script(driver, msg_style) add_js_link(driver, msgr_theme_flat_js) add_js_link(driver, msgr_theme_future_js) wait_for_ready_state_complete(driver) @@ -892,13 +900,13 @@ def set_messenger_theme( % (max_messages, messenger_location, theme) ) try: - driver.execute_script(msg_style) + execute_script(driver, msg_style) except Exception: time.sleep(0.03) activate_messenger(driver) time.sleep(0.15) with suppress(Exception): - driver.execute_script(msg_style) + execute_script(driver, msg_style) time.sleep(0.02) time.sleep(0.05) @@ -917,19 +925,19 @@ def post_message(driver, message, msg_dur=None, style="info"): % (message, style, msg_dur) ) try: - driver.execute_script(messenger_script) + execute_script(driver, messenger_script) except Exception: activate_messenger(driver) set_messenger_theme(driver) try: - driver.execute_script(messenger_script) + execute_script(driver, messenger_script) except Exception: time.sleep(0.17) activate_messenger(driver) time.sleep(0.17) set_messenger_theme(driver) time.sleep(0.27) - driver.execute_script(messenger_script) + execute_script(driver, messenger_script) def post_messenger_success_message(driver, message, msg_dur=None): @@ -959,7 +967,7 @@ def post_messenger_error_message(driver, message, msg_dur=None): def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): with suppress(Exception): # This closes any pop-up alerts - driver.execute_script("") + execute_script(driver, "") if selector == "html": selector = "body" selector_no_spaces = selector.replace(" ", "") @@ -982,7 +990,7 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -992,7 +1000,7 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1002,7 +1010,7 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1012,7 +1020,7 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1022,7 +1030,7 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1034,7 +1042,7 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): o_bs, ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return @@ -1042,13 +1050,13 @@ def highlight_with_js_2(driver, message, selector, o_bs, msg_dur): def highlight_element_with_js_2(driver, message, element, o_bs, msg_dur): with suppress(Exception): # This closes any pop-up alerts - driver.execute_script("") + execute_script(driver, "") script = ( """arguments[0].style.boxShadow = '0px 0px 6px 6px rgba(128, 128, 128, 0.5)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -1057,7 +1065,7 @@ def highlight_element_with_js_2(driver, message, element, o_bs, msg_dur): '0px 0px 6px 6px rgba(205, 30, 0, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -1066,7 +1074,7 @@ def highlight_element_with_js_2(driver, message, element, o_bs, msg_dur): '0px 0px 6px 6px rgba(128, 0, 128, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -1075,7 +1083,7 @@ def highlight_element_with_js_2(driver, message, element, o_bs, msg_dur): '0px 0px 6px 6px rgba(50, 50, 128, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -1084,7 +1092,7 @@ def highlight_element_with_js_2(driver, message, element, o_bs, msg_dur): '0px 0px 6px 6px rgba(50, 205, 50, 1)';""" ) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return time.sleep(0.0181) @@ -1093,7 +1101,7 @@ def highlight_element_with_js_2(driver, message, element, o_bs, msg_dur): post_messenger_success_message(driver, message, msg_dur) script = """arguments[0].style.boxShadow = '%s';""" % (o_bs) try: - driver.execute_script(script, element) + execute_script(driver, script, element) except Exception: return @@ -1131,7 +1139,7 @@ def highlight_with_jquery_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1141,7 +1149,7 @@ def highlight_with_jquery_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1151,7 +1159,7 @@ def highlight_with_jquery_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1161,7 +1169,7 @@ def highlight_with_jquery_2(driver, message, selector, o_bs, msg_dur): % selector ) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return time.sleep(0.0181) @@ -1172,7 +1180,7 @@ def highlight_with_jquery_2(driver, message, selector, o_bs, msg_dur): script = """jQuery('%s').css('box-shadow', '%s');""" % (selector, o_bs) try: - driver.execute_script(script) + execute_script(driver, script) except Exception: return @@ -1180,33 +1188,33 @@ def highlight_with_jquery_2(driver, message, selector, o_bs, msg_dur): def get_active_element_css(driver): from seleniumbase.js_code import active_css_js - return driver.execute_script(active_css_js.get_active_element_css) + return execute_script(driver, active_css_js.get_active_element_css) def get_locale_code(driver): script = "return navigator.language || navigator.languages[0];" - return driver.execute_script(script) + return execute_script(driver, script) def get_screen_rect(driver): - return driver.execute_script("return window.screen;") + return execute_script(driver, "return window.screen;") def get_origin(driver): - return driver.execute_script("return window.location.origin;") + return execute_script(driver, "return window.location.origin;") def get_user_agent(driver): - return driver.execute_script("return navigator.userAgent;") + return execute_script(driver, "return navigator.userAgent;") def get_cookie_string(driver): - return driver.execute_script("return document.cookie;") + return execute_script(driver, "return document.cookie;") def get_scroll_distance_to_element(driver, element): try: - scroll_position = driver.execute_script("return window.scrollY;") + scroll_position = execute_script(driver, "return window.scrollY;") element_location = None element_location = element.location["y"] element_location = element_location - constants.Scroll.Y_OFFSET @@ -1247,9 +1255,9 @@ def scroll_to_element(driver, element): # The old jQuery scroll_script required by=By.CSS_SELECTOR # scroll_script = "jQuery('%s')[0].scrollIntoView()" % selector # This other scroll_script does not centralize the element - # driver.execute_script("arguments[0].scrollIntoView();", element) + # execute_script(driver, "arguments[0].scrollIntoView();", element) try: - driver.execute_script(scroll_script) + execute_script(driver, scroll_script) return True except Exception: return False @@ -1260,7 +1268,7 @@ def slow_scroll_to_element(driver, element, *args, **kwargs): # IE breaks on slow-scrolling. Do a fast scroll instead. scroll_to_element(driver, element) return - scroll_position = driver.execute_script("return window.scrollY;") + scroll_position = execute_script(driver, "return window.scrollY;") element_location_y = None try: element_location_y = element.location["y"] @@ -1290,12 +1298,12 @@ def slow_scroll_to_element(driver, element, *args, **kwargs): time.sleep(0.011) new_position += step_value scroll_script = "window.scrollTo(0, %s);" % new_position - driver.execute_script(scroll_script) + execute_script(driver, scroll_script) time.sleep(0.01) scroll_script = "window.scrollTo(%s, %s);" % ( element_location_x_fix, element_location_y ) - driver.execute_script(scroll_script) + execute_script(driver, scroll_script) time.sleep(0.01) if distance > 430 or distance < -300: # Add small recovery time for long-distance slow-scrolling