Skip to content

Commit

Permalink
Merge pull request #3454 from seleniumbase/add-shortcuts-and-error-ha…
Browse files Browse the repository at this point in the history
…ndling

Add shortcuts and error-handling
  • Loading branch information
mdmintz authored Jan 25, 2025
2 parents 36bdf14 + 6343194 commit 270d409
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 5 deletions.
26 changes: 24 additions & 2 deletions help_docs/customizing_test_runs.md
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,8 @@ pytest --headless -n8 --dashboard --html=report.html -v --rs --crumbs

The above not only runs tests in parallel processes, but it also tells tests in the same process to share the same browser session, runs the tests in headless mode, displays the full name of each test on a separate line, creates a real-time dashboard of the test results, and creates a full report after all tests complete.

--------

🎛️ For extra speed, run your tests using `chrome-headless-shell`:

First, get `chrome-headless-shell` if you don't already have it:
Expand All @@ -345,10 +347,10 @@ First, get `chrome-headless-shell` if you don't already have it:
sbase get chs
```

Then, run scripts with `binary_location` / `bl` set to `"chs"`:
Then, run scripts with `--chs` / `chs=True`:

```bash
pytest --bl="chs" -n8 --dashboard --html=report.html -v --rs
pytest --chs -n8 --dashboard --html=report.html -v --rs
```

That makes your tests run very quickly in headless mode.
Expand Down Expand Up @@ -486,6 +488,26 @@ With the `SB()` and `Driver()` formats, the binary location is set via the `bina

--------

🎛️ To use the special `Chrome for Testing` binary:

```bash
sbase get cft
```

Then, run scripts with `--cft` / `cft=True`:

```bash
pytest --cft -n8 --dashboard --html=report.html -v --rs --headless
```

--------

(Note that `--chs` / `chs=True` activates `Chrome-Headless-Shell`)

`Chrome-Headless-Shell` is the fastest version of Chrome, designed specifically for headless automation. (This mode is NOT compatible with UC Mode!)

--------

<h3><img src="https://seleniumbase.github.io/img/green_logo.png" title="SeleniumBase" width="32" /> Customizing default settings:</h3>

