Skip to content

Commit cfe37d0

Browse files
authored
Merge pull request #4030 from seleniumbase/cdp-mode-patch-65
CDP Mode: Patch 65
2 parents e12c71a + 85251ec commit cfe37d0

File tree

12 files changed

+95
-67
lines changed

12 files changed

+95
-67
lines changed

examples/cdp_mode/ReadMe.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ with SB(uc=True, test=True, locale="en", ad_block=True) as sb:
164164
sb.cdp.highlight_overlay("div.pokemon-ability-info")
165165
sb.sleep(2)
166166
sb.cdp.open("https://events.pokemon.com/EventLocator/")
167-
sb.sleep(3)
168-
sb.cdp.click('button span:contains("Premier Events")')
169-
sb.sleep(1)
170-
events = sb.cdp.select_all('div[class="event-info"]')
171-
print("*** Upcoming Premier Events for Pokémon: ***")
167+
sb.sleep(2)
168+
sb.cdp.click('span:contains("Championship")')
169+
sb.sleep(2)
170+
events = sb.cdp.select_all("div.event-info__title")
171+
print("*** Pokémon Championship Events: ***")
172172
for event in events:
173173
print("* " + event.text)
174174
sb.sleep(2)

examples/cdp_mode/raw_pokemon.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
sb.cdp.highlight_overlay("div.pokemon-ability-info")
3232
sb.sleep(2)
3333
sb.cdp.open("https://events.pokemon.com/EventLocator/")
34-
sb.sleep(3)
35-
sb.cdp.click('button span:contains("Premier Events")')
36-
sb.sleep(1)
37-
events = sb.cdp.select_all('div[class="event-info"]')
38-
print("*** Upcoming Premier Events for Pokémon: ***")
34+
sb.sleep(2)
35+
sb.cdp.click('span:contains("Championship")')
36+
sb.sleep(2)
37+
events = sb.cdp.select_all("div.event-info__title")
38+
print("*** Pokémon Championship Events: ***")
3939
for event in events:
4040
print("* " + event.text)
4141
sb.sleep(2)

examples/presenter/uc_presentation_4.py

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ def test_presentation_4(self):
472472
sb.sleep(0.5)
473473
sb.scroll_into_view("a#advSearch")
474474
sb.sleep(0.5)
475-
sb.cdp.mouse_click("a#advSearch")
475+
sb.cdp.click("a#advSearch")
476476
sb.sleep(1.2)
477477
sb.cdp.click('img[src*="img/pokedex/detail/025.png"]')
478478
sb.cdp.assert_text("Pikachu", 'div[class*="title"]')
@@ -484,24 +484,16 @@ def test_presentation_4(self):
484484
sb.cdp.flash("div.pokemon-ability-info")
485485
name = sb.cdp.get_text("label.styled-select")
486486
info = sb.cdp.get_text("div.version-descriptions p.active")
487-
print("\n\n*** %s: ***\n* %s" % (name, info))
487+
print("*** %s: ***\n* %s" % (name, info))
488488
sb.sleep(2)
489489
sb.cdp.highlight_overlay("div.pokemon-ability-info")
490490
sb.sleep(2)
491-
sb.cdp.click('a[href="https://www.pokemon.com/us/play-pokemon/"]')
492-
sb.sleep(0.6)
493-
sb.cdp.click('h3:contains("Find an Event")')
494-
location = "Concord, MA, USA"
495-
sb.cdp.type('input[data-testid="location-search"]', location)
496-
sb.sleep(1.5)
497-
sb.cdp.click(
498-
"div.autocomplete-dropdown-container div.suggestion-item"
499-
)
500-
sb.sleep(0.6)
501-
sb.cdp.click('img[alt="search-icon"]')
491+
sb.cdp.open("https://events.pokemon.com/EventLocator/")
492+
sb.sleep(2)
493+
sb.cdp.click('span:contains("Championship")')
502494
sb.sleep(2)
503-
events = sb.cdp.select_all('div[data-testid="event-name"]')
504-
print("\n*** Pokemon events near %s: ***" % location)
495+
events = sb.cdp.select_all("div.event-info__title")
496+
print("*** Pokémon Championship Events: ***")
505497
for event in events:
506498
print("* " + event.text)
507499
sb.sleep(2)

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pathspec==0.12.1
1414
Babel==2.17.0
1515
paginate==0.5.7
1616
mkdocs==1.6.1
17-
mkdocs-material==9.6.21
17+
mkdocs-material==9.6.22
1818
mkdocs-exclude-search==0.6.6
1919
mkdocs-simple-hooks==0.1.5
2020
mkdocs-material-extensions==1.3.1

