seleniumbase 4.24.11__py3-none-any.whl → 4.33.15__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) 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/log_helper.py +42 -27
  25. seleniumbase/core/mysql.py +1 -4
  26. seleniumbase/core/proxy_helper.py +35 -30
  27. seleniumbase/core/recorder_helper.py +24 -5
  28. seleniumbase/core/sb_cdp.py +1951 -0
  29. seleniumbase/core/sb_driver.py +162 -8
  30. seleniumbase/core/settings_parser.py +6 -0
  31. seleniumbase/core/style_sheet.py +10 -0
  32. seleniumbase/extensions/recorder.zip +0 -0
  33. seleniumbase/fixtures/base_case.py +1225 -614
  34. seleniumbase/fixtures/constants.py +10 -1
  35. seleniumbase/fixtures/js_utils.py +171 -144
  36. seleniumbase/fixtures/page_actions.py +177 -13
  37. seleniumbase/fixtures/page_utils.py +25 -53
  38. seleniumbase/fixtures/shared_utils.py +97 -11
  39. seleniumbase/js_code/active_css_js.py +1 -1
  40. seleniumbase/js_code/recorder_js.py +1 -1
  41. seleniumbase/plugins/base_plugin.py +2 -3
  42. seleniumbase/plugins/driver_manager.py +340 -65
  43. seleniumbase/plugins/pytest_plugin.py +276 -47
  44. seleniumbase/plugins/sb_manager.py +412 -99
  45. seleniumbase/plugins/selenium_plugin.py +122 -17
  46. seleniumbase/translate/translator.py +0 -7
  47. seleniumbase/undetected/__init__.py +59 -52
  48. seleniumbase/undetected/cdp.py +0 -1
  49. seleniumbase/undetected/cdp_driver/__init__.py +1 -0
  50. seleniumbase/undetected/cdp_driver/_contradict.py +110 -0
  51. seleniumbase/undetected/cdp_driver/browser.py +829 -0
  52. seleniumbase/undetected/cdp_driver/cdp_util.py +458 -0
  53. seleniumbase/undetected/cdp_driver/config.py +334 -0
  54. seleniumbase/undetected/cdp_driver/connection.py +639 -0
  55. seleniumbase/undetected/cdp_driver/element.py +1168 -0
  56. seleniumbase/undetected/cdp_driver/tab.py +1323 -0
  57. seleniumbase/undetected/dprocess.py +4 -7
  58. seleniumbase/undetected/options.py +6 -8
  59. seleniumbase/undetected/patcher.py +11 -13
  60. seleniumbase/undetected/reactor.py +0 -1
  61. seleniumbase/undetected/webelement.py +16 -3
  62. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/LICENSE +1 -1
  63. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/METADATA +299 -252
  64. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/RECORD +67 -69
  65. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/WHEEL +1 -1
  66. sbase/ReadMe.txt +0 -2
  67. seleniumbase/ReadMe.md +0 -25
  68. seleniumbase/common/ReadMe.md +0 -71
  69. seleniumbase/console_scripts/ReadMe.md +0 -731
  70. seleniumbase/drivers/ReadMe.md +0 -27
  71. seleniumbase/extensions/ReadMe.md +0 -12
  72. seleniumbase/masterqa/ReadMe.md +0 -61
  73. seleniumbase/resources/ReadMe.md +0 -31
  74. seleniumbase/resources/favicon.ico +0 -0
  75. seleniumbase/utilities/selenium_grid/ReadMe.md +0 -84
  76. seleniumbase/utilities/selenium_ide/ReadMe.md +0 -111
  77. {seleniumbase-4.24.11.dist-info → seleniumbase-4.33.15.dist-info}/entry_points.txt +0 -0
  78. {seleniumbase-4.24.11.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