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.
Files changed (79) hide show
  1. sbase/__init__.py +1 -0
  2. sbase/steps.py +7 -0
  3. seleniumbase/__init__.py +16 -7
  4. seleniumbase/__version__.py +1 -1
  5. seleniumbase/behave/behave_sb.py +97 -32
  6. seleniumbase/common/decorators.py +16 -7
  7. seleniumbase/config/proxy_list.py +3 -3
  8. seleniumbase/config/settings.py +4 -0
  9. seleniumbase/console_scripts/logo_helper.py +47 -8
  10. seleniumbase/console_scripts/run.py +345 -335
  11. seleniumbase/console_scripts/sb_behave_gui.py +5 -12
  12. seleniumbase/console_scripts/sb_caseplans.py +6 -13
  13. seleniumbase/console_scripts/sb_commander.py +5 -12
  14. seleniumbase/console_scripts/sb_install.py +62 -54
  15. seleniumbase/console_scripts/sb_mkchart.py +13 -20
  16. seleniumbase/console_scripts/sb_mkdir.py +11 -17
  17. seleniumbase/console_scripts/sb_mkfile.py +69 -43
  18. seleniumbase/console_scripts/sb_mkpres.py +13 -20
  19. seleniumbase/console_scripts/sb_mkrec.py +88 -21
  20. seleniumbase/console_scripts/sb_objectify.py +30 -30
  21. seleniumbase/console_scripts/sb_print.py +5 -12
  22. seleniumbase/console_scripts/sb_recorder.py +16 -11
  23. seleniumbase/core/browser_launcher.py +1658 -221
  24. seleniumbase/core/detect_b_ver.py +7 -8
  25. seleniumbase/core/log_helper.py +42 -27
  26. seleniumbase/core/mysql.py +1 -4
  27. seleniumbase/core/proxy_helper.py +35 -30
  28. seleniumbase/core/recorder_helper.py +24 -5
  29. seleniumbase/core/sb_cdp.py +1951 -0
  30. seleniumbase/core/sb_driver.py +162 -8
  31. seleniumbase/core/settings_parser.py +6 -0
  32. seleniumbase/core/style_sheet.py +10 -0
  33. seleniumbase/extensions/recorder.zip +0 -0
  34. seleniumbase/fixtures/base_case.py +1234 -632
  35. seleniumbase/fixtures/constants.py +10 -1
  36. seleniumbase/fixtures/js_utils.py +171 -144
  37. seleniumbase/fixtures/page_actions.py +177 -13
  38. seleniumbase/fixtures/page_utils.py +25 -53
  39. seleniumbase/fixtures/shared_utils.py +97 -11
  40. seleniumbase/js_code/active_css_js.py +1 -1
  41. seleniumbase/js_code/recorder_js.py +1 -1
  42. seleniumbase/plugins/base_plugin.py +2 -3
  43. seleniumbase/plugins/driver_manager.py +340 -65
  44. seleniumbase/plugins/pytest_plugin.py +276 -47
  45. seleniumbase/plugins/sb_manager.py +412 -99
  46. seleniumbase/plugins/selenium_plugin.py +122 -17
  47. seleniumbase/translate/translator.py +0 -7
  48. seleniumbase/undetected/__init__.py +59 -52
  49. seleniumbase/undetected/cdp.py +0 -1
  50. seleniumbase/undetected/cdp_driver/__init__.py +1 -0
  51. seleniumbase/undetected/cdp_driver/_contradict.py +110 -0
  52. seleniumbase/undetected/cdp_driver/browser.py +829 -0
  53. seleniumbase/undetected/cdp_driver/cdp_util.py +458 -0
  54. seleniumbase/undetected/cdp_driver/config.py +334 -0
  55. seleniumbase/undetected/cdp_driver/connection.py +639 -0
  56. seleniumbase/undetected/cdp_driver/element.py +1168 -0
  57. seleniumbase/undetected/cdp_driver/tab.py +1323 -0
  58. seleniumbase/undetected/dprocess.py +4 -7
  59. seleniumbase/undetected/options.py +6 -8
  60. seleniumbase/undetected/patcher.py +11 -13
  61. seleniumbase/undetected/reactor.py +0 -1
  62. seleniumbase/undetected/webelement.py +16 -3
  63. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/LICENSE +1 -1
  64. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/METADATA +299 -252
  65. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/RECORD +68 -70
  66. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/WHEEL +1 -1
  67. sbase/ReadMe.txt +0 -2
  68. seleniumbase/ReadMe.md +0 -25
  69. seleniumbase/common/ReadMe.md +0 -71
  70. seleniumbase/console_scripts/ReadMe.md +0 -731
  71. seleniumbase/drivers/ReadMe.md +0 -27
  72. seleniumbase/extensions/ReadMe.md +0 -12
  73. seleniumbase/masterqa/ReadMe.md +0 -61
  74. seleniumbase/resources/ReadMe.md +0 -31
  75. seleniumbase/resources/favicon.ico +0 -0
  76. seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
  77. seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
  78. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/entry_points.txt +0 -0
  79. {seleniumbase-4.24.10.dist-info → seleniumbase-4.33.15.dist-info}/top_level.txt +0 -0
