seleniumbase 4.24.10__py3-none-any.whl → 4.33.15__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.
- sbase/__init__.py +1 -0
- sbase/steps.py +7 -0
- seleniumbase/__init__.py +16 -7
- seleniumbase/__version__.py +1 -1
- seleniumbase/behave/behave_sb.py +97 -32
- seleniumbase/common/decorators.py +16 -7
- seleniumbase/config/proxy_list.py +3 -3
- seleniumbase/config/settings.py +4 -0
- seleniumbase/console_scripts/logo_helper.py +47 -8
- seleniumbase/console_scripts/run.py +345 -335
- seleniumbase/console_scripts/sb_behave_gui.py +5 -12
- seleniumbase/console_scripts/sb_caseplans.py +6 -13
- seleniumbase/console_scripts/sb_commander.py +5 -12
- seleniumbase/console_scripts/sb_install.py +62 -54
- seleniumbase/console_scripts/sb_mkchart.py +13 -20
- seleniumbase/console_scripts/sb_mkdir.py +11 -17
- seleniumbase/console_scripts/sb_mkfile.py +69 -43
- seleniumbase/console_scripts/sb_mkpres.py +13 -20
- seleniumbase/console_scripts/sb_mkrec.py +88 -21
- seleniumbase/console_scripts/sb_objectify.py +30 -30
- seleniumbase/console_scripts/sb_print.py +5 -12
- seleniumbase/console_scripts/sb_recorder.py +16 -11
- seleniumbase/core/browser_launcher.py +1658 -221
- seleniumbase/core/detect_b_ver.py +7 -8
- seleniumbase/core/log_helper.py +42 -27
- seleniumbase/core/mysql.py +1 -4
- seleniumbase/core/proxy_helper.py +35 -30
- seleniumbase/core/recorder_helper.py +24 -5
- seleniumbase/core/sb_cdp.py +1951 -0
- seleniumbase/core/sb_driver.py +162 -8
- seleniumbase/core/settings_parser.py +6 -0
- seleniumbase/core/style_sheet.py +10 -0
- seleniumbase/extensions/recorder.zip +0 -0
- seleniumbase/fixtures/base_case.py +1234 -632
- seleniumbase/fixtures/constants.py +10 -1
- seleniumbase/fixtures/js_utils.py +171 -144
- seleniumbase/fixtures/page_actions.py +177 -13
- seleniumbase/fixtures/page_utils.py +25 -53
- seleniumbase/fixtures/shared_utils.py +97 -11
- seleniumbase/js_code/active_css_js.py +1 -1
- seleniumbase/js_code/recorder_js.py +1 -1
- seleniumbase/plugins/base_plugin.py +2 -3
- seleniumbase/plugins/driver_manager.py +340 -65
- seleniumbase/plugins/pytest_plugin.py +276 -47
- seleniumbase/plugins/sb_manager.py +412 -99
- seleniumbase/plugins/selenium_plugin.py +122 -17
- seleniumbase/translate/translator.py +0 -7
- seleniumbase/undetected/__init__.py +59 -52
- seleniumbase/undetected/cdp.py +0 -1
- seleniumbase/undetected/cdp_driver/__init__.py +1 -0
- seleniumbase/undetected/cdp_driver/_contradict.py +110 -0
- seleniumbase/undetected/cdp_driver/browser.py +829 -0
- seleniumbase/undetected/cdp_driver/cdp_util.py +458 -0
- seleniumbase/undetected/cdp_driver/config.py +334 -0
- seleniumbase/undetected/cdp_driver/connection.py +639 -0
- seleniumbase/undetected/cdp_driver/element.py +1168 -0
- seleniumbase/undetected/cdp_driver/tab.py +1323 -0
- seleniumbase/undetected/dprocess.py +4 -7
- seleniumbase/undetected/options.py +6 -8
- seleniumbase/undetected/patcher.py +11 -13
- seleniumbase/undetected/reactor.py +0 -1
- seleniumbase/undetected/webelement.py +16 -3
- {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/LICENSE +1 -1
- {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/METADATA +299 -252
- {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/RECORD +68 -70
- {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/WHEEL +1 -1
- sbase/ReadMe.txt +0 -2
- seleniumbase/ReadMe.md +0 -25
- seleniumbase/common/ReadMe.md +0 -71
- seleniumbase/console_scripts/ReadMe.md +0 -731
- seleniumbase/drivers/ReadMe.md +0 -27
- seleniumbase/extensions/ReadMe.md +0 -12
- seleniumbase/masterqa/ReadMe.md +0 -61
- seleniumbase/resources/ReadMe.md +0 -31
- seleniumbase/resources/favicon.ico +0 -0
- seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
- seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
- {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/top_level.txt +0 -0
@@ -39,21 +39,21 @@ import sys
|
|
39
39
|
def invalid_run_command(msg=None):
|
40
40
|
exp = " ** mkrec / record / codegen **\n\n"
|
41
41
|
exp += " Usage:\n"
|
42
|
-
exp += "
|
43
|
-
exp += "
|
42
|
+
exp += " seleniumbase mkrec [FILE.py]\n"
|
43
|
+
exp += " OR: sbase mkrec [FILE.py]\n"
|
44
44
|
exp += " Examples:\n"
|
45
|
-
exp += "
|
46
|
-
exp += "
|
45
|
+
exp += " sbase mkrec new_test.py\n"
|
46
|
+
exp += " sbase mkrec new_test.py --url=wikipedia.org\n"
|
47
47
|
exp += " Options:\n"
|
48
|
-
exp += "
|
49
|
-
exp += "
|
50
|
-
exp += "
|
51
|
-
exp += "
|
52
|
-
exp += "
|
53
|
-
exp += "
|
48
|
+
exp += " --url=URL (Sets the initial start page URL.)\n"
|
49
|
+
exp += " --edge (Use Edge browser instead of Chrome.)\n"
|
50
|
+
exp += " --gui / --headed (Use headed mode on Linux.)\n"
|
51
|
+
exp += " --uc / --undetected (Use undetectable mode.)\n"
|
52
|
+
exp += " --overwrite (Overwrite file when it exists.)\n"
|
53
|
+
exp += " --behave (Also output Behave/Gherkin files.)\n"
|
54
54
|
exp += " Output:\n"
|
55
|
-
exp += "
|
56
|
-
exp += "
|
55
|
+
exp += " Creates a new SeleniumBase test using the Recorder.\n"
|
56
|
+
exp += " If the filename already exists, an error is raised.\n"
|
57
57
|
if not msg:
|
58
58
|
raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
|
59
59
|
elif msg == "help":
|
@@ -71,13 +71,6 @@ def set_colors(use_colors):
|
|
71
71
|
c7 = ""
|
72
72
|
cr = ""
|
73
73
|
if use_colors:
|
74
|
-
if (
|
75
|
-
"win32" in sys.platform
|
76
|
-
and hasattr(colorama, "just_fix_windows_console")
|
77
|
-
):
|
78
|
-
colorama.just_fix_windows_console()
|
79
|
-
else:
|
80
|
-
colorama.init(autoreset=True)
|
81
74
|
c0 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
|
82
75
|
c1 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
|
83
76
|
c2 = colorama.Fore.LIGHTRED_EX + colorama.Back.LIGHTYELLOW_EX
|
@@ -93,6 +86,7 @@ def main():
|
|
93
86
|
invalid_cmd = None
|
94
87
|
use_edge = False
|
95
88
|
use_uc = False
|
89
|
+
esc_end = False
|
96
90
|
start_page = None
|
97
91
|
next_is_url = False
|
98
92
|
use_colors = True
|
@@ -145,10 +139,14 @@ def main():
|
|
145
139
|
help_me = True
|
146
140
|
elif option.lower() == "--edge":
|
147
141
|
use_edge = True
|
142
|
+
elif option.lower() == "--ee":
|
143
|
+
esc_end = True
|
148
144
|
elif option.lower() in ("--gui", "--headed"):
|
149
145
|
if "linux" in sys.platform:
|
150
146
|
force_gui = True
|
151
|
-
elif option.lower() in (
|
147
|
+
elif option.lower() in (
|
148
|
+
"--uc", "--cdp", "--undetected", "--undetectable"
|
149
|
+
):
|
152
150
|
use_uc = True
|
153
151
|
elif option.lower() in ("--rec-behave", "--behave", "--gherkin"):
|
154
152
|
rec_behave = True
|
@@ -178,11 +176,69 @@ def main():
|
|
178
176
|
data.append("")
|
179
177
|
data.append("class RecorderTest(BaseCase):")
|
180
178
|
data.append(" def test_recording(self):")
|
179
|
+
if use_uc:
|
180
|
+
data.append(" if self.undetectable:")
|
181
|
+
if (
|
182
|
+
start_page
|
183
|
+
and (
|
184
|
+
start_page.startswith("http:")
|
185
|
+
or start_page.startswith("https:")
|
186
|
+
or start_page.startswith("file:")
|
187
|
+
)
|
188
|
+
):
|
189
|
+
used_sp = start_page
|
190
|
+
if '"' not in start_page:
|
191
|
+
used_sp = '"%s"' % start_page
|
192
|
+
elif "'" not in start_page:
|
193
|
+
used_sp = "'%s'" % start_page
|
194
|
+
data.append(
|
195
|
+
" self.uc_open_with_disconnect(\n"
|
196
|
+
" %s\n"
|
197
|
+
" )" % used_sp
|
198
|
+
)
|
199
|
+
else:
|
200
|
+
data.append(" self.disconnect()")
|
181
201
|
data.append(" if self.recorder_ext:")
|
182
202
|
data.append(" # When done recording actions,")
|
183
203
|
data.append(' # type "c", and press [Enter].')
|
184
204
|
data.append(" import pdb; pdb.set_trace()")
|
185
205
|
data.append("")
|
206
|
+
|
207
|
+
if esc_end:
|
208
|
+
msg = ">>> Use [SHIFT + ESC] in the browser to end recording!"
|
209
|
+
d2 = []
|
210
|
+
d2.append("from seleniumbase import BaseCase")
|
211
|
+
d2.append("")
|
212
|
+
d2.append("")
|
213
|
+
d2.append("class RecorderTest(BaseCase):")
|
214
|
+
d2.append(" def test_recording(self):")
|
215
|
+
d2.append(" if self.recorder_ext:")
|
216
|
+
d2.append(" print(")
|
217
|
+
d2.append(' "\\n\\n%s\\n"' % msg)
|
218
|
+
d2.append(" )")
|
219
|
+
d2.append(' script = self._get_rec_shift_esc_script()')
|
220
|
+
d2.append(' esc = "return document.sb_esc_end;"')
|
221
|
+
d2.append(" start_time = self.time()")
|
222
|
+
d2.append(" last_handles_num = self._get_num_handles()")
|
223
|
+
d2.append(" for i in range(1200):")
|
224
|
+
d2.append(" try:")
|
225
|
+
d2.append(" self.execute_script(script)")
|
226
|
+
d2.append(" handles_num = self._get_num_handles()")
|
227
|
+
d2.append(" if handles_num < 1:")
|
228
|
+
d2.append(" return")
|
229
|
+
d2.append(" elif handles_num != last_handles_num:")
|
230
|
+
d2.append(" self.switch_to_window(-1)")
|
231
|
+
d2.append(" last_handles_num = handles_num")
|
232
|
+
d2.append(' if self.execute_script(esc) == "yes":')
|
233
|
+
d2.append(" return")
|
234
|
+
d2.append(" elif self.time() - start_time > 600:")
|
235
|
+
d2.append(" return")
|
236
|
+
d2.append(" self.sleep(0.5)")
|
237
|
+
d2.append(" except Exception:")
|
238
|
+
d2.append(" return")
|
239
|
+
d2.append("")
|
240
|
+
data = d2
|
241
|
+
|
186
242
|
file = codecs.open(file_path, "w+", "utf-8")
|
187
243
|
file.writelines("\r\n".join(data))
|
188
244
|
file.close()
|
@@ -192,7 +248,18 @@ def main():
|
|
192
248
|
)
|
193
249
|
print(success)
|
194
250
|
run_cmd = None
|
195
|
-
if
|
251
|
+
if (
|
252
|
+
not start_page
|
253
|
+
or (
|
254
|
+
use_uc
|
255
|
+
and (
|
256
|
+
start_page.startswith("http:")
|
257
|
+
or start_page.startswith("https:")
|
258
|
+
or start_page.startswith("file:")
|
259
|
+
)
|
260
|
+
and not esc_end
|
261
|
+
)
|
262
|
+
):
|
196
263
|
run_cmd = "%s -m pytest %s --rec -q -s" % (sys_executable, file_name)
|
197
264
|
else:
|
198
265
|
run_cmd = "%s -m pytest %s --rec -q -s --url=%s" % (
|
@@ -2,11 +2,11 @@
|
|
2
2
|
Converts a SeleniumBase Python file into one that uses the Page Object Pattern.
|
3
3
|
|
4
4
|
Usage:
|
5
|
-
|
5
|
+
seleniumbase objectify [SELENIUMBASE_PYTHON_FILE].py
|
6
6
|
Output:
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
A modified version of the file where the selectors
|
8
|
+
have been replaced with variable names defined in
|
9
|
+
"page_objects.py", supporting the Page Object Pattern.
|
10
10
|
"""
|
11
11
|
import codecs
|
12
12
|
import os
|
@@ -35,57 +35,57 @@ def invalid_run_command(shell_command):
|
|
35
35
|
def invalid_objectify_run_command():
|
36
36
|
exp = " ** objectify **\n\n"
|
37
37
|
exp += " Usage:\n"
|
38
|
-
exp += "
|
38
|
+
exp += " seleniumbase objectify [SELENIUMBASE_PYTHON_FILE]\n"
|
39
39
|
exp += " Options:\n"
|
40
|
-
exp += "
|
41
|
-
exp += "
|
40
|
+
exp += " -c, --comments (Add object selectors to the comments.)\n"
|
41
|
+
exp += " (Default: No added comments.)\n"
|
42
42
|
exp += " Output:\n"
|
43
|
-
exp += "
|
44
|
-
exp += "
|
45
|
-
exp += '
|
46
|
-
exp += "
|
47
|
-
exp += '
|
48
|
-
exp += '
|
43
|
+
exp += " Converts a SeleniumBase Python file into one that uses\n"
|
44
|
+
exp += " the Page Object Pattern by converting page selectors\n"
|
45
|
+
exp += ' into objects stored in a "page_objects.py" file that is\n'
|
46
|
+
exp += " autogenerated and stored in the same folder as tests.\n"
|
47
|
+
exp += ' (seleniumbase "objectify" has the same outcome as\n'
|
48
|
+
exp += ' combining "extract-objects" with "inject-objects")\n'
|
49
49
|
raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
|
50
50
|
|
51
51
|
|
52
52
|
def invalid_inject_objects_run_command():
|
53
53
|
exp = " ** inject-objects **\n\n"
|
54
54
|
exp += " Usage:\n"
|
55
|
-
exp += "
|
55
|
+
exp += " seleniumbase inject-objects [SELENIUMBASE_PYTHON_FILE]\n"
|
56
56
|
exp += " Options:\n"
|
57
|
-
exp += "
|
58
|
-
exp += "
|
57
|
+
exp += " -c, --comments (Add object selectors to the comments.)\n"
|
58
|
+
exp += " (Default: No added comments.)\n"
|
59
59
|
exp += " Output:\n"
|
60
|
-
exp += '
|
61
|
-
exp += "
|
62
|
-
exp += "
|
60
|
+
exp += ' Takes the page objects found in the "page_objects.py"\n'
|
61
|
+
exp += " file and uses those to replace matching selectors in\n"
|
62
|
+
exp += " the selected seleniumbase Python file.\n"
|
63
63
|
raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
|
64
64
|
|
65
65
|
|
66
66
|
def invalid_extract_objects_run_command():
|
67
67
|
exp = " ** extract-objects **\n\n"
|
68
68
|
exp += " Usage:\n"
|
69
|
-
exp += "
|
69
|
+
exp += " seleniumbase extract-objects [SELENIUMBASE_PYTHON_FILE]\n"
|
70
70
|
exp += " Output:\n"
|
71
|
-
exp += "
|
72
|
-
exp += "
|
73
|
-
exp += '
|
71
|
+
exp += " Creates page objects based on selectors found in a\n"
|
72
|
+
exp += " seleniumbase Python file and saves those objects to the\n"
|
73
|
+
exp += ' "page_objects.py" file in the same folder as the tests.\n'
|
74
74
|
raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
|
75
75
|
|
76
76
|
|
77
77
|
def invalid_revert_objects_run_command():
|
78
78
|
exp = " ** revert-objects **\n\n"
|
79
79
|
exp += " Usage:\n"
|
80
|
-
exp += "
|
80
|
+
exp += " seleniumbase revert-objects [SELENIUMBASE_PYTHON_FILE]\n"
|
81
81
|
exp += " Options:\n"
|
82
|
-
exp += "
|
83
|
-
exp += "
|
82
|
+
exp += " -c, --comments (Keep existing comments for the lines.)\n"
|
83
|
+
exp += " (Default: No comments are kept.)\n"
|
84
84
|
exp += " Output:\n"
|
85
|
-
exp += '
|
86
|
-
exp += '
|
87
|
-
exp += "
|
88
|
-
exp += '
|
85
|
+
exp += ' Reverts the changes made by "seleniumbase objectify" or\n'
|
86
|
+
exp += ' "seleniumbase inject-objects" when run against a\n'
|
87
|
+
exp += " seleniumbase Python file. Objects will get replaced by\n"
|
88
|
+
exp += ' selectors stored in the "page_objects.py" file.\n'
|
89
89
|
raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
|
90
90
|
|
91
91
|
|
@@ -18,13 +18,13 @@ import sys
|
|
18
18
|
def invalid_run_command(msg=None):
|
19
19
|
exp = " ** print **\n\n"
|
20
20
|
exp += " Usage:\n"
|
21
|
-
exp += "
|
22
|
-
exp += "
|
21
|
+
exp += " seleniumbase print [FILE] [OPTIONS]\n"
|
22
|
+
exp += " OR: sbase print [FILE] [OPTIONS]\n"
|
23
23
|
exp += " Options:\n"
|
24
|
-
exp += "
|
24
|
+
exp += " -n (Add line Numbers to the rows)\n"
|
25
25
|
exp += " Output:\n"
|
26
|
-
exp += "
|
27
|
-
exp += "
|
26
|
+
exp += " Prints the code/text of any file\n"
|
27
|
+
exp += " with syntax-highlighting.\n"
|
28
28
|
if not msg:
|
29
29
|
raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
|
30
30
|
else:
|
@@ -61,13 +61,6 @@ def get_width(line):
|
|
61
61
|
|
62
62
|
|
63
63
|
def main():
|
64
|
-
if (
|
65
|
-
"win32" in sys.platform
|
66
|
-
and hasattr(colorama, "just_fix_windows_console")
|
67
|
-
):
|
68
|
-
colorama.just_fix_windows_console()
|
69
|
-
else:
|
70
|
-
colorama.init(autoreset=True)
|
71
64
|
c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
|
72
65
|
c7 = colorama.Fore.BLACK + colorama.Back.MAGENTA
|
73
66
|
cr = colorama.Style.RESET_ALL
|
@@ -9,6 +9,7 @@ Usage:
|
|
9
9
|
|
10
10
|
Options:
|
11
11
|
--uc / --undetected (Use undetectable mode.)
|
12
|
+
--cdp (Same as "--uc" and "--undetectable".)
|
12
13
|
--behave (Also output Behave/Gherkin files.)
|
13
14
|
|
14
15
|
Output:
|
@@ -18,23 +19,23 @@ import colorama
|
|
18
19
|
import os
|
19
20
|
import subprocess
|
20
21
|
import sys
|
22
|
+
import tkinter as tk
|
21
23
|
from seleniumbase import config as sb_config
|
22
24
|
from seleniumbase.fixtures import page_utils
|
23
25
|
from seleniumbase.fixtures import shared_utils
|
26
|
+
from tkinter import messagebox
|
24
27
|
|
25
28
|
sb_config.rec_subprocess_p = None
|
26
29
|
sb_config.rec_subprocess_used = False
|
27
30
|
sys_executable = sys.executable
|
28
31
|
if " " in sys_executable:
|
29
32
|
sys_executable = "python"
|
30
|
-
if sys.version_info <= (3,
|
33
|
+
if sys.version_info <= (3, 8):
|
31
34
|
current_version = ".".join(str(ver) for ver in sys.version_info[:3])
|
32
35
|
raise Exception(
|
33
|
-
"\n* Recorder Desktop requires Python 3.
|
36
|
+
"\n* Recorder Desktop requires Python 3.8 or newer!"
|
34
37
|
"\n*** You are currently using Python %s" % current_version
|
35
38
|
)
|
36
|
-
import tkinter as tk # noqa: E402
|
37
|
-
from tkinter import messagebox # noqa: E402
|
38
39
|
|
39
40
|
|
40
41
|
def set_colors(use_colors):
|
@@ -45,13 +46,6 @@ def set_colors(use_colors):
|
|
45
46
|
c4 = ""
|
46
47
|
cr = ""
|
47
48
|
if use_colors:
|
48
|
-
if (
|
49
|
-
"win32" in sys.platform
|
50
|
-
and hasattr(colorama, "just_fix_windows_console")
|
51
|
-
):
|
52
|
-
colorama.just_fix_windows_console()
|
53
|
-
else:
|
54
|
-
colorama.init(autoreset=True)
|
55
49
|
c0 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
|
56
50
|
c1 = colorama.Fore.BLUE + colorama.Back.LIGHTGREEN_EX
|
57
51
|
c2 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
|
@@ -158,10 +152,13 @@ def do_recording(file_name, url, overwrite_enabled, use_chrome, window):
|
|
158
152
|
command += " --edge"
|
159
153
|
if (
|
160
154
|
"--uc" in command_args
|
155
|
+
or "--cdp" in command_args
|
161
156
|
or "--undetected" in command_args
|
162
157
|
or "--undetectable" in command_args
|
163
158
|
):
|
164
159
|
command += " --uc"
|
160
|
+
if "--ee" in command_args:
|
161
|
+
command += " --ee"
|
165
162
|
command += add_on
|
166
163
|
poll = None
|
167
164
|
if sb_config.rec_subprocess_used:
|
@@ -195,6 +192,14 @@ def do_playback(file_name, use_chrome, window, demo_mode=False):
|
|
195
192
|
command += " --edge"
|
196
193
|
if demo_mode:
|
197
194
|
command += " --demo"
|
195
|
+
command_args = sys.argv[2:]
|
196
|
+
if (
|
197
|
+
"--uc" in command_args
|
198
|
+
or "--cdp" in command_args
|
199
|
+
or "--undetected" in command_args
|
200
|
+
or "--undetectable" in command_args
|
201
|
+
):
|
202
|
+
command += " --uc"
|
198
203
|
poll = None
|
199
204
|
if sb_config.rec_subprocess_used:
|
200
205
|
poll = sb_config.rec_subprocess_p.poll()
|