🎛️ An easy way to override [seleniumbase/config/settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py) is by using a custom settings file.
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ packaging>=24.2
setuptools~=70.2;python_version<"3.10"
setuptools>=75.8.0;python_version>="3.10"
wheel>=0.45.1
attrs>=24.3.0
attrs>=25.1.0
certifi>=2024.12.14
exceptiongroup>=1.2.2
websockets~=13.1;python_version<"3.9"
Expand Down
2 changes: 1 addition & 1 deletion seleniumbase/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# seleniumbase package
__version__ = "4.34.2"
__version__ = "4.34.3"
7 changes: 7 additions & 0 deletions seleniumbase/core/browser_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -2651,6 +2651,13 @@ def get_driver(
if headless2 and browser_name == constants.Browser.FIREFOX:
headless2 = False # Only for Chromium
headless = True
if (
is_using_uc(undetectable, browser_name)
and binary_location
and isinstance(binary_location, str)
and binary_location.lower() == "chs"
):
raise Exception("UC Mode can't be used with Chrome-Headless-Shell!")
if (
binary_location
and isinstance(binary_location, str)
Expand Down
10 changes: 10 additions & 0 deletions seleniumbase/plugins/driver_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ def Driver(
guest=None, # Shortcut / Duplicate of "guest_mode".
wire=None, # Shortcut / Duplicate of "use_wire".
pls=None, # Shortcut / Duplicate of "page_load_strategy".
cft=None, # Use "Chrome for Testing"
chs=None, # Use "Chrome-Headless-Shell"
):
"""
* SeleniumBase Driver as a Python Context Manager or a returnable object. *
Expand Down Expand Up @@ -550,6 +552,14 @@ def Driver(
if arg.startswith("--bl="):
binary_location = arg.split("--bl=")[1]
break
if cft and not binary_location:
binary_location = "cft"
elif chs and not binary_location:
binary_location = "chs"
if "--cft" in sys_argv and not binary_location:
binary_location = "cft"
elif "--chs" in sys_argv and not binary_location:
binary_location = "chs"
if (
binary_location
and binary_location.lower() == "chs"
Expand Down
18 changes: 18 additions & 0 deletions seleniumbase/plugins/pytest_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,20 @@ def pytest_addoption(parser):
default=False,
help="""Shortcut for --browser=safari""",
)
parser.addoption(
"--cft",
action="store_true",
dest="use_cft",
default=False,
help="""Shortcut for using `Chrome for Testing`""",
)
parser.addoption(
"--chs",
action="store_true",
dest="use_chs",
default=False,
help="""Shortcut for using `Chrome-Headless-Shell`""",
)
parser.addoption(
"--with-selenium",
action="store_true",
Expand Down Expand Up @@ -1575,6 +1589,10 @@ def pytest_configure(config):
sb_config.extension_dir = config.getoption("extension_dir")
sb_config.disable_features = config.getoption("disable_features")
sb_config.binary_location = config.getoption("binary_location")
if config.getoption("use_cft") and not sb_config.binary_location:
sb_config.binary_location = "cft"
elif config.getoption("use_chs") and not sb_config.binary_location:
sb_config.binary_location = "chs"
if (
sb_config.binary_location
and sb_config.binary_location.lower() == "chs"
Expand Down
10 changes: 10 additions & 0 deletions seleniumbase/plugins/sb_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ def SB(
pls=None, # Shortcut / Duplicate of "page_load_strategy".
sjw=None, # Shortcut / Duplicate of "skip_js_waits".
wfa=None, # Shortcut / Duplicate of "wait_for_angularjs".
cft=None, # Use "Chrome for Testing"
chs=None, # Use "Chrome-Headless-Shell"
save_screenshot=None, # Save a screenshot at the end of each test.
no_screenshot=None, # No screenshots saved unless tests directly ask it.
page_load_strategy=None, # Set Chrome PLS to "normal", "eager", or "none".
Expand Down Expand Up @@ -588,6 +590,14 @@ def SB(
if arg.startswith("--bl="):
binary_location = arg.split("--bl=")[1]
break
if cft and not binary_location:
binary_location = "cft"
elif chs and not binary_location:
binary_location = "chs"
if "--cft" in sys_argv and not binary_location:
binary_location = "cft"
elif "--chs" in sys_argv and not binary_location:
binary_location = "chs"
if (
binary_location
and binary_location.lower() == "chs"
Expand Down
18 changes: 18 additions & 0 deletions seleniumbase/plugins/selenium_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,20 @@ def options(self, parser, env):
default=False,
help="""Shortcut for --browser=safari""",
)
parser.addoption(
"--cft",
action="store_true",
dest="use_cft",
default=False,
help="""Shortcut for using `Chrome for Testing`""",
)
parser.addoption(
"--chs",
action="store_true",
dest="use_chs",
default=False,
help="""Shortcut for using `Chrome-Headless-Shell`""",
)
parser.addoption(
"--cap_file",
"--cap-file",
Expand Down Expand Up @@ -1203,6 +1217,10 @@ def beforeTest(self, test):
test.test.extension_dir = self.options.extension_dir
test.test.disable_features = self.options.disable_features
test.test.binary_location = self.options.binary_location
if self.options.use_cft and not test.test.binary_location:
test.test.binary_location = "cft"
elif self.options.use_chs and not test.test.binary_location:
test.test.binary_location = "chs"
if (
test.test.binary_location
and test.test.binary_location.lower() == "chs"
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@
'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues
'setuptools>=75.8.0;python_version>="3.10"',
'wheel>=0.45.1',
'attrs>=24.3.0',
'attrs>=25.1.0',
"certifi>=2024.12.14",
"exceptiongroup>=1.2.2",
'websockets~=13.1;python_version<"3.9"',
Expand Down

0 comments on commit 270d409

Please sign in to comment.