@@ -16,16 +16,16 @@ Output:
16
16
  import colorama
17
17
  import subprocess
18
18
  import sys
19
+ import tkinter as tk
20
+ from seleniumbase.fixtures import shared_utils
21
+ from tkinter.scrolledtext import ScrolledText
19
22
 
20
- if sys.version_info <= (3, 7):
23
+ if sys.version_info <= (3, 8):
21
24
  current_version = ".".join(str(ver) for ver in sys.version_info[:3])
22
25
  raise Exception(
23
- "\n* SBase Commander requires Python 3.7 or newer!"
26
+ "\n* SBase Commander requires Python 3.8 or newer!"
24
27
  "\n** You are currently using Python %s" % current_version
25
28
  )
26
- from seleniumbase.fixtures import shared_utils
27
- import tkinter as tk # noqa: E402
28
- from tkinter.scrolledtext import ScrolledText # noqa: E402
29
29
 
30
30
 
31
31
  def set_colors(use_colors):
@@ -38,13 +38,6 @@ def set_colors(use_colors):
38
38
  c6 = ""
39
39
  cr = ""
40
40
  if use_colors:
41
- if (
42
- shared_utils.is_windows()
43
- and hasattr(colorama, "just_fix_windows_console")
44
- ):
45
- colorama.just_fix_windows_console()
46
- else:
47
- colorama.init(autoreset=True)
48
41
  c0 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
49
42
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTGREEN_EX
50
43
  c2 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
@@ -20,17 +20,17 @@ import colorama
20
20
  import os
21
21
  import subprocess
22
22
  import sys
23
+ import tkinter as tk
24
+ from seleniumbase.fixtures import shared_utils
25
+ from tkinter import messagebox
26
+ from tkinter.scrolledtext import ScrolledText
23
27
 
24
- if sys.version_info <= (3, 7):
28
+ if sys.version_info <= (3, 8):
25
29
  current_version = ".".join(str(ver) for ver in sys.version_info[:3])
26
30
  raise Exception(
27
- "\n* SBase Case Plans Generator requires Python 3.7 or newer!"
31
+ "\n* SBase Case Plans Generator requires Python 3.8 or newer!"
28
32
  "\n** You are currently using Python %s" % current_version
29
33
  )
30
- from seleniumbase.fixtures import shared_utils
31
- import tkinter as tk # noqa: E402
32
- from tkinter import messagebox # noqa: E402
33
- from tkinter.scrolledtext import ScrolledText # noqa: E402
34
34
 
35
35
 
36
36
  def set_colors(use_colors):
@@ -42,13 +42,6 @@ def set_colors(use_colors):
42
42
  c5 = ""
43
43
  cr = ""
44
44
  if use_colors:
45
- if (
46
- shared_utils.is_windows()
47
- and hasattr(colorama, "just_fix_windows_console")
48
- ):
49
- colorama.just_fix_windows_console()
50
- else:
51
- colorama.init(autoreset=True)
52
45
  c0 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
53
46
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTGREEN_EX
54
47
  c2 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
@@ -21,16 +21,16 @@ import colorama
21
21
  import os
22
22
  import subprocess
23
23
  import sys
24
+ import tkinter as tk
25
+ from seleniumbase.fixtures import shared_utils
26
+ from tkinter.scrolledtext import ScrolledText
24
27
 
25
- if sys.version_info <= (3, 7):
28
+ if sys.version_info <= (3, 8):
26
29
  current_version = ".".join(str(ver) for ver in sys.version_info[:3])
27
30
  raise Exception(
28
- "\n* SBase Commander requires Python 3.7 or newer!"
31
+ "\n* SBase Commander requires Python 3.8 or newer!"
29
32
  "\n** You are currently using Python %s" % current_version
30
33
  )
31
- from seleniumbase.fixtures import shared_utils
32
- import tkinter as tk # noqa: E402
33
- from tkinter.scrolledtext import ScrolledText # noqa: E402
34
34
 
35
35
 
36
36
  def set_colors(use_colors):
@@ -42,13 +42,6 @@ def set_colors(use_colors):
42
42
  c5 = ""
43
43
  cr = ""
44
44
  if use_colors:
45
- if (
46
- shared_utils.is_windows()
47
- and hasattr(colorama, "just_fix_windows_console")
48
- ):
49
- colorama.just_fix_windows_console()
50
- else:
51
- colorama.init(autoreset=True)
52
45
  c0 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
53
46
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTGREEN_EX
54
47
  c2 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
@@ -2,28 +2,28 @@
2
2
  Downloads the specified webdriver to "seleniumbase/drivers/"
3
3
 
4
4
  Usage:
5
- sbase get {chromedriver|geckodriver|edgedriver|
6
- iedriver|uc_driver} [OPTIONS]
5
+ sbase get {chromedriver|geckodriver|edgedriver|
6
+ iedriver|uc_driver} [OPTIONS]
7
7
  Options:
8
- VERSION Specify the version.
9
- Tries to detect the needed version.
10
- If using chromedriver or edgedriver,
11
- you can use the major version integer.
12
- -p OR --path Also copy the driver to /usr/local/bin
8
+ VERSION Specify the version.
9
+ Tries to detect the needed version.
10
+ If using chromedriver or edgedriver,
11
+ you can use the major version integer.
12
+ -p OR --path Also copy the driver to /usr/local/bin
13
13
  Examples:
14
- sbase get chromedriver
15
- sbase get geckodriver
16
- sbase get edgedriver
17
- sbase get chromedriver 114
18
- sbase get chromedriver 114.0.5735.90
19
- sbase get chromedriver stable
20
- sbase get chromedriver beta
21
- sbase get chromedriver -p
14
+ sbase get chromedriver
15
+ sbase get geckodriver
16
+ sbase get edgedriver
17
+ sbase get chromedriver 114
18
+ sbase get chromedriver 114.0.5735.90
19
+ sbase get chromedriver stable
20
+ sbase get chromedriver beta
21
+ sbase get chromedriver -p
22
22
  Output:
23
- Downloads the webdriver to seleniumbase/drivers/
24
- (chromedriver is required for Chrome automation)
25
- (geckodriver is required for Firefox automation)
26
- (edgedriver is required for MS__Edge automation)
23
+ Downloads the webdriver to seleniumbase/drivers/
24
+ (chromedriver is required for Chrome automation)
25
+ (geckodriver is required for Firefox automation)
26
+ (edgedriver is required for MS__Edge automation)
27
27
  """
28
28
  import colorama
29
29
  import logging
@@ -50,39 +50,40 @@ IS_WINDOWS = shared_utils.is_windows()
50
50
  DRIVER_DIR = os.path.dirname(os.path.realpath(drivers.__file__))
51
51
  LOCAL_PATH = "/usr/local/bin/" # On Mac and Linux systems
52
52
  DEFAULT_CHROMEDRIVER_VERSION = "114.0.5735.90" # (If can't find LATEST_STABLE)
53
- DEFAULT_GECKODRIVER_VERSION = "v0.34.0"
53
+ DEFAULT_GECKODRIVER_VERSION = "v0.35.0"
54
54
  DEFAULT_EDGEDRIVER_VERSION = "115.0.1901.183" # (If can't find LATEST_STABLE)
55
55
 
56
56
 
57
57
  def invalid_run_command():
58
58
  exp = " ** get / install **\n\n"
59
59
  exp += " Usage:\n"
60
- exp += " seleniumbase install [DRIVER] [OPTIONS]\n"
61
- exp += " OR sbase install [DRIVER] [OPTIONS]\n"
62
- exp += " OR seleniumbase get [DRIVER] [OPTIONS]\n"
63
- exp += " OR sbase get [DRIVER] [OPTIONS]\n"
64
- exp += " (Drivers: chromedriver, geckodriver, edgedriver,\n"
65
- exp += " iedriver, uc_driver)\n"
60
+ exp += " seleniumbase install [DRIVER_NAME] [OPTIONS]\n"
61
+ exp += " OR sbase install [DRIVER_NAME] [OPTIONS]\n"
62
+ exp += " OR seleniumbase get [DRIVER_NAME] [OPTIONS]\n"
63
+ exp += " OR sbase get [DRIVER_NAME] [OPTIONS]\n"
64
+ exp += " (Drivers: chromedriver, geckodriver,\n"
65
+ exp += " edgedriver, iedriver, uc_driver)\n"
66
66
  exp += " Options:\n"
67
- exp += " VERSION Specify the version.\n"
68
- exp += " Tries to detect the needed version.\n"
69
- exp += " If using chromedriver or edgedriver,\n"
70
- exp += " you can use the major version integer.\n"
71
- exp += " -p OR --path Also copy the driver to /usr/local/bin\n"
67
+ exp += " VERSION Specify the version.\n"
68
+ exp += " Tries to detect the needed version.\n"
69
+ exp += " If using chromedriver or edgedriver,\n"
70
+ exp += " you can use the major version integer.\n"
71
+ exp += "\n"
72
+ exp += " -p OR --path Also copy the driver to /usr/local/bin\n"
72
73
  exp += " Examples:\n"
73
- exp += " sbase get chromedriver\n"
74
- exp += " sbase get geckodriver\n"
75
- exp += " sbase get edgedriver\n"
76
- exp += " sbase get chromedriver 114\n"
77
- exp += " sbase get chromedriver 114.0.5735.90\n"
78
- exp += " sbase get chromedriver stable\n"
79
- exp += " sbase get chromedriver beta\n"
80
- exp += " sbase get chromedriver -p\n"
74
+ exp += " sbase get chromedriver\n"
75
+ exp += " sbase get geckodriver\n"
76
+ exp += " sbase get edgedriver\n"
77
+ exp += " sbase get chromedriver 114\n"
78
+ exp += " sbase get chromedriver 114.0.5735.90\n"
79
+ exp += " sbase get chromedriver stable\n"
80
+ exp += " sbase get chromedriver beta\n"
81
+ exp += " sbase get chromedriver -p\n"
81
82
  exp += " Output:\n"
82
- exp += " Downloads the webdriver to seleniumbase/drivers/\n"
83
- exp += " (chromedriver is required for Chrome automation)\n"
84
- exp += " (geckodriver is required for Firefox automation)\n"
85
- exp += " (edgedriver is required for MS__Edge automation)\n"
83
+ exp += " Downloads the webdriver to seleniumbase/drivers/\n"
84
+ exp += " (chromedriver is required for Chrome automation)\n"
85
+ exp += " (geckodriver is required for Firefox automation)\n"
86
+ exp += " (edgedriver is required for MS__Edge automation)\n"
86
87
  print("")
87
88
  raise Exception("%s\n\n%s" % (constants.Warnings.INVALID_RUN_COMMAND, exp))
88
89
 
@@ -293,10 +294,6 @@ def main(override=None, intel_for_uc=None, force_uc=None):
293
294
  use_version = ""
294
295
  new_file = ""
295
296
  f_name = ""
296
- if IS_WINDOWS and hasattr(colorama, "just_fix_windows_console"):
297
- colorama.just_fix_windows_console()
298
- else:
299
- colorama.init(autoreset=True)
300
297
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
301
298
  c2 = colorama.Fore.BLUE + colorama.Back.LIGHTGREEN_EX
302
299
  c3 = colorama.Fore.BLUE + colorama.Back.LIGHTYELLOW_EX
@@ -578,10 +575,18 @@ def main(override=None, intel_for_uc=None, force_uc=None):
578
575
  else:
579
576
  invalid_run_command()
580
577
  if IS_MAC:
581
- file_name = "geckodriver-%s-macos.tar.gz" % use_version
578
+ if IS_ARM_MAC:
579
+ file_name = "geckodriver-%s-macos-aarch64.tar.gz" % use_version
580
+ else:
581
+ file_name = "geckodriver-%s-macos.tar.gz" % use_version
582
582
  elif IS_LINUX:
583
583
  if "64" in ARCH:
584
- file_name = "geckodriver-%s-linux64.tar.gz" % use_version
584
+ if "aarch64" in platform.processor():
585
+ file_name = (
586
+ "geckodriver-%s-linux-aarch64.tar.gz" % use_version
587
+ )
588
+ else:
589
+ file_name = "geckodriver-%s-linux64.tar.gz" % use_version
585
590
  else:
586
591
  file_name = "geckodriver-%s-linux32.tar.gz" % use_version
587
592
  elif IS_WINDOWS:
@@ -806,7 +811,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
806
811
  zip_ref.extractall(downloads_folder)
807
812
  zip_ref.close()
808
813
  os.remove(zip_file_path)
809
- shutil.copyfile(driver_path, os.path.join(downloads_folder, filename))
814
+ shutil.copy3(driver_path, os.path.join(downloads_folder, filename))
810
815
  log_d("%sUnzip Complete!%s\n" % (c2, cr))
811
816
  to_remove = [
812
817
  "%s/%s/ruby_example/Gemfile" % (downloads_folder, h_ie_fn),
@@ -936,7 +941,10 @@ def main(override=None, intel_for_uc=None, force_uc=None):
936
941
  f_name = "uc_driver"
937
942
  new_file = os.path.join(downloads_folder, str(f_name))
938
943
  pr_file = c3 + new_file + cr
939
- log_d("The file [%s] was saved to:\n%s\n" % (f_name, pr_file))
944
+ d_folder = os.sep.join(pr_file.split(os.sep)[:-1]) + os.sep
945
+ d_file = pr_file.split(os.sep)[-1]
946
+ d_ff = c3 + d_folder + cr + "\n" + c3 + d_file + cr
947
+ log_d("The file [%s] was saved to:\n%s\n" % (f_name, d_ff))
940
948
  log_d("Making [%s %s] executable ..." % (f_name, use_version))
941
949
  make_executable(new_file)
942
950
  log_d(
@@ -945,7 +953,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
945
953
  )
946
954
  if copy_to_path and os.path.exists(LOCAL_PATH):
947
955
  path_file = LOCAL_PATH + f_name
948
- shutil.copyfile(new_file, path_file)
956
+ shutil.copy2(new_file, path_file)
949
957
  make_executable(path_file)
950
958
  log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
951
959
  log_d("")
@@ -1034,7 +1042,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
1034
1042
  )
1035
1043
  if copy_to_path and os.path.exists(LOCAL_PATH):
1036
1044
  path_file = LOCAL_PATH + f_name
1037
- shutil.copyfile(new_file, path_file)
1045
+ shutil.copy2(new_file, path_file)
1038
1046
  make_executable(path_file)
1039
1047
  log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
1040
1048
  log_d("")
@@ -1070,7 +1078,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
1070
1078
  )
1071
1079
  if copy_to_path and os.path.exists(LOCAL_PATH):
1072
1080
  path_file = LOCAL_PATH + f_name
1073
- shutil.copyfile(new_file, path_file)
1081
+ shutil.copy2(new_file, path_file)
1074
1082
  make_executable(path_file)
1075
1083
  log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
1076
1084
  log_d("")
@@ -31,22 +31,22 @@ import sys
31
31
  def invalid_run_command(msg=None):
32
32
  exp = " ** mkchart **\n\n"
33
33
  exp += " Usage:\n"
34
- exp += " seleniumbase mkchart [FILE.py] [LANG]\n"
35
- exp += " OR sbase mkchart [FILE.py] [LANG]\n"
34
+ exp += " seleniumbase mkchart [FILE.py] [LANG]\n"
35
+ exp += " OR sbase mkchart [FILE.py] [LANG]\n"
36
36
  exp += " Example:\n"
37
- exp += " sbase mkchart new_chart.py --en\n"
37
+ exp += " sbase mkchart new_chart.py --en\n"
38
38
  exp += " Language Options:\n"
39
- exp += " --en / --English | --zh / --Chinese\n"
40
- exp += " --nl / --Dutch | --fr / --French\n"
41
- exp += " --it / --Italian | --ja / --Japanese\n"
42
- exp += " --ko / --Korean | --pt / --Portuguese\n"
43
- exp += " --ru / --Russian | --es / --Spanish\n"
39
+ exp += " --en / --English | --zh / --Chinese\n"
40
+ exp += " --nl / --Dutch | --fr / --French\n"
41
+ exp += " --it / --Italian | --ja / --Japanese\n"
42
+ exp += " --ko / --Korean | --pt / --Portuguese\n"
43
+ exp += " --ru / --Russian | --es / --Spanish\n"
44
44
  exp += " Output:\n"
45
- exp += " Creates a new SeleniumBase chart presentation.\n"
46
- exp += " If the file already exists, an error is raised.\n"
47
- exp += " By default, the slides are written in English,\n"
48
- exp += ' and use a "sky" theme with "slide" transition.\n'
49
- exp += " The chart can be used as a basic boilerplate.\n"
45
+ exp += " Creates a new SeleniumBase chart presentation.\n"
46
+ exp += " If the file already exists, an error is raised.\n"
47
+ exp += " By default, the slides are written in English,\n"
48
+ exp += ' and use a "sky" theme with "slide" transition.\n'
49
+ exp += " The chart can be used as a basic boilerplate.\n"
50
50
  if not msg:
51
51
  raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
52
52
  elif msg == "help":
@@ -62,13 +62,6 @@ def main():
62
62
  c7 = ""
63
63
  cr = ""
64
64
  if "linux" not in sys.platform:
65
- if (
66
- "win32" in sys.platform
67
- and hasattr(colorama, "just_fix_windows_console")
68
- ):
69
- colorama.just_fix_windows_console()
70
- else:
71
- colorama.init(autoreset=True)
72
65
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
73
66
  c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
74
67
  c7 = colorama.Fore.BLACK + colorama.Back.MAGENTA
@@ -27,18 +27,18 @@ import sys
27
27
  def invalid_run_command(msg=None):
28
28
  exp = " ** mkdir **\n\n"
29
29
  exp += " Usage:\n"
30
- exp += " seleniumbase mkdir [DIRECTORY] [OPTIONS]\n"
31
- exp += " OR sbase mkdir [DIRECTORY] [OPTIONS]\n"
30
+ exp += " seleniumbase mkdir [DIRECTORY] [OPTIONS]\n"
31
+ exp += " OR sbase mkdir [DIRECTORY] [OPTIONS]\n"
32
32
  exp += " Example:\n"
33
- exp += " sbase mkdir ui_tests\n"
33
+ exp += " sbase mkdir ui_tests\n"
34
34
  exp += " Options:\n"
35
- exp += " -b / --basic (Only config files. No tests added.)\n"
35
+ exp += " -b / --basic (Only config files. No tests added.)\n"
36
36
  exp += " Output:\n"
37
- exp += " Creates a new folder for running SBase scripts.\n"
38
- exp += " The new folder contains default config files,\n"
39
- exp += " sample tests for helping new users get started,\n"
40
- exp += " and Python boilerplates for setting up customized\n"
41
- exp += " test frameworks.\n"
37
+ exp += " Creates a new folder for running SBase scripts.\n"
38
+ exp += " The new folder contains default config files,\n"
39
+ exp += " sample tests for helping new users get started,\n"
40
+ exp += " and Python boilerplates for setting up customized\n"
41
+ exp += " test frameworks.\n"
42
42
  if not msg:
43
43
  raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
44
44
  elif msg == "help":
@@ -54,13 +54,6 @@ def main():
54
54
  c7 = ""
55
55
  cr = ""
56
56
  if "linux" not in sys.platform:
57
- if (
58
- "win32" in sys.platform
59
- and hasattr(colorama, "just_fix_windows_console")
60
- ):
61
- colorama.just_fix_windows_console()
62
- else:
63
- colorama.init(autoreset=True)
64
57
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
65
58
  c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
66
59
  c7 = colorama.Fore.BLACK + colorama.Back.MAGENTA
@@ -127,7 +120,7 @@ def main():
127
120
 
128
121
  data = []
129
122
  data.append("[pytest]")
130
- data.append("addopts = --capture=no -p no:cacheprovider")
123
+ data.append("addopts = --capture=tee-sys -p no:cacheprovider")
131
124
  data.append("norecursedirs = .* build dist recordings temp assets")
132
125
  data.append("filterwarnings =")
133
126
  data.append(" ignore::pytest.PytestWarning")
@@ -266,6 +259,7 @@ def main():
266
259
  data.append("report_archives")
267
260
  data.append("archived_reports")
268
261
  data.append("html_report.html")
262
+ data.append("last_report.html")
269
263
  data.append("report.html")
270
264
  data.append("report.xml")
271
265
  data.append("dashboard.html")
@@ -9,9 +9,10 @@ Example:
9
9
  sbase mkfile new_test.py
10
10
 
11
11
  Options:
12
+ --uc (UC Mode boilerplate using SB context manager)
12
13
  -b / --basic (Basic boilerplate / single-line test)
13
- -r / --rec (adds Pdb+ breakpoint for Recorder Mode)
14
- --url=URL (makes the test start on a specific page)
14
+ -r / --rec (Adds Pdb+ breakpoint for Recorder Mode)
15
+ --url=URL (Makes the test start on a specific page)
15
16
 
16
17
  Language Options:
17
18
  --en / --English | --zh / --Chinese
@@ -37,6 +38,7 @@ Output:
37
38
  and "assert_text". If using the basic boilerplate
38
39
  option, only the "open" method is included. Only the
39
40
  BaseCase format supports Languages or Recorder Mode.
41
+ UC Mode automatically uses English with SB() format.
40
42
  """
