Skip to content

CDP Mode - Patch 29 #3481

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions examples/cdp_mode/raw_multi_async.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Testing multiple CDP drivers using the async API
import asyncio
from concurrent.futures import ThreadPoolExecutor
from random import randint
from seleniumbase.undetected import cdp_driver


async def main(url):
driver = await cdp_driver.cdp_util.start_async()
page = await driver.get(url)
await page.set_window_rect(randint(4, 600), randint(8, 410), 860, 500)
await page.sleep(0.5)
field = await page.select("input")
await field.send_keys_async("Text")
button = await page.select("button")
await button.click_async()
await page.sleep(2)


def set_up_loop(url):
loop = asyncio.new_event_loop()
loop.run_until_complete(main(url))


if __name__ == "__main__":
urls = ["https://seleniumbase.io/demo_page" for i in range(4)]
with ThreadPoolExecutor(max_workers=len(urls)) as executor:
for url in urls:
executor.submit(set_up_loop, url)
25 changes: 25 additions & 0 deletions examples/cdp_mode/raw_multi_cdp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Testing multiple CDP drivers using the sync API
import asyncio
from concurrent.futures import ThreadPoolExecutor
from random import randint
from seleniumbase.core import sb_cdp
from seleniumbase.undetected import cdp_driver


def main(url):
loop = asyncio.new_event_loop()
driver = cdp_driver.cdp_util.start_sync()
page = loop.run_until_complete(driver.get(url))
sb = sb_cdp.CDPMethods(loop, page, driver)
sb.set_window_rect(randint(4, 720), randint(8, 410), 800, 500)
sb.press_keys("input", "Text")
sb.highlight("button")
sb.click("button")
sb.sleep(2)


if __name__ == "__main__":
urls = ["https://seleniumbase.io/demo_page" for i in range(4)]
with ThreadPoolExecutor(max_workers=len(urls)) as executor:
for url in urls:
executor.submit(main, url)
2 changes: 1 addition & 1 deletion seleniumbase/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# seleniumbase package
__version__ = "4.34.7"
__version__ = "4.34.8"
9 changes: 7 additions & 2 deletions seleniumbase/core/sb_cdp.py
Original file line number Diff line number Diff line change
Expand Up @@ -877,8 +877,13 @@ def set_value(self, selector, text, timeout=None):

def evaluate(self, expression):
"""Run a JavaScript expression and return the result."""
if expression.startswith("return "):
expression = expression[len("return "):]
expression = expression.strip()
exp_list = expression.split("\n")
if exp_list and exp_list[-1].strip().startswith("return "):
expression = (
"\n".join(exp_list[0:-1]) + "\n"
+ exp_list[-1].strip()[len("return "):]
).strip()
return self.loop.run_until_complete(
self.page.evaluate(expression)
)
Expand Down
13 changes: 12 additions & 1 deletion seleniumbase/undetected/cdp_driver/cdp_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,18 @@ async def start_async(*args, **kwargs) -> Browser:


def start_sync(*args, **kwargs) -> Browser:
loop = asyncio.get_event_loop()
loop = None
if (
"loop" in kwargs
and kwargs["loop"]
and hasattr(kwargs["loop"], "create_task")
):
loop = kwargs["loop"]
else:
try:
loop = asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
headless = False
binary_location = None
if "browser_executable_path" in kwargs:
Expand Down
4 changes: 4 additions & 0 deletions seleniumbase/undetected/cdp_driver/tab.py
Original file line number Diff line number Diff line change
Expand Up @@ -896,6 +896,10 @@ async def set_window_size(self, left=0, top=0, width=1280, height=1024):
"""
return await self.set_window_state(left, top, width, height)

async def set_window_rect(self, left=0, top=0, width=1280, height=1024):
"""Same as set_window_size(). Uses a different naming convention."""
return await self.set_window_state(left, top, width, height)

async def activate(self):
"""Active this target (Eg: tab, window, page)"""
await self.send(cdp.target.activate_target(self.target.target_id))
Expand Down