requirements.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ pygments>=2.19.2
3434
pyreadline3>=3.5.4;platform_system=="Windows"
3535
tabcompleter>=1.4.0
3636
pdbp>=1.7.1
37-
idna==3.10
37+
idna>=3.11
3838
chardet==5.2.0
39-
charset-normalizer>=3.4.3,<4
39+
charset-normalizer>=3.4.4,<4
4040
urllib3>=1.26.20,<2;python_version<"3.10"
4141
urllib3>=1.26.20,<2.6.0;python_version>="3.10"
4242
requests==2.32.4;python_version<"3.9"
@@ -87,7 +87,8 @@ rich>=14.2.0,<15
8787
# ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
8888

8989
coverage>=7.6.1;python_version<"3.9"
90-
coverage>=7.10.7;python_version>="3.9"
90+
coverage>=7.10.7;python_version>="3.9" and python_version<"3.10"
91+
coverage>=7.11.0;python_version>="3.10"
9192
pytest-cov>=5.0.0;python_version<"3.9"
9293
pytest-cov>=7.0.0;python_version>="3.9"
9394
flake8==5.0.4;python_version<"3.9"

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.42.5"
2+
__version__ = "4.42.6"

seleniumbase/core/browser_launcher.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -985,17 +985,15 @@ def __install_pyautogui_if_missing():
985985
import pyautogui
986986
with suppress(Exception):
987987
use_pyautogui_ver = constants.PyAutoGUI.VER
988-
if pyautogui.__version__ != use_pyautogui_ver:
989-
del pyautogui
990-
shared_utils.pip_install(
991-
"pyautogui", version=use_pyautogui_ver
992-
)
988+
u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
989+
pv = shared_utils.make_version_tuple(pyautogui.__version__)
990+
if pv < u_pv:
991+
del pyautogui # To get newer ver
992+
shared_utils.pip_install("pyautogui", version="Latest")
993993
import pyautogui
994994
except Exception:
995995
print("\nPyAutoGUI required! Installing now...")
996-
shared_utils.pip_install(
997-
"pyautogui", version=constants.PyAutoGUI.VER
998-
)
996+
shared_utils.pip_install("pyautogui", version="Latest")
999997
try:
1000998
import pyautogui
1001999
except Exception:

seleniumbase/core/sb_cdp.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,12 @@ def send_keys(self, selector, text, timeout=None):
912912
element.scroll_into_view()
913913
if text.endswith("\n") or text.endswith("\r"):
914914
text = text[:-1] + "\r\n"
915+
elif (
916+
element.tag_name == "textarea"
917+
and "\n" in text
918+
and "\r" not in text
919+
):
920+
text = text.replace("\n", "\r")
915921
element.send_keys(text)
916922
self.__slow_mode_pause_if_set()
917923
self.loop.run_until_complete(self.page.sleep(0.025))
@@ -927,6 +933,12 @@ def press_keys(self, selector, text, timeout=None):
927933
if text.endswith("\n") or text.endswith("\r"):
928934
submit = True
929935
text = text[:-1]
936+
elif (
937+
element.tag_name == "textarea"
938+
and "\n" in text
939+
and "\r" not in text
940+
):
941+
text = text.replace("\n", "\r")
930942
for key in text:
931943
element.send_keys(key)
932944
time.sleep(0.044)
@@ -947,6 +959,12 @@ def type(self, selector, text, timeout=None):
947959
element.clear_input()
948960
if text.endswith("\n") or text.endswith("\r"):
949961
text = text[:-1] + "\r\n"
962+
elif (
963+
element.tag_name == "textarea"
964+
and "\n" in text
965+
and "\r" not in text
966+
):
967+
text = text.replace("\n", "\r")
950968
element.send_keys(text)
951969
self.__slow_mode_pause_if_set()
952970
self.loop.run_until_complete(self.page.sleep(0.025))
@@ -1555,17 +1573,15 @@ def __install_pyautogui_if_missing(self):
15551573
import pyautogui
15561574
with suppress(Exception):
15571575
use_pyautogui_ver = constants.PyAutoGUI.VER
1558-
if pyautogui.__version__ != use_pyautogui_ver:
1559-
del pyautogui
1560-
shared_utils.pip_install(
1561-
"pyautogui", version=use_pyautogui_ver
1562-
)
1576+
u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
1577+
pv = shared_utils.make_version_tuple(pyautogui.__version__)
1578+
if pv < u_pv:
1579+
del pyautogui # To get newer ver
1580+
shared_utils.pip_install("pyautogui", version="Latest")
15631581
import pyautogui
15641582
except Exception:
15651583
print("\nPyAutoGUI required! Installing now...")
1566-
shared_utils.pip_install(
1567-
"pyautogui", version=constants.PyAutoGUI.VER
1568-
)
1584+
shared_utils.pip_install("pyautogui", version="Latest")
15691585
try:
15701586
import pyautogui
15711587
except Exception:

seleniumbase/fixtures/base_case.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,7 @@ def __initialize_variables(self):
114114
self.driver = None
115115
self.environment = None
116116
self.env = None # Add a shortened version of self.environment
117-
self.version_list = [
118-
int(i) for i in __version__.split(".") if i.isdigit()
119-
]
117+
self.version_list = shared_utils.make_version_list(__version__)
120118
self.version_tuple = tuple(self.version_list)
121119
self.version_info = self.version_tuple
122120
self.time = time.time
@@ -14491,11 +14489,11 @@ def __activate_virtual_display(self):
1449114489
import pyautogui
1449214490
with suppress(Exception):
1449314491
use_pyautogui_ver = constants.PyAutoGUI.VER
14494-
if pyautogui.__version__ != use_pyautogui_ver:
14492+
u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
14493+
pv = shared_utils.make_version_tuple(pyautogui.__version__)
14494+
if pv < u_pv:
1449514495
del pyautogui # To get newer ver
14496-
shared_utils.pip_install(
14497-
"pyautogui", version=use_pyautogui_ver
14498-
)
14496+
shared_utils.pip_install("pyautogui", version="Latest")
1449914497
import pyautogui
1450014498
pyautogui_is_installed = True
1450114499
except Exception:
@@ -14504,9 +14502,7 @@ def __activate_virtual_display(self):
1450414502
"Installing now..."
1450514503
)
1450614504
print("\n" + message)
14507-
shared_utils.pip_install(
14508-
"pyautogui", version=constants.PyAutoGUI.VER
14509-
)
14505+
shared_utils.pip_install("pyautogui", version="Latest")
1451014506
import pyautogui
1451114507
pyautogui_is_installed = True
1451214508
if (

seleniumbase/fixtures/shared_utils.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,35 @@ def pip_install(package, version=None):
1818
pip_install_lock = fasteners.InterProcessLock(
1919
constants.PipInstall.LOCKFILE
2020
)
21+
upgrade_to_latest = False
22+
if (
23+
version
24+
and ("U" in str(version).upper() or "L" in str(version).upper())
25+
):
26+
# Upgrade to Latest when specified with "U" or "L"
27+
upgrade_to_latest = True
2128
with pip_install_lock:
2229
if not version:
2330
subprocess.check_call(
2431
[sys.executable, "-m", "pip", "install", package]
2532
)
26-
else:
33+
elif not upgrade_to_latest:
2734
package_and_version = package + "==" + str(version)
2835
subprocess.check_call(
2936
[sys.executable, "-m", "pip", "install", package_and_version]
3037
)
38+
else:
39+
subprocess.check_call(
40+
[sys.executable, "-m", "pip", "install", "-U", package]
41+
)
42+
43+
44+
def make_version_list(version_str):
45+
return [int(i) for i in version_str.split(".") if i.isdigit()]
46+
47+
48+
def make_version_tuple(version_str):
49+
return tuple(make_version_list(version_str))
3150

3251

3352
def get_mfa_code(totp_key=None):

0 commit comments

Comments
 (0)