41
43
  import codecs
42
44
  import colorama
@@ -47,36 +49,38 @@ import sys
47
49
  def invalid_run_command(msg=None):
48
50
  exp = " ** mkfile **\n\n"
49
51
  exp += " Usage:\n"
50
- exp += " seleniumbase mkfile [FILE.py] [OPTIONS]\n"
51
- exp += " OR sbase mkfile [FILE.py] [OPTIONS]\n"
52
+ exp += " seleniumbase mkfile [FILE.py] [OPTIONS]\n"
53
+ exp += " OR sbase mkfile [FILE.py] [OPTIONS]\n"
52
54
  exp += " Example:\n"
53
- exp += " sbase mkfile new_test.py\n"
55
+ exp += " sbase mkfile new_test.py\n"
54
56
  exp += " Options:\n"
55
- exp += " -b / --basic (Basic boilerplate / single-line test)\n"
56
- exp += " -r / --rec (adds Pdb+ breakpoint for Recorder Mode)\n"
57
- exp += " --url=URL (makes the test start on a specific page)\n"
57
+ exp += " --uc (UC Mode boilerplate using SB context manager)\n"
58
+ exp += " -b / --basic (Basic boilerplate / single-line test)\n"
59
+ exp += " -r / --rec (Adds Pdb+ breakpoint for Recorder Mode)\n"
60
+ exp += " --url=URL (Makes the test start on a specific page)\n"
58
61
  exp += " Language Options:\n"
