diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index c25ad3450eb..2e736d98186 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.44.15" +__version__ = "4.44.16" diff --git a/seleniumbase/console_scripts/sb_mkrec.py b/seleniumbase/console_scripts/sb_mkrec.py index bc312802fbb..d7554cc976e 100644 --- a/seleniumbase/console_scripts/sb_mkrec.py +++ b/seleniumbase/console_scripts/sb_mkrec.py @@ -84,6 +84,10 @@ def main(): error_msg = None invalid_cmd = None use_edge = False + use_opera = False + use_brave = False + use_comet = False + use_atlas = False use_uc = False esc_end = False start_page = None @@ -138,6 +142,14 @@ def main(): help_me = True elif option.lower() == "--edge": use_edge = True + elif option.lower() == "--opera": + use_opera = True + elif option.lower() == "--brave": + use_brave = True + elif option.lower() == "--comet": + use_comet = True + elif option.lower() == "--atlas": + use_atlas = True elif option.lower() == "--ee": esc_end = True elif option.lower() in ("--gui", "--headed"): @@ -275,6 +287,14 @@ def main(): ) if use_edge: run_cmd += " --edge" + elif use_opera: + run_cmd += " --opera" + elif use_brave: + run_cmd += " --brave" + elif use_comet: + run_cmd += " --comet" + elif use_atlas: + run_cmd += " --atlas" if force_gui: run_cmd += " --gui" if use_uc: diff --git a/seleniumbase/console_scripts/sb_recorder.py b/seleniumbase/console_scripts/sb_recorder.py index d6a326913ab..3ec6e1d3edd 100644 --- a/seleniumbase/console_scripts/sb_recorder.py +++ b/seleniumbase/console_scripts/sb_recorder.py @@ -144,6 +144,14 @@ def do_recording(file_name, url, overwrite_enabled, use_chrome, window): ) if not use_chrome: command += " --edge" + elif "--opera" in command_args: + command += " --opera" + elif "--brave" in command_args: + command += " --brave" + elif "--comet" in command_args: + command += " --comet" + elif "--atlas" in command_args: + command += " --atlas" if ( "--uc" in command_args or "--cdp" in command_args @@ -226,10 +234,37 @@ def create_tkinter_gui(): chk = tk.Checkbutton(window, text="Overwrite existing files", variable=cbx) chk.pack() chk.select() + use_stealth = False + command_args = sys.argv[2:] + if ( + "--uc" in command_args + or "--cdp" in command_args + or "--undetected" in command_args + or "--undetectable" in command_args + ): + use_stealth = True + browser_display = "Use Chrome over Edge" + if "--opera" in command_args: + browser_display = "Use Opera over Edge" + elif "--brave" in command_args: + browser_display = "Use Brave over Edge" + elif "--comet" in command_args: + browser_display = "Use Comet over Edge" + elif "--atlas" in command_args: + browser_display = "Use Atlas over Edge" cbb = tk.IntVar() - chkb = tk.Checkbutton(window, text="Use Chrome over Edge", variable=cbb) - chkb.pack() - chkb.select() + if not use_stealth: + chkb = tk.Checkbutton(window, text=browser_display, variable=cbb) + chkb.pack() + if "--edge" not in command_args: + chkb.select() + else: + chkb = tk.Checkbutton( + window, text="Stealthy Chrome Mode", variable=cbb + ) + chkb.pack() + chkb.select() + chkb.config(state=tk.DISABLED) tk.Label(window, text="").pack() url = tk.StringVar() tk.Label(window, text="Enter the URL to start recording on:").pack() diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index dd5f33b914b..8e1a2852e54 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -5063,8 +5063,7 @@ def activate_cdp_mode(self, url=None, **kwargs): self.undetectable = True def activate_recorder(self): - """Activate Recorder Mode on the current tab/window. - For persistent Recorder Mode, use the extension instead.""" + """Activate Recorder Mode on the newest tab / window.""" from seleniumbase.js_code.recorder_js import recorder_js if not self.is_chromium(): @@ -5077,7 +5076,7 @@ def activate_recorder(self): "The %s Recorder is for Chromium only!\n" " (Supported browsers: Chrome and Edge)" % sc ) - url = self.driver.current_url + url = self.get_current_url() if url.startswith(("data:", "about:", "chrome:", "edge:")): message = ( "The URL in Recorder-Mode cannot start with: " @@ -5085,8 +5084,9 @@ def activate_recorder(self): ) print("\n" + message) return - if self.recorder_ext: + if self.recorder_ext and not self.undetectable: return # The Recorder extension is already active + self.switch_to_newest_tab() with suppress(Exception): recorder_on = self.get_session_storage_item("recorder_activated") if not recorder_on == "yes": diff --git a/seleniumbase/plugins/pytest_plugin.py b/seleniumbase/plugins/pytest_plugin.py index 6b817f161d2..e120ea951a4 100644 --- a/seleniumbase/plugins/pytest_plugin.py +++ b/seleniumbase/plugins/pytest_plugin.py @@ -1622,10 +1622,12 @@ def pytest_addoption(parser): if ( using_recorder and browser_changes == 1 - and browser_text not in ["chrome", "edge"] + and browser_text not in [ + "chrome", "edge", "opera", "brave", "comet", "atlas" + ] ): message = ( - "\n Recorder Mode ONLY supports Chrome and Edge!" + "\n Recorder Mode ONLY supports Chromium browsers!" '\n (Your browser choice was: "%s")\n' % browser_list[0] ) raise Exception(message) diff --git a/seleniumbase/undetected/cdp_driver/browser.py b/seleniumbase/undetected/cdp_driver/browser.py index a51f2216dbc..bb4d49e161f 100644 --- a/seleniumbase/undetected/cdp_driver/browser.py +++ b/seleniumbase/undetected/cdp_driver/browser.py @@ -469,13 +469,37 @@ async def get( frame_id, loader_id, *_ = await connection.send( cdp.page.navigate(url) ) - if _cdp_recorder: + major_browser_version = None + try: + major_browser_version = ( + int(self.info["Browser"].split("/")[-1].split(".")[0]) + ) + except Exception: + pass + if ( + _cdp_recorder + and ( + not hasattr(sb_config, "browser") + or ( + sb_config.browser == "chrome" + and ( + not major_browser_version + or major_browser_version >= 142 + ) + ) + ) + ): # (The code below is for the Chrome 142 extension fix) from seleniumbase.js_code.recorder_js import recorder_js recorder_code = ( """window.onload = function() { %s };""" % recorder_js ) - await connection.send(cdp.runtime.evaluate(recorder_code)) + await connection.send( + cdp.page.add_script_to_evaluate_on_new_document(recorder_code) + ) + await connection.sleep(0.25) + await self.wait(0.05) + await connection.send(cdp.runtime.evaluate(recorder_js)) # Update the frame_id on the tab connection.frame_id = frame_id connection.browser = self