seleniumbase 4.42.5__py3-none-any.whl → 4.43.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of seleniumbase might be problematic. Click here for more details.
- seleniumbase/__version__.py +1 -1
- seleniumbase/console_scripts/sb_mkdir.py +2 -7
- seleniumbase/core/browser_launcher.py +6 -8
- seleniumbase/core/sb_cdp.py +40 -47
- seleniumbase/fixtures/base_case.py +9 -11
- seleniumbase/fixtures/shared_utils.py +20 -1
- seleniumbase/undetected/cdp_driver/browser.py +2 -1
- seleniumbase/undetected/cdp_driver/cdp_util.py +14 -7
- {seleniumbase-4.42.5.dist-info → seleniumbase-4.43.0.dist-info}/METADATA +18 -16
- {seleniumbase-4.42.5.dist-info → seleniumbase-4.43.0.dist-info}/RECORD +14 -14
- {seleniumbase-4.42.5.dist-info → seleniumbase-4.43.0.dist-info}/WHEEL +0 -0
- {seleniumbase-4.42.5.dist-info → seleniumbase-4.43.0.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.42.5.dist-info → seleniumbase-4.43.0.dist-info}/licenses/LICENSE +0 -0
- {seleniumbase-4.42.5.dist-info → seleniumbase-4.43.0.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.
|
|
2
|
+
__version__ = "4.43.0"
|
|
@@ -636,17 +636,12 @@ def main():
|
|
|
636
636
|
data.append("")
|
|
637
637
|
data.append("class GoogleTests(BaseCase):")
|
|
638
638
|
data.append(" def test_google_dot_com(self):")
|
|
639
|
+
data.append(" if self.headless:")
|
|
640
|
+
data.append(' self.skip("Skipping test in headless mode.")')
|
|
639
641
|
data.append(" if not self.undetectable:")
|
|
640
642
|
data.append(" self.get_new_driver(undetectable=True)")
|
|
641
643
|
data.append(' self.open("https://google.com/ncr")')
|
|
642
644
|
data.append(' self.assert_title_contains("Google")')
|
|
643
|
-
data.append(" self.sleep(0.05)")
|
|
644
|
-
data.append(" self.save_screenshot_to_logs()")
|
|
645
|
-
data.append(
|
|
646
|
-
" self.wait_for_element('iframe[role=\"presentation\"]')"
|
|
647
|
-
)
|
|
648
|
-
data.append(" self.hide_elements('iframe')")
|
|
649
|
-
data.append(" self.sleep(0.05)")
|
|
650
645
|
data.append(" self.save_screenshot_to_logs()")
|
|
651
646
|
data.append(' self.type(HomePage.search_box, "github.com")')
|
|
652
647
|
data.append(" self.assert_element(HomePage.search_button)")
|
|
@@ -985,17 +985,15 @@ def __install_pyautogui_if_missing():
|
|
|
985
985
|
import pyautogui
|
|
986
986
|
with suppress(Exception):
|
|
987
987
|
use_pyautogui_ver = constants.PyAutoGUI.VER
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
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")
|
|
993
993
|
import pyautogui
|
|
994
994
|
except Exception:
|
|
995
995
|
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")
|
|
999
997
|
try:
|
|
1000
998
|
import pyautogui
|
|
1001
999
|
except Exception:
|
seleniumbase/core/sb_cdp.py
CHANGED
|
@@ -187,46 +187,23 @@ class CDPMethods():
|
|
|
187
187
|
element with the given tag. (Eg: a, button, div, script, span)"""
|
|
188
188
|
if not timeout:
|
|
189
189
|
timeout = settings.SMALL_TIMEOUT
|
|
190
|
-
self.__add_light_pause()
|
|
191
|
-
time_now = time.time()
|
|
192
|
-
self.assert_text(text, timeout=timeout)
|
|
193
|
-
spent = int(time.time() - time_now)
|
|
194
|
-
remaining = 1 + timeout - spent
|
|
195
|
-
if tag_name:
|
|
196
|
-
self.assert_element(tag_name, timeout=remaining)
|
|
197
|
-
elements = self.loop.run_until_complete(
|
|
198
|
-
self.page.find_elements_by_text(text=text)
|
|
199
|
-
)
|
|
200
190
|
if tag_name:
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
element
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
and text.strip() in element.parent.text
|
|
218
|
-
):
|
|
219
|
-
element = self.__add_sync_methods(element.parent)
|
|
220
|
-
return self.__add_sync_methods(element)
|
|
221
|
-
elif (
|
|
222
|
-
element
|
|
223
|
-
and element.parent
|
|
224
|
-
and element.parent.parent
|
|
225
|
-
and tag_name in element.parent.parent.tag_name.lower()
|
|
226
|
-
and text.strip() in element.parent.parent.text
|
|
227
|
-
):
|
|
228
|
-
element = self.__add_sync_methods(element.parent.parent)
|
|
229
|
-
return self.__add_sync_methods(element)
|
|
191
|
+
try:
|
|
192
|
+
return self.find_element(
|
|
193
|
+
'%s:contains("%s")' % (tag_name, text), timeout=timeout
|
|
194
|
+
)
|
|
195
|
+
except Exception:
|
|
196
|
+
pass # The exception will be raised later
|
|
197
|
+
else:
|
|
198
|
+
self.__add_light_pause()
|
|
199
|
+
self.assert_text(text, timeout=timeout)
|
|
200
|
+
elements = self.loop.run_until_complete(
|
|
201
|
+
self.page.find_elements_by_text(text=text)
|
|
202
|
+
)
|
|
203
|
+
for element in elements:
|
|
204
|
+
if element:
|
|
205
|
+
element = self.__add_sync_methods(element)
|
|
206
|
+
return self.__add_sync_methods(element)
|
|
230
207
|
plural = "s"
|
|
231
208
|
if timeout == 1:
|
|
232
209
|
plural = ""
|
|
@@ -912,6 +889,12 @@ class CDPMethods():
|
|
|
912
889
|
element.scroll_into_view()
|
|
913
890
|
if text.endswith("\n") or text.endswith("\r"):
|
|
914
891
|
text = text[:-1] + "\r\n"
|
|
892
|
+
elif (
|
|
893
|
+
element.tag_name == "textarea"
|
|
894
|
+
and "\n" in text
|
|
895
|
+
and "\r" not in text
|
|
896
|
+
):
|
|
897
|
+
text = text.replace("\n", "\r")
|
|
915
898
|
element.send_keys(text)
|
|
916
899
|
self.__slow_mode_pause_if_set()
|
|
917
900
|
self.loop.run_until_complete(self.page.sleep(0.025))
|
|
@@ -927,6 +910,12 @@ class CDPMethods():
|
|
|
927
910
|
if text.endswith("\n") or text.endswith("\r"):
|
|
928
911
|
submit = True
|
|
929
912
|
text = text[:-1]
|
|
913
|
+
elif (
|
|
914
|
+
element.tag_name == "textarea"
|
|
915
|
+
and "\n" in text
|
|
916
|
+
and "\r" not in text
|
|
917
|
+
):
|
|
918
|
+
text = text.replace("\n", "\r")
|
|
930
919
|
for key in text:
|
|
931
920
|
element.send_keys(key)
|
|
932
921
|
time.sleep(0.044)
|
|
@@ -947,6 +936,12 @@ class CDPMethods():
|
|
|
947
936
|
element.clear_input()
|
|
948
937
|
if text.endswith("\n") or text.endswith("\r"):
|
|
949
938
|
text = text[:-1] + "\r\n"
|
|
939
|
+
elif (
|
|
940
|
+
element.tag_name == "textarea"
|
|
941
|
+
and "\n" in text
|
|
942
|
+
and "\r" not in text
|
|
943
|
+
):
|
|
944
|
+
text = text.replace("\n", "\r")
|
|
950
945
|
element.send_keys(text)
|
|
951
946
|
self.__slow_mode_pause_if_set()
|
|
952
947
|
self.loop.run_until_complete(self.page.sleep(0.025))
|
|
@@ -1555,17 +1550,15 @@ class CDPMethods():
|
|
|
1555
1550
|
import pyautogui
|
|
1556
1551
|
with suppress(Exception):
|
|
1557
1552
|
use_pyautogui_ver = constants.PyAutoGUI.VER
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
)
|
|
1553
|
+
u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
|
|
1554
|
+
pv = shared_utils.make_version_tuple(pyautogui.__version__)
|
|
1555
|
+
if pv < u_pv:
|
|
1556
|
+
del pyautogui # To get newer ver
|
|
1557
|
+
shared_utils.pip_install("pyautogui", version="Latest")
|
|
1563
1558
|
import pyautogui
|
|
1564
1559
|
except Exception:
|
|
1565
1560
|
print("\nPyAutoGUI required! Installing now...")
|
|
1566
|
-
shared_utils.pip_install(
|
|
1567
|
-
"pyautogui", version=constants.PyAutoGUI.VER
|
|
1568
|
-
)
|
|
1561
|
+
shared_utils.pip_install("pyautogui", version="Latest")
|
|
1569
1562
|
try:
|
|
1570
1563
|
import pyautogui
|
|
1571
1564
|
except Exception:
|
|
@@ -114,9 +114,7 @@ class BaseCase(unittest.TestCase):
|
|
|
114
114
|
self.driver = None
|
|
115
115
|
self.environment = None
|
|
116
116
|
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__)
|
|
120
118
|
self.version_tuple = tuple(self.version_list)
|
|
121
119
|
self.version_info = self.version_tuple
|
|
122
120
|
self.time = time.time
|
|
@@ -10175,7 +10173,7 @@ class BaseCase(unittest.TestCase):
|
|
|
10175
10173
|
text = self.__get_type_checked_text(text)
|
|
10176
10174
|
selector, by = self.__recalculate_selector(selector, by)
|
|
10177
10175
|
if self.__is_cdp_swap_needed():
|
|
10178
|
-
return self.cdp.
|
|
10176
|
+
return self.cdp.wait_for_text(text, selector, timeout=timeout)
|
|
10179
10177
|
elif self.__is_shadow_selector(selector):
|
|
10180
10178
|
return self.__wait_for_shadow_text_visible(text, selector, timeout)
|
|
10181
10179
|
return page_actions.wait_for_text_visible(
|
|
@@ -10532,6 +10530,8 @@ class BaseCase(unittest.TestCase):
|
|
|
10532
10530
|
timeout = settings.LARGE_TIMEOUT
|
|
10533
10531
|
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
|
|
10534
10532
|
timeout = self.__get_new_timeout(timeout)
|
|
10533
|
+
if self.__is_cdp_swap_needed():
|
|
10534
|
+
return self.cdp.find_element_by_text(text=link_text, tag_name="a")
|
|
10535
10535
|
return self.wait_for_element_visible(
|
|
10536
10536
|
link_text, by="link text", timeout=timeout
|
|
10537
10537
|
)
|
|
@@ -14491,11 +14491,11 @@ class BaseCase(unittest.TestCase):
|
|
|
14491
14491
|
import pyautogui
|
|
14492
14492
|
with suppress(Exception):
|
|
14493
14493
|
use_pyautogui_ver = constants.PyAutoGUI.VER
|
|
14494
|
-
|
|
14494
|
+
u_pv = shared_utils.make_version_tuple(use_pyautogui_ver)
|
|
14495
|
+
pv = shared_utils.make_version_tuple(pyautogui.__version__)
|
|
14496
|
+
if pv < u_pv:
|
|
14495
14497
|
del pyautogui # To get newer ver
|
|
14496
|
-
shared_utils.pip_install(
|
|
14497
|
-
"pyautogui", version=use_pyautogui_ver
|
|
14498
|
-
)
|
|
14498
|
+
shared_utils.pip_install("pyautogui", version="Latest")
|
|
14499
14499
|
import pyautogui
|
|
14500
14500
|
pyautogui_is_installed = True
|
|
14501
14501
|
except Exception:
|
|
@@ -14504,9 +14504,7 @@ class BaseCase(unittest.TestCase):
|
|
|
14504
14504
|
"Installing now..."
|
|
14505
14505
|
)
|
|
14506
14506
|
print("\n" + message)
|
|
14507
|
-
shared_utils.pip_install(
|
|
14508
|
-
"pyautogui", version=constants.PyAutoGUI.VER
|
|
14509
|
-
)
|
|
14507
|
+
shared_utils.pip_install("pyautogui", version="Latest")
|
|
14510
14508
|
import pyautogui
|
|
14511
14509
|
pyautogui_is_installed = True
|
|
14512
14510
|
if (
|
|
@@ -18,16 +18,35 @@ def pip_install(package, version=None):
|
|
|
18
18
|
pip_install_lock = fasteners.InterProcessLock(
|
|
19
19
|
constants.PipInstall.LOCKFILE
|
|
20
20
|
)
|
|
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
|
|
21
28
|
with pip_install_lock:
|
|
22
29
|
if not version:
|
|
23
30
|
subprocess.check_call(
|
|
24
31
|
[sys.executable, "-m", "pip", "install", package]
|
|
25
32
|
)
|
|
26
|
-
|
|
33
|
+
elif not upgrade_to_latest:
|
|
27
34
|
package_and_version = package + "==" + str(version)
|
|
28
35
|
subprocess.check_call(
|
|
29
36
|
[sys.executable, "-m", "pip", "install", package_and_version]
|
|
30
37
|
)
|
|
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))
|
|
31
50
|
|
|
32
51
|
|
|
33
52
|
def get_mfa_code(totp_key=None):
|
|
@@ -369,7 +369,8 @@ class Browser:
|
|
|
369
369
|
proxy_user = username_and_password.split(":")[0]
|
|
370
370
|
proxy_pass = username_and_password.split(":")[1]
|
|
371
371
|
await connection.set_auth(proxy_user, proxy_pass, self.tabs[0])
|
|
372
|
-
time.sleep(0.
|
|
372
|
+
time.sleep(0.22)
|
|
373
|
+
await connection.sleep(0.05)
|
|
373
374
|
frame_id, loader_id, *_ = await connection.send(
|
|
374
375
|
cdp.page.navigate(url)
|
|
375
376
|
)
|
|
@@ -121,22 +121,26 @@ def __activate_virtual_display_as_needed(
|
|
|
121
121
|
import pyautogui
|
|
122
122
|
with suppress(Exception):
|
|
123
123
|
use_pyautogui_ver = constants.PyAutoGUI.VER
|
|
124
|
-
|
|
124
|
+
u_pv = shared_utils.make_version_tuple(
|
|
125
|
+
use_pyautogui_ver
|
|
126
|
+
)
|
|
127
|
+
pv = shared_utils.make_version_tuple(
|
|
128
|
+
pyautogui.__version__
|
|
129
|
+
)
|
|
130
|
+
if pv < u_pv:
|
|
125
131
|
del pyautogui # To get newer ver
|
|
126
132
|
shared_utils.pip_install(
|
|
127
|
-
"pyautogui", version=
|
|
133
|
+
"pyautogui", version="Latest"
|
|
128
134
|
)
|
|
129
135
|
import pyautogui
|
|
130
136
|
pyautogui_is_installed = True
|
|
131
137
|
except Exception:
|
|
132
138
|
message = (
|
|
133
|
-
"PyAutoGUI is required for
|
|
139
|
+
"PyAutoGUI is required for CDP Mode on Linux! "
|
|
134
140
|
"Installing now..."
|
|
135
141
|
)
|
|
136
142
|
print("\n" + message)
|
|
137
|
-
shared_utils.pip_install(
|
|
138
|
-
"pyautogui", version=constants.PyAutoGUI.VER
|
|
139
|
-
)
|
|
143
|
+
shared_utils.pip_install("pyautogui", version="Latest")
|
|
140
144
|
import pyautogui
|
|
141
145
|
pyautogui_is_installed = True
|
|
142
146
|
if (
|
|
@@ -689,7 +693,10 @@ def start_sync(*args, **kwargs) -> Browser:
|
|
|
689
693
|
|
|
690
694
|
|
|
691
695
|
async def create_from_driver(driver) -> Browser:
|
|
692
|
-
"""Create a Browser instance from a running driver
|
|
696
|
+
"""Create a CDP Browser instance from a running UC driver.
|
|
697
|
+
This method is DEPRECATED in favor of activate_cdp_mode(),
|
|
698
|
+
which includes the option of switching between the modes,
|
|
699
|
+
and also properly handles configuration based on options."""
|
|
693
700
|
from .config import Config
|
|
694
701
|
|
|
695
702
|
conf = Config()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.43.0
|
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -95,9 +95,9 @@ Requires-Dist: pygments>=2.19.2
|
|
|
95
95
|
Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
|
|
96
96
|
Requires-Dist: tabcompleter>=1.4.0
|
|
97
97
|
Requires-Dist: pdbp>=1.7.1
|
|
98
|
-
Requires-Dist: idna
|
|
98
|
+
Requires-Dist: idna>=3.11
|
|
99
99
|
Requires-Dist: chardet==5.2.0
|
|
100
|
-
Requires-Dist: charset-normalizer<4,>=3.4.
|
|
100
|
+
Requires-Dist: charset-normalizer<4,>=3.4.4
|
|
101
101
|
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
|
102
102
|
Requires-Dist: urllib3<2.6.0,>=1.26.20; python_version >= "3.10"
|
|
103
103
|
Requires-Dist: requests==2.32.4; python_version < "3.9"
|
|
@@ -113,7 +113,7 @@ Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
|
|
|
113
113
|
Requires-Dist: websocket-client~=1.9.0; python_version >= "3.9"
|
|
114
114
|
Requires-Dist: selenium==4.27.1; python_version < "3.9"
|
|
115
115
|
Requires-Dist: selenium==4.32.0; python_version >= "3.9" and python_version < "3.10"
|
|
116
|
-
Requires-Dist: selenium==4.
|
|
116
|
+
Requires-Dist: selenium==4.37.0; python_version >= "3.10"
|
|
117
117
|
Requires-Dist: cssselect==1.2.0; python_version < "3.9"
|
|
118
118
|
Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
|
|
119
119
|
Requires-Dist: sortedcontainers==2.4.0
|
|
@@ -149,7 +149,8 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
|
|
149
149
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
|
150
150
|
Provides-Extra: coverage
|
|
151
151
|
Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
|
|
152
|
-
Requires-Dist: coverage>=7.10.7; python_version >= "3.9" and extra == "coverage"
|
|
152
|
+
Requires-Dist: coverage>=7.10.7; (python_version >= "3.9" and python_version < "3.10") and extra == "coverage"
|
|
153
|
+
Requires-Dist: coverage>=7.11.0; python_version >= "3.10" and extra == "coverage"
|
|
153
154
|
Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
|
|
154
155
|
Requires-Dist: pytest-cov>=7.0.0; python_version >= "3.9" and extra == "coverage"
|
|
155
156
|
Provides-Extra: flake8
|
|
@@ -170,14 +171,15 @@ Provides-Extra: pdfminer
|
|
|
170
171
|
Requires-Dist: pdfminer.six==20250324; python_version < "3.9" and extra == "pdfminer"
|
|
171
172
|
Requires-Dist: pdfminer.six==20250506; python_version >= "3.9" and extra == "pdfminer"
|
|
172
173
|
Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
|
|
173
|
-
Requires-Dist: cryptography==46.0.
|
|
174
|
+
Requires-Dist: cryptography==46.0.3; python_version >= "3.9" and extra == "pdfminer"
|
|
174
175
|
Requires-Dist: cffi==1.17.1; python_version < "3.9" and extra == "pdfminer"
|
|
175
176
|
Requires-Dist: cffi==2.0.0; python_version >= "3.9" and extra == "pdfminer"
|
|
176
177
|
Requires-Dist: pycparser==2.22; python_version < "3.9" and extra == "pdfminer"
|
|
177
178
|
Requires-Dist: pycparser==2.23; python_version >= "3.9" and extra == "pdfminer"
|
|
178
179
|
Provides-Extra: pillow
|
|
179
180
|
Requires-Dist: Pillow>=10.4.0; python_version < "3.9" and extra == "pillow"
|
|
180
|
-
Requires-Dist: Pillow>=11.3.0; python_version >= "3.9" and extra == "pillow"
|
|
181
|
+
Requires-Dist: Pillow>=11.3.0; (python_version >= "3.9" and python_version < "3.10") and extra == "pillow"
|
|
182
|
+
Requires-Dist: Pillow>=12.0.0; python_version >= "3.10" and extra == "pillow"
|
|
181
183
|
Provides-Extra: pip-system-certs
|
|
182
184
|
Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
|
|
183
185
|
Provides-Extra: proxy
|
|
@@ -227,9 +229,10 @@ Dynamic: summary
|
|
|
227
229
|
|
|
228
230
|
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
|
|
229
231
|
|
|
230
|
-
<p align="center" class="hero__title"><b>
|
|
232
|
+
<p align="center" class="hero__title"><b>Automate, test, and scrape the web — on your own terms.<br /></b></p>
|
|
231
233
|
|
|
232
|
-
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a
|
|
234
|
+
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
|
|
235
|
+
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/SeleniumBase?style=social"></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
|
|
233
236
|
|
|
234
237
|
<p align="center">
|
|
235
238
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -269,13 +272,13 @@ Dynamic: summary
|
|
|
269
272
|
<br />
|
|
270
273
|
</p>
|
|
271
274
|
|
|
272
|
-
<p>SeleniumBase is
|
|
275
|
+
<p>SeleniumBase is a browser automation framework for the modern web. Both new and experienced Python users alike can easily get started. With special stealth features like UC Mode and CDP Mode, you'll be evading bot-detection and bypassing CAPTCHAs in minutes.</p>
|
|
273
276
|
|
|
274
277
|
--------
|
|
275
278
|
|
|
276
279
|
📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
|
|
277
280
|
|
|
278
|
-
🐙
|
|
281
|
+
🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> help you evade bot-detection.
|
|
279
282
|
|
|
280
283
|
ℹ️ Most scripts run with raw <code translate="no"><b>python</b></code>, although some scripts use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
|
|
281
284
|
|
|
@@ -543,7 +546,6 @@ pip install seleniumbase
|
|
|
543
546
|
|
|
544
547
|
* (Add ``--upgrade`` OR ``-U`` to upgrade SeleniumBase.)
|
|
545
548
|
* (Add ``--force-reinstall`` to upgrade indirect packages.)
|
|
546
|
-
* (Use ``pip3`` if multiple versions of Python are present.)
|
|
547
549
|
|
|
548
550
|
🔵 **How to install ``seleniumbase`` from a GitHub clone:**
|
|
549
551
|
|
|
@@ -617,10 +619,10 @@ pip install -e .
|
|
|
617
619
|
<summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
|
|
618
620
|
|
|
619
621
|
```zsh
|
|
620
|
-
*** chromedriver to download =
|
|
622
|
+
*** chromedriver to download = 141.0.7390.78 (Latest Stable)
|
|
621
623
|
|
|
622
624
|
Downloading chromedriver-mac-arm64.zip from:
|
|
623
|
-
https://storage.googleapis.com/chrome-for-testing-public/
|
|
625
|
+
https://storage.googleapis.com/chrome-for-testing-public/141.0.7390.78/mac-arm64/chromedriver-mac-arm64.zip ...
|
|
624
626
|
Download Complete!
|
|
625
627
|
|
|
626
628
|
Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
|
|
@@ -630,8 +632,8 @@ The file [chromedriver] was saved to:
|
|
|
630
632
|
~/github/SeleniumBase/seleniumbase/drivers/
|
|
631
633
|
chromedriver
|
|
632
634
|
|
|
633
|
-
Making [chromedriver
|
|
634
|
-
[chromedriver
|
|
635
|
+
Making [chromedriver 141.0.7390.78] executable ...
|
|
636
|
+
[chromedriver 141.0.7390.78] is now ready for use!
|
|
635
637
|
```
|
|
636
638
|
|
|
637
639
|
</details>
|
|
@@ -3,7 +3,7 @@ sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
|
|
|
3
3
|
sbase/steps.py,sha256=wiPSWZhFpBlWvkqXRJ18btpBu3nQaw9K5AzIJNAX5RM,43521
|
|
4
4
|
seleniumbase/__init__.py,sha256=JFEY9P5QJqsa1M6ghzLMH2eIPQyh85iglCaQwg8Y8z4,2498
|
|
5
5
|
seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
|
|
6
|
-
seleniumbase/__version__.py,sha256=
|
|
6
|
+
seleniumbase/__version__.py,sha256=Rk3JHDl6bfc3IWDxvXHc9k4a6DizDy4Ud9_fyX4zmhA,46
|
|
7
7
|
seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
seleniumbase/behave/behave_helper.py,sha256=lJtagtivSbEpbRj0EKV4l4PuPU6NANONJJAnYwgVCe0,24379
|
|
9
9
|
seleniumbase/behave/behave_sb.py,sha256=guLihFsr1uJ4v2AR3r3Vy_BTeHrHwy2JEJxhp-MVnZA,59872
|
|
@@ -27,7 +27,7 @@ seleniumbase/console_scripts/sb_caseplans.py,sha256=C_vhATSa9dEDOSmHT9uk64ebkXcq
|
|
|
27
27
|
seleniumbase/console_scripts/sb_commander.py,sha256=Ejal4WhnMSTLcykCT04jmMuH_fvDrfIAoxoJ23LclAM,13084
|
|
28
28
|
seleniumbase/console_scripts/sb_install.py,sha256=LosIv69jk2k6bNdcB1ozUjV0vZ4lWyUBr8xM2UpSz5g,56401
|
|
29
29
|
seleniumbase/console_scripts/sb_mkchart.py,sha256=ep9g-9CSIwaOJKVxhB3xjRQpfsuApyN8-Dr129cNXwQ,10941
|
|
30
|
-
seleniumbase/console_scripts/sb_mkdir.py,sha256=
|
|
30
|
+
seleniumbase/console_scripts/sb_mkdir.py,sha256=YRpgpC6FSVuVlIx-3E-JKomF4jI5HVBk8OSWDULmoAI,30720
|
|
31
31
|
seleniumbase/console_scripts/sb_mkfile.py,sha256=OWYd4yFccmjrd-gNn1t1una-HDRU2_N2-r4Tg3nHsj0,17744
|
|
32
32
|
seleniumbase/console_scripts/sb_mkpres.py,sha256=EWFRVacjYTX49y-fEiYTZacM9_01IxuuaO4nMjHrIGo,11015
|
|
33
33
|
seleniumbase/console_scripts/sb_mkrec.py,sha256=E268227Q75ZHP1rGFoIY_6i6FzGxD_kWmKm7QMntpW4,12012
|
|
@@ -36,7 +36,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0C
|
|
|
36
36
|
seleniumbase/console_scripts/sb_recorder.py,sha256=DH-n2fN7N9qyHMl7wjtn8MiliBgfw-1kwgmfg1GUuhk,10772
|
|
37
37
|
seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
38
|
seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
|
|
39
|
-
seleniumbase/core/browser_launcher.py,sha256=
|
|
39
|
+
seleniumbase/core/browser_launcher.py,sha256=N9VF8BmQFtIs6NBOD6neVjueaEAmDfJlmCi5mvN1Prk,251017
|
|
40
40
|
seleniumbase/core/capabilities_parser.py,sha256=meIS2uHapTCq2ldfNAToC7r0cKmZDRXuYNKExM1GHDY,6038
|
|
41
41
|
seleniumbase/core/colored_traceback.py,sha256=DrRWfg7XEnKcgY59Xj7Jdk09H-XqHYBSUpB-DiZt6iY,2020
|
|
42
42
|
seleniumbase/core/create_db_tables.sql,sha256=VWPtrdiW_HQ6yETHjqTu-VIrTwvd8I8o1NfBeaVSHpU,972
|
|
@@ -50,7 +50,7 @@ seleniumbase/core/proxy_helper.py,sha256=pZ1NboNfziHU3vWZLOZLX-qkfM3oKSnpc3omQf9
|
|
|
50
50
|
seleniumbase/core/recorder_helper.py,sha256=gDION28OK4NAYsE-7ohKZ9Z3sxQQ0FEjf859LDpqsg4,25320
|
|
51
51
|
seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
|
|
52
52
|
seleniumbase/core/s3_manager.py,sha256=z_4qx2jI_gtK5r3niGXgEOBpfMUicUCOciowai50MP4,3529
|
|
53
|
-
seleniumbase/core/sb_cdp.py,sha256=
|
|
53
|
+
seleniumbase/core/sb_cdp.py,sha256=g2bmOuzH32cPkIUqZ7QVkjZrvCTD-bGcN5nqAFydnxk,107843
|
|
54
54
|
seleniumbase/core/sb_driver.py,sha256=-IQsskc7HpXQbcBL04IPjmGpyYchyo7v9OPF2WcahDw,14159
|
|
55
55
|
seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
|
|
56
56
|
seleniumbase/core/settings_parser.py,sha256=gqVohHVlE_5L5Cqe2L24uYrRzvoK-saX8E_Df7_-_3I,7609
|
|
@@ -67,14 +67,14 @@ seleniumbase/extensions/disable_csp.zip,sha256=5RvomXnm2PdivUVcxTV6jfvD8WhTEsQYH
|
|
|
67
67
|
seleniumbase/extensions/recorder.zip,sha256=JEE_FVEvlS63cFQbVLEroIyPSS91nWCDL0MhjVrmIpk,11813
|
|
68
68
|
seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
|
|
69
69
|
seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
|
-
seleniumbase/fixtures/base_case.py,sha256=
|
|
70
|
+
seleniumbase/fixtures/base_case.py,sha256=mHFnGq2TzI79mDYtxxEKhSYrGZd6LbauaS_pCb4mBbo,741459
|
|
71
71
|
seleniumbase/fixtures/constants.py,sha256=WMrItuNyKq3XVJ64NluLIRc4gJCxDw8K8qXED0b9S2w,13752
|
|
72
72
|
seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
|
|
73
73
|
seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
|
|
74
74
|
seleniumbase/fixtures/js_utils.py,sha256=waXwlyMx7-rIFI8mJ_R8cL_mvih_gXlcJ_wT5h38HbI,52517
|
|
75
75
|
seleniumbase/fixtures/page_actions.py,sha256=DvT0CzqFnpFGLfvmDk7zZ2XMcX_RxLYhNX6Nxxj4rRo,73213
|
|
76
76
|
seleniumbase/fixtures/page_utils.py,sha256=H1iV8f9vDyEy87DBntyiBXC_tg8HskcebUOAJVn0hxE,12160
|
|
77
|
-
seleniumbase/fixtures/shared_utils.py,sha256=
|
|
77
|
+
seleniumbase/fixtures/shared_utils.py,sha256=kn0rcF0tEkQkiT8RGVooNFsLnVWmdPeTH9PfIm86TOI,10527
|
|
78
78
|
seleniumbase/fixtures/unittest_helper.py,sha256=sfZ92rZeBAn_sF_yQ3I6_I7h3lyU5-cV_UMegBNoEm8,1294
|
|
79
79
|
seleniumbase/fixtures/words.py,sha256=FOA4mAYvl3EPVpBTvgvK6YwCL8BdlRCmed685kEe7Vg,7827
|
|
80
80
|
seleniumbase/fixtures/xpath_to_css.py,sha256=lML56k656fElXJ4NJF07r35FjctrbgQkXUotNk7A-as,8876
|
|
@@ -117,8 +117,8 @@ seleniumbase/undetected/reactor.py,sha256=NropaXcO54pzmDq6quR27qPJxab6636H7LRAaq
|
|
|
117
117
|
seleniumbase/undetected/webelement.py,sha256=OOpUYbEiOG52KsYYyuDW9tYLdA2SMnukvwQHUdPVn9E,1389
|
|
118
118
|
seleniumbase/undetected/cdp_driver/__init__.py,sha256=Ga9alwuaZZy4_XOShc0HjgFnNqpPdrcbjAicz5gE7a4,215
|
|
119
119
|
seleniumbase/undetected/cdp_driver/_contradict.py,sha256=lP4b0h5quAy573ETn_TBbYV889cL1AuPLVInpJ0ZkiU,3183
|
|
120
|
-
seleniumbase/undetected/cdp_driver/browser.py,sha256=
|
|
121
|
-
seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=
|
|
120
|
+
seleniumbase/undetected/cdp_driver/browser.py,sha256=AQI6uWVyhv7VEnx0CE3V9MeoUa-VDilFPytnQile31Y,35651
|
|
121
|
+
seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=XpzaUAbTL-4IciQ984x9QvA9HgYFzRlYrRv94fIfbpM,33918
|
|
122
122
|
seleniumbase/undetected/cdp_driver/config.py,sha256=B5Wf0E5xvCmIuLO_Y06oyKYd04yM2auj--JyGKUKsls,13630
|
|
123
123
|
seleniumbase/undetected/cdp_driver/connection.py,sha256=WgZ4QamXSdTzP4Xfgkn8mxv-JFivMG6hqbyHy2_LQlg,25717
|
|
124
124
|
seleniumbase/undetected/cdp_driver/element.py,sha256=FIC6v7OmumLCT-_vIc3H4oju_oBbaLpWJUJIKm2c_q4,40467
|
|
@@ -137,9 +137,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.bat,sha256=Ftq-GrAKRYH2ssDPr
|
|
|
137
137
|
seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443QFK8PryBpDmKn5Gy0s4o0vDSM,106
|
|
138
138
|
seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
139
|
seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
|
|
140
|
-
seleniumbase-4.
|
|
141
|
-
seleniumbase-4.
|
|
142
|
-
seleniumbase-4.
|
|
143
|
-
seleniumbase-4.
|
|
144
|
-
seleniumbase-4.
|
|
145
|
-
seleniumbase-4.
|
|
140
|
+
seleniumbase-4.43.0.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
|
|
141
|
+
seleniumbase-4.43.0.dist-info/METADATA,sha256=SlNtEsXjbxLxS0lyt1KHlN7LA2KpF2HPQiQYJlHcVMY,90229
|
|
142
|
+
seleniumbase-4.43.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
143
|
+
seleniumbase-4.43.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
|
|
144
|
+
seleniumbase-4.43.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
|
|
145
|
+
seleniumbase-4.43.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|