59
- exp += " --en / --English | --zh / --Chinese\n"
60
- exp += " --nl / --Dutch | --fr / --French\n"
61
- exp += " --it / --Italian | --ja / --Japanese\n"
62
- exp += " --ko / --Korean | --pt / --Portuguese\n"
63
- exp += " --ru / --Russian | --es / --Spanish\n"
62
+ exp += " --en / --English | --zh / --Chinese\n"
63
+ exp += " --nl / --Dutch | --fr / --French\n"
64
+ exp += " --it / --Italian | --ja / --Japanese\n"
65
+ exp += " --ko / --Korean | --pt / --Portuguese\n"
66
+ exp += " --ru / --Russian | --es / --Spanish\n"
64
67
  exp += " Syntax Formats:\n"
65
- exp += " --bc / --basecase (BaseCase class inheritance)\n"
66
- exp += " --pf / --pytest-fixture (sb pytest fixture)\n"
67
- exp += " --cf / --class-fixture (class + sb pytest fixture)\n"
68
- exp += " --cm / --context-manager (SB context manager)\n"
69
- exp += " --dc / --driver-context (DriverContext manager)\n"
70
- exp += " --dm / --driver-manager (Driver manager)\n"
68
+ exp += " --bc / --basecase (BaseCase class inheritance)\n"
69
+ exp += " --pf / --pytest-fixture (sb pytest fixture)\n"
70
+ exp += " --cf / --class-fixture (class + sb pytest fixture)\n"
71
+ exp += " --cm / --context-manager (SB context manager)\n"
72
+ exp += " --dc / --driver-context (DriverContext manager)\n"
73
+ exp += " --dm / --driver-manager (Driver manager)\n"
71
74
  exp += " Output:\n"
72
- exp += " Creates a new SBase test file with boilerplate code.\n"
73
- exp += " If the file already exists, an error is raised.\n"
74
- exp += " By default, uses English with BaseCase inheritance,\n"
75
- exp += " and creates a boilerplate with common SeleniumBase\n"
76
- exp += ' methods: "open", "type", "click", "assert_element",\n'
77
- exp += ' and "assert_text". If using the basic boilerplate\n'
78
- exp += ' option, only the "open" method is included. Only the\n'
79
- exp += " BaseCase format supports Languages or Recorder Mode.\n"
75
+ exp += " Creates a new SBase test file with boilerplate code.\n"
76
+ exp += " If the file already exists, an error is raised.\n"
77
+ exp += " By default, uses English with BaseCase inheritance,\n"
78
+ exp += " and creates a boilerplate with common SeleniumBase\n"
79
+ exp += ' methods: "open", "type", "click", "assert_element",\n'
80
+ exp += ' and "assert_text". If using the basic boilerplate\n'
81
+ exp += ' option, only the "open" method is included. Only the\n'
82
+ exp += " BaseCase format supports Languages or Recorder Mode.\n"
83
+ exp += " UC Mode automatically uses English with SB() format.\n"
80
84
  if not msg:
81
85
  raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
82
86
  elif msg == "help":
@@ -92,19 +96,13 @@ def main():
92
96
  c7 = ""
93
97
  cr = ""
94
98
  if "linux" not in sys.platform:
95
- if (
96
- "win32" in sys.platform
97
- and hasattr(colorama, "just_fix_windows_console")
98
- ):
99
- colorama.just_fix_windows_console()
100
- else:
101
- colorama.init(autoreset=True)
102
99
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
103
100
  c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
104
101
  c7 = colorama.Fore.BLACK + colorama.Back.MAGENTA
105
102
  cr = colorama.Style.RESET_ALL
106
103
 
107
104
  basic = False
105
+ use_uc = False
108
106
  help_me = False
109
107
  recorder = False
110
108
  error_msg = None
@@ -152,6 +150,9 @@ def main():
152
150
  recorder = True
153
151
  elif option == "--record" or option == "--recorder":
154
152
  recorder = True
153
+ elif use_uc:
154
+ # UC must use English & ContextManager formats
155
+ continue
155
156
  elif option == "--en" or option == "--english":
156
157
  language = "English"
157
158
  elif option == "--zh" or option == "--chinese":
@@ -184,6 +185,11 @@ def main():
184
185
  syntax = "DriverContext"
185
186
  elif option == "--dm" or option == "--driver-manager":
186
187
  syntax = "DriverManager"
188
+ elif option == "--uc":
189
+ basic = True
190
+ language = "English"
191
+ syntax = "ContextManager"
192
+ use_uc = True
187
193
  else:
188
194
  invalid_cmd = "\n===> INVALID OPTION: >> %s <<\n" % option
189
195
  invalid_cmd = invalid_cmd.replace(">> ", ">>" + c5 + " ")
@@ -319,16 +325,22 @@ def main():
319
325
  data = []
320
326
  data.append("from seleniumbase import SB")
321
327
  data.append("")
322
- data.append('with SB(browser="chrome") as sb:')
323
- data.append(
324
- ' sb.open("data:text/html,<div>Hello<br><input></div>")'
325
- )
328
+ if use_uc:
329
+ data.append('with SB(uc=True) as sb:')
330
+ else:
331
+ data.append('with SB(browser="chrome") as sb:')
332
+ if use_uc:
333
+ data.append(' url = "%s"' % url)
334
+ data.append(" sb.uc_open_with_reconnect(url, 4)")
335
+ data.append(" sb.uc_gui_click_captcha()")
336
+ else:
337
+ data.append(' sb.open("%s")' % url)
326
338
  if not basic:
327
339
  data.append(' sb.type("input", "Goodbye") # selector, text')
328
- data.append(' sb.click("html body > div") # selector')
340
+ data.append(' sb.click("html body > p") # selector')
329
341
  data.append(' sb.assert_element("input") # selector')
330
- data.append(' sb.assert_text("Hello", "div") # text, selector')
331
- data.append(' sb.highlight("div") # selector')
342
+ data.append(' sb.assert_text("Hello", "p") # text, selector')
343
+ data.append(' sb.highlight("p") # selector')
332
344
  data.append(" sb.sleep(0.5) # seconds")
333
345
  data.append("")
334
346
  new_data = data
@@ -337,7 +349,14 @@ def main():
337
349
  data.append("from seleniumbase import DriverContext")
338
350
  data.append("")
339
351
  data.append('with DriverContext(browser="chrome") as driver:')
340
- data.append(' driver.get("data:text/html,<p>Hello<br><input>")')
352
+ data.append(' driver.get("%s")' % url)
353
+ if not basic:
354
+ data.append(' driver.type("input", "Goodbye") # sel, text')
355
+ data.append(' driver.click("html body > p") # selector')
356
+ data.append(' driver.assert_element("input") # selector')
357
+ data.append(' driver.assert_text("Hello", "p") # text, sel')
358
+ data.append(' driver.highlight("p") # selector')
359
+ data.append(" driver.sleep(0.5) # seconds")
341
360
  data.append("")
342
361
  new_data = data
343
362
  elif language == "English" and syntax == "DriverManager":
@@ -346,7 +365,14 @@ def main():
346
365
  data.append("")
347
366
  data.append('driver = Driver(browser="chrome")')
348
367
  data.append("try:")
349
- data.append(' driver.get("data:text/html,<p>Hello<br><input>")')
368
+ data.append(' driver.get("%s")' % url)
369
+ if not basic:
370
+ data.append(' driver.type("input", "Goodbye") # sel, text')
371
+ data.append(' driver.click("html body > p") # selector')
372
+ data.append(' driver.assert_element("input") # selector')
373
+ data.append(' driver.assert_text("Hello", "p") # text, sel')
374
+ data.append(' driver.highlight("p") # selector')
375
+ data.append(" driver.sleep(0.5) # seconds")
350
376
  data.append("finally:")
351
377
  data.append(" driver.quit()")
352
378
  data.append("")
@@ -31,22 +31,22 @@ import sys
31
31
  def invalid_run_command(msg=None):
32
32
  exp = " ** mkpres **\n\n"
33
33
  exp += " Usage:\n"
34
- exp += " seleniumbase mkpres [FILE.py] [LANG]\n"
35
- exp += " OR sbase mkpres [FILE.py] [LANG]\n"
34
+ exp += " seleniumbase mkpres [FILE.py] [LANG]\n"
35
+ exp += " OR sbase mkpres [FILE.py] [LANG]\n"
36
36
  exp += " Example:\n"
37
- exp += " sbase mkpres new_presentation.py --en\n"
37
+ exp += " sbase mkpres new_presentation.py --en\n"
38
38
  exp += " Language Options:\n"
39
- exp += " --en / --English | --zh / --Chinese\n"
40
- exp += " --nl / --Dutch | --fr / --French\n"
41
- exp += " --it / --Italian | --ja / --Japanese\n"
42
- exp += " --ko / --Korean | --pt / --Portuguese\n"
43
- exp += " --ru / --Russian | --es / --Spanish\n"
39
+ exp += " --en / --English | --zh / --Chinese\n"
40
+ exp += " --nl / --Dutch | --fr / --French\n"
41
+ exp += " --it / --Italian | --ja / --Japanese\n"
42
+ exp += " --ko / --Korean | --pt / --Portuguese\n"
43
+ exp += " --ru / --Russian | --es / --Spanish\n"
44
44
  exp += " Output:\n"
45
- exp += " Creates a new presentation with 3 example slides.\n"
46
- exp += " If the file already exists, an error is raised.\n"
47
- exp += " By default, the slides are written in English,\n"
48
- exp += ' and use "serif" theme with "slide" transition.\n'
49
- exp += " The slides can be used as a basic boilerplate.\n"
45
+ exp += " Creates a new presentation with 3 example slides.\n"
46
+ exp += " If the file already exists, an error is raised.\n"
47
+ exp += " By default, the slides are written in English,\n"
48
+ exp += ' and use "serif" theme with "slide" transition.\n'
49
+ exp += " The slides can be used as a basic boilerplate.\n"
50
50
  if not msg:
51
51
  raise Exception("INVALID RUN COMMAND!\n\n%s" % exp)
52
52
  elif msg == "help":
@@ -62,13 +62,6 @@ def main():
62
62
  c7 = ""
63
63
  cr = ""
64
64
  if "linux" not in sys.platform:
65
- if (
66
- "win32" in sys.platform
67
- and hasattr(colorama, "just_fix_windows_console")
68
- ):
69
- colorama.just_fix_windows_console()
70
- else:
71
- colorama.init(autoreset=True)
72
65
  c1 = colorama.Fore.BLUE + colorama.Back.LIGHTCYAN_EX
73
66
  c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
74
67
  c7 = colorama.Fore.BLACK + colorama.Back.MAGENTA