' % choice
+ if choice == "YES":
+ message += "Wonderful! Let's continue with the next example..."
+ else:
+ message += "You can learn more from SeleniumBase Docs..."
+ choice = self.get_jqc_button_input(message, ["OK"], options)
+
+ self.open("https://seleniumbase.io")
+ self.set_jqc_theme("light", color="green", width="38%")
+ message = "This is the SeleniumBase Docs website!
"
+ message += "What would you like to search for? "
+ text = self.get_jqc_text_input(message, ["Search"])
+ self.update_text('input[aria-label="Search"]', text + "\n")
+ self.wait_for_ready_state_complete()
+ self.set_jqc_theme("bootstrap", color="red", width="32%")
+ if self.is_text_visible("No matching documents", ".md-search-result"):
+ self.get_jqc_button_input("Your search had no results!", ["OK"])
+ elif self.is_element_visible("a.md-search-result__link"):
+ self.click("a.md-search-result__link")
+ self.set_jqc_theme("bootstrap", color="green", width="32%")
+ self.get_jqc_button_input("You found search results!", ["OK"])
+ elif self.is_text_visible("Type to start searching", "div.md-search"):
+ self.get_jqc_button_input("You did not do a search!", ["OK"])
+ else:
+ self.get_jqc_button_input("We're not sure what happened.", ["OK"])
+
+ self.open("https://seleniumbase.io/help_docs/ReadMe/")
+ self.highlight("h1")
+ self.highlight_click('a:contains("Running Example Tests")')
+ self.highlight("h1")
+
+ self.set_jqc_theme("bootstrap", color="green", width="52%")
+ message = 'See the "SeleniumBase/examples" section for more info!'
+ self.get_jqc_button_input(message, ["OK"])
+
+ self.set_jqc_theme("bootstrap", color="purple", width="56%")
+ message = "Now let's combine form inputs with multiple button options!"
+ message += "
"
+ message += "Pick something to search. Then pick the site to search on."
+ buttons = ["XKCD.com", "Wikipedia.org"]
+ text, choice = self.get_jqc_form_inputs(message, buttons)
+ if choice == "XKCD.com":
+ self.open("https://relevant-xkcd.github.io/")
+ else:
+ self.open("https://en.wikipedia.org/wiki/Main_Page")
+ self.highlight_update_text('input[name="search"]', text + "\n")
+ self.wait_for_ready_state_complete()
+ self.highlight("body")
+ self.reset_jqc_theme()
+ self.get_jqc_button_input("Here are your results.", ["OK"])
+ message = "
You've reached the end of this tutorial!
"
+ message += "Thanks for learning about SeleniumBase Dialog Boxes! "
+ message += " Check out the SeleniumBase page on GitHub for more!"
+ self.set_jqc_theme("modern", color="purple", width="56%")
+ self.get_jqc_button_input(message, ["Goodbye!"])
From 3c260e00b1e5e62bd9f78ef4e3c8abc078b2ee82 Mon Sep 17 00:00:00 2001
From: Michael Mintz
Date: Mon, 23 Aug 2021 23:12:56 -0400
Subject: [PATCH 18/23] Add the ReadMe for SeleniumBase Dialog Boxes
---
examples/dialog_boxes/ReadMe.md | 180 ++++++++++++++++++++++++++++++++
1 file changed, 180 insertions(+)
create mode 100755 examples/dialog_boxes/ReadMe.md
diff --git a/examples/dialog_boxes/ReadMe.md b/examples/dialog_boxes/ReadMe.md
new file mode 100755
index 00000000000..a1eb26adb8b
--- /dev/null
+++ b/examples/dialog_boxes/ReadMe.md
@@ -0,0 +1,180 @@
+
+
+
π Dialog Boxes π
+
+SeleniumBase Dialog Boxes let your users provide input in the middle of automation scripts.
+
+* This feature utilizes the [jquery-confirm](https://craftpip.github.io/jquery-confirm/) library.
+* A Python API is used to call the JavaScript API.
+
+
+
+
+
+```python
+self.open("https://xkcd.com/1920/")
+skip_button = ["SKIP", "red"] # Can be a [text, color] list or tuple.
+buttons = ["Fencing", "Football", "Metaball", "Go/Chess", skip_button]
+message = "Choose a sport:"
+choice = self.get_jqc_button_input(message, buttons)
+if choice == "Fencing":
+ self.open("https://xkcd.com/1424/")
+```
+
+* You can create forms that include buttons and input fields.
+
+
Here's a simple form with only buttons as input:
+
+```python
+choice = self.get_jqc_button_input("Ready?", ["YES", "NO"])
+print(choice) # This prints "YES" or "NO"
+
+# You may want to customize the color of buttons:
+buttons = [("YES", "green"), ("NO", "red")]
+choice = self.get_jqc_button_input("Ready?", buttons)
+```
+
+
Here's a simple form with an input field:
+
+```python
+text = self.get_jqc_text_input("Enter text:", ["Search"])
+print(text) # This prints the text entered
+```
+
+
This form has an input field and buttons:
+
+```python
+message = "Type your name and choose a language:"
+buttons = ["Python", "JavaScript"]
+text, choice = self.get_jqc_form_inputs(message, buttons)
+print("Your name is: %s" % text)
+print("You picked %s!" % choice)
+```
+
+
+
+```python
+self.get_jqc_button_input(message, buttons, options=None)
+"""
+Pop up a jquery-confirm box and return the text of the button clicked.
+If running in headless mode, the last button text is returned.
+@Params
+message: The message to display in the jquery-confirm dialog.
+buttons: A list of tuples for text and color.
+ Example: [("Yes!", "green"), ("No!", "red")]
+ Available colors: blue, green, red, orange, purple, default, dark.
+ A simple text string also works: "My Button". (Uses default color.)
+options: A list of tuples for options to set.
+ Example: [("theme", "bootstrap"), ("width", "450px")]
+ Available theme options: bootstrap, modern, material, supervan,
+ light, dark, and seamless.
+ Available colors: (For the BORDER color, NOT the button color.)
+ "blue", "default", "green", "red", "purple", "orange", "dark".
+ Example option for changing the border color: ("color", "default")
+ Width can be set using percent or pixels. Eg: "36.0%", "450px".
+"""
+
+self.get_jqc_text_input(message, button=None, options=None)
+"""
+Pop up a jquery-confirm box and return the text submitted by the input.
+If running in headless mode, the text returned is "" by default.
+@Params
+message: The message to display in the jquery-confirm dialog.
+button: A 2-item list or tuple for text and color. Or just the text.
+ Example: ["Submit", "blue"] -> (default button if not specified)
+ Available colors: blue, green, red, orange, purple, default, dark.
+ A simple text string also works: "My Button". (Uses default color.)
+options: A list of tuples for options to set.
+ Example: [("theme", "bootstrap"), ("width", "450px")]
+ Available theme options: bootstrap, modern, material, supervan,
+ light, dark, and seamless.
+ Available colors: (For the BORDER color, NOT the button color.)
+ "blue", "default", "green", "red", "purple", "orange", "dark".
+ Example option for changing the border color: ("color", "default")
+ Width can be set using percent or pixels. Eg: "36.0%", "450px".
+"""
+
+self.get_jqc_form_inputs(message, buttons, options=None)
+"""
+Pop up a jquery-confirm box and return the input/button texts as tuple.
+If running in headless mode, returns the ("", buttons[-1][0]) tuple.
+@Params
+message: The message to display in the jquery-confirm dialog.
+buttons: A list of tuples for text and color.
+ Example: [("Yes!", "green"), ("No!", "red")]
+ Available colors: blue, green, red, orange, purple, default, dark.
+ A simple text string also works: "My Button". (Uses default color.)
+options: A list of tuples for options to set.
+ Example: [("theme", "bootstrap"), ("width", "450px")]
+ Available theme options: bootstrap, modern, material, supervan,
+ light, dark, and seamless.
+ Available colors: (For the BORDER color, NOT the button color.)
+ "blue", "default", "green", "red", "purple", "orange", "dark".
+ Example option for changing the border color: ("color", "default")
+ Width can be set using percent or pixels. Eg: "36.0%", "450px".
+"""
+
+self.set_jqc_theme(theme, color=None, width=None)
+""" Sets the default jquery-confirm theme and width (optional).
+Available themes: "bootstrap", "modern", "material", "supervan",
+ "light", "dark", and "seamless".
+Available colors: (This sets the BORDER color, NOT the button color.)
+ "blue", "default", "green", "red", "purple", "orange", "dark".
+Width can be set using percent or pixels. Eg: "36.0%", "450px".
+"""
+
+self.reset_jqc_theme()
+""" Resets the jqc theme settings to factory defaults. """
+
+self.activate_jquery_confirm() # Automatic for jqc methods
+""" See https://craftpip.github.io/jquery-confirm/ for usage. """
+```
+
+--------
+
+
β π Automated/Manual Hybrid Mode (MasterQA)
+
MasterQA uses SeleniumBase Dialog Boxes to speed up manual testing by having automation perform all the browser actions while the manual tester handles validation. See the MasterQA GitHub page for examples.
From 7e20529bf39dd405753851c65ee1266b02e893c9 Mon Sep 17 00:00:00 2001
From: Michael Mintz
Date: Mon, 23 Aug 2021 23:13:27 -0400
Subject: [PATCH 19/23] Update deploy dependencies
---
setup.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index 4879051f5ba..a2aea724b23 100755
--- a/setup.py
+++ b/setup.py
@@ -50,7 +50,7 @@
print("\n*** Installing twine: *** (Required for PyPI uploads)\n")
os.system("python -m pip install --upgrade 'twine>=1.15.0'")
print("\n*** Installing tqdm: *** (Required for PyPI uploads)\n")
- os.system("python -m pip install --upgrade 'tqdm>=4.62.0'")
+ os.system("python -m pip install --upgrade 'tqdm>=4.62.2'")
print("\n*** Publishing The Release to PyPI: ***\n")
os.system("python -m twine upload dist/*") # Requires ~/.pypirc Keys
print("\n*** The Release was PUBLISHED SUCCESSFULLY to PyPI! :) ***\n")
From d290ff89b7ef048bbd542f7ea4869ea0d841c045 Mon Sep 17 00:00:00 2001
From: Michael Mintz
Date: Tue, 24 Aug 2021 00:04:25 -0400
Subject: [PATCH 20/23] Update Python dependencies
---
requirements.txt | 34 ++++++++++++++++++----------------
setup.py | 34 ++++++++++++++++++----------------
2 files changed, 36 insertions(+), 32 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 4eacb7c9ab8..bc47c04756d 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
pip>=20.3.4;python_version<"3.6"
-pip>=21.2.3;python_version>="3.6"
+pip>=21.2.4;python_version>="3.6"
packaging>=20.9;python_version<"3.6"
packaging>=21.0;python_version>="3.6"
typing-extensions>=3.10.0.0
@@ -15,16 +15,16 @@ sortedcontainers==2.4.0
certifi>=2021.5.30
six==1.16.0
nose==1.3.7
-ipdb==0.13.4;python_version<"3.6"
-ipdb==0.13.9;python_version>="3.6"
+ipdb==0.13.4;python_version<"3.5"
+ipdb==0.13.9;python_version>="3.5"
parso==0.7.1;python_version<"3.6"
parso==0.8.2;python_version>="3.6"
jedi==0.17.2;python_version<"3.6"
jedi==0.18.0;python_version>="3.6"
idna==2.10;python_version<"3.6"
idna==3.2;python_version>="3.6"
-chardet==3.0.4;python_version<"3.6"
-chardet==4.0.0;python_version>="3.6"
+chardet==3.0.4;python_version<"3.5"
+chardet==4.0.0;python_version>="3.5"
charset-normalizer==2.0.4;python_version>="3.6"
urllib3==1.26.6
requests==2.26.0;python_version<"3.5"
@@ -36,8 +36,8 @@ more-itertools==5.0.0;python_version<"3.5"
more-itertools==8.8.0;python_version>="3.5"
cssselect==1.1.0
filelock==3.0.12
-fasteners==0.16;python_version<"3.6"
-fasteners==0.16.3;python_version>="3.6"
+fasteners==0.16;python_version<"3.5"
+fasteners==0.16.3;python_version>="3.5"
execnet==1.9.0
pluggy==0.13.1
py==1.8.1;python_version<"3.5"
@@ -60,24 +60,25 @@ pytest-xdist==2.3.0;python_version>="3.6"
parameterized==0.8.1
sbvirtualdisplay==1.0.0
soupsieve==1.9.6;python_version<"3.5"
-soupsieve==2.0.1;python_version>="3.5" and python_version<"3.6"
+soupsieve==2.1;python_version>="3.5" and python_version<"3.6"
soupsieve==2.2.1;python_version>="3.6"
beautifulsoup4==4.9.3
cryptography==2.9.2;python_version<"3.5"
-cryptography==3.0;python_version>="3.5" and python_version<"3.6"
+cryptography==3.2.1;python_version>="3.5" and python_version<"3.6"
cryptography==3.4.7;python_version>="3.6"
-pyopenssl==19.1.0;python_version<"3.6"
-pyopenssl==20.0.1;python_version>="3.6"
+pyopenssl==19.1.0;python_version<"3.5"
+pyopenssl==20.0.1;python_version>="3.5"
pygments==2.5.2;python_version<"3.5"
-pygments==2.9.0;python_version>="3.5"
+pygments==2.10.0;python_version>="3.5"
traitlets==4.3.3;python_version<"3.7"
traitlets==5.0.5;python_version>="3.7"
-prompt-toolkit==1.0.18;python_version<"3.6"
-prompt-toolkit==3.0.19;python_version>="3.6"
+prompt-toolkit==1.0.18;python_version<"3.5"
+prompt-toolkit==2.0.10;python_version>="3.5" and python_version<"3.6.2"
+prompt-toolkit==3.0.20;python_version>="3.6.2"
decorator==4.4.2;python_version<"3.5"
decorator==5.0.9;python_version>="3.5"
ipython==5.10.0;python_version<"3.5"
-ipython==6.5.0;python_version>="3.5" and python_version<"3.6"
+ipython==7.9.0;python_version>="3.5" and python_version<"3.6"
ipython==7.16.1;python_version>="3.6" and python_version<"3.7"
ipython==7.26.0;python_version>="3.7"
matplotlib-inline==0.1.2;python_version>="3.7"
@@ -85,7 +86,8 @@ colorama==0.4.4
platformdirs==2.0.2;python_version<"3.6"
platformdirs==2.2.0;python_version>="3.6"
pathlib2==2.3.5;python_version<"3.5"
-importlib-metadata==2.0.0;python_version<"3.6"
+importlib-metadata==2.0.0;python_version<"3.5"
+importlib-metadata==2.1.1;python_version>="3.5" and python_version<"3.6"
virtualenv>=20.7.2
pymysql==0.10.1;python_version<"3.6"
pymysql==1.0.2;python_version>="3.6"
diff --git a/setup.py b/setup.py
index a2aea724b23..57c52f6d624 100755
--- a/setup.py
+++ b/setup.py
@@ -114,7 +114,7 @@
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
install_requires=[
'pip>=20.3.4;python_version<"3.6"',
- 'pip>=21.2.3;python_version>="3.6"',
+ 'pip>=21.2.4;python_version>="3.6"',
'packaging>=20.9;python_version<"3.6"',
'packaging>=21.0;python_version>="3.6"',
"typing-extensions>=3.10.0.0",
@@ -130,16 +130,16 @@
"certifi>=2021.5.30",
"six==1.16.0",
"nose==1.3.7",
- 'ipdb==0.13.4;python_version<"3.6"',
- 'ipdb==0.13.9;python_version>="3.6"',
+ 'ipdb==0.13.4;python_version<"3.5"',
+ 'ipdb==0.13.9;python_version>="3.5"',
'parso==0.7.1;python_version<"3.6"',
'parso==0.8.2;python_version>="3.6"',
'jedi==0.17.2;python_version<"3.6"',
'jedi==0.18.0;python_version>="3.6"',
'idna==2.10;python_version<"3.6"', # Must stay in sync with "requests"
'idna==3.2;python_version>="3.6"', # Must stay in sync with "requests"
- 'chardet==3.0.4;python_version<"3.6"', # Stay in sync with "requests"
- 'chardet==4.0.0;python_version>="3.6"', # Stay in sync with "requests"
+ 'chardet==3.0.4;python_version<"3.5"', # Stay in sync with "requests"
+ 'chardet==4.0.0;python_version>="3.5"', # Stay in sync with "requests"
'charset-normalizer==2.0.4;python_version>="3.6"', # Sync "requests"
"urllib3==1.26.6", # Must stay in sync with "requests"
'requests==2.26.0;python_version<"3.5"',
@@ -151,8 +151,8 @@
'more-itertools==8.8.0;python_version>="3.5"',
"cssselect==1.1.0",
"filelock==3.0.12",
- 'fasteners==0.16;python_version<"3.6"',
- 'fasteners==0.16.3;python_version>="3.6"',
+ 'fasteners==0.16;python_version<"3.5"',
+ 'fasteners==0.16.3;python_version>="3.5"',
"execnet==1.9.0",
"pluggy==0.13.1",
'py==1.8.1;python_version<"3.5"',
@@ -175,24 +175,25 @@
"parameterized==0.8.1",
"sbvirtualdisplay==1.0.0",
'soupsieve==1.9.6;python_version<"3.5"',
- 'soupsieve==2.0.1;python_version>="3.5" and python_version<"3.6"',
+ 'soupsieve==2.1;python_version>="3.5" and python_version<"3.6"',
'soupsieve==2.2.1;python_version>="3.6"',
"beautifulsoup4==4.9.3",
'cryptography==2.9.2;python_version<"3.5"',
- 'cryptography==3.0;python_version>="3.5" and python_version<"3.6"',
+ 'cryptography==3.2.1;python_version>="3.5" and python_version<"3.6"',
'cryptography==3.4.7;python_version>="3.6"',
- 'pyopenssl==19.1.0;python_version<"3.6"',
- 'pyopenssl==20.0.1;python_version>="3.6"',
+ 'pyopenssl==19.1.0;python_version<"3.5"',
+ 'pyopenssl==20.0.1;python_version>="3.5"',
'pygments==2.5.2;python_version<"3.5"',
- 'pygments==2.9.0;python_version>="3.5"',
+ 'pygments==2.10.0;python_version>="3.5"',
'traitlets==4.3.3;python_version<"3.7"',
'traitlets==5.0.5;python_version>="3.7"',
- 'prompt-toolkit==1.0.18;python_version<"3.6"',
- 'prompt-toolkit==3.0.19;python_version>="3.6"',
+ 'prompt-toolkit==1.0.18;python_version<"3.5"',
+ 'prompt-toolkit==2.0.10;python_version>="3.5" and python_version<"3.6.2"', # noqa: E501
+ 'prompt-toolkit==3.0.20;python_version>="3.6.2"',
'decorator==4.4.2;python_version<"3.5"',
'decorator==5.0.9;python_version>="3.5"',
'ipython==5.10.0;python_version<"3.5"',
- 'ipython==6.5.0;python_version>="3.5" and python_version<"3.6"',
+ 'ipython==7.9.0;python_version>="3.5" and python_version<"3.6"',
'ipython==7.16.1;python_version>="3.6" and python_version<"3.7"',
'ipython==7.26.0;python_version>="3.7"',
'matplotlib-inline==0.1.2;python_version>="3.7"',
@@ -200,7 +201,8 @@
'platformdirs==2.0.2;python_version<"3.6"',
'platformdirs==2.2.0;python_version>="3.6"',
'pathlib2==2.3.5;python_version<"3.5"', # Sync with "virtualenv"
- 'importlib-metadata==2.0.0;python_version<"3.6"', # Sync "virtualenv"
+ 'importlib-metadata==2.0.0;python_version<"3.5"',
+ 'importlib-metadata==2.1.1;python_version>="3.5" and python_version<"3.6"', # noqa: E501
"virtualenv>=20.7.2", # Sync with importlib-metadata and pathlib2
'pymysql==0.10.1;python_version<"3.6"',
'pymysql==1.0.2;python_version>="3.6"',
From 36fad844797c9969e720ee91f348f367afba4da1 Mon Sep 17 00:00:00 2001
From: Michael Mintz
Date: Tue, 24 Aug 2021 00:05:04 -0400
Subject: [PATCH 21/23] Update the docs
---
README.md | 4 ++--
help_docs/ReadMe.md | 20 ++++++++++----------
help_docs/features_list.md | 6 +++---
help_docs/method_summary.md | 26 +++++++++++++++++++++++++-
4 files changed, 40 insertions(+), 16 deletions(-)
diff --git a/README.md b/README.md
index 4b26326ee05..231ae705148 100755
--- a/README.md
+++ b/README.md
@@ -41,8 +41,8 @@
πΊοΈ Tours |
πΆ Charts |
π° Present |
-πΌοΈ VisualTest |
-π MasterQA
+π DialogBox |
+πΌοΈ VisualTest
--------
diff --git a/help_docs/features_list.md b/help_docs/features_list.md
index 7fd31240ec7..db531edc26a 100755
--- a/help_docs/features_list.md
+++ b/help_docs/features_list.md
@@ -28,16 +28,16 @@
* Has a [global config file](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py) for configuring settings as needed.
* Includes a tool for [creating interactive web presentations](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md).
* Includes [Chart Maker](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md), a tool for creating interactive charts.
+* Includes a [dialog box builder](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/dialog_boxes/ReadMe.md) to allow user-input during automation.
* Includes a [website tour builder](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md) for creating interactive walkthroughs.
-* Has a tool to [export Katalon Recorder scripts into SeleniumBase format](https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/katalon/ReadMe.md).
+* Includes integrations for [GitHub Actions](https://seleniumbase.io/integrations/github/workflows/ReadMe/), [Google Cloud](https://github.com/seleniumbase/SeleniumBase/tree/master/integrations/google_cloud/ReadMe.md), [Azure](https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md), [S3](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/plugins/s3_logging_plugin.py), and [Docker](https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/docker/ReadMe.md).
* Can handle Google Authenticator logins with [Python's one-time password library](https://pyotp.readthedocs.io/en/latest/).
* Can load and make assertions on PDF files from websites or the local file system.
* Is backwards-compatible with Python [WebDriver](https://www.selenium.dev/projects/) methods. (Use: ``self.driver``)
* Can execute JavaScript code from Python calls. (Use: ``self.execute_script()``)
* Can pierce through Shadow DOM selectors. (Add ``::shadow`` to CSS fragments.)
-* Includes integrations for [MySQL](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/core/testcase_manager.py), [Selenium Grid](https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_grid), [Azure](https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md), [GCP](https://github.com/seleniumbase/SeleniumBase/tree/master/integrations/google_cloud/ReadMe.md), [AWS](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/plugins/s3_logging_plugin.py), and [Docker](https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/docker/ReadMe.md).
* Includes a hybrid-automation solution, [MasterQA](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/masterqa/ReadMe.md), for speeding up manual testing.
-* Includes a tool for [converting Selenium IDE recordings](https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_ide) into SeleniumBase scripts.
+* Includes a tool to [convert Katalon & Selenium IDE recordings](https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/katalon/ReadMe.md) into SeleniumBase scripts.
* Includes useful [Python decorators and password obfuscation methods](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/common/ReadMe.md).
--------
diff --git a/help_docs/method_summary.md b/help_docs/method_summary.md
index bffe581c2c3..fc840326561 100755
--- a/help_docs/method_summary.md
+++ b/help_docs/method_summary.md
@@ -69,6 +69,8 @@ self.is_element_enabled(selector, by=By.CSS_SELECTOR)
self.is_text_visible(text, selector="html", by=By.CSS_SELECTOR)
+self.is_attribute_present(selector, attribute, value=None, by=By.CSS_SELECTOR)
+
self.is_link_text_visible(link_text)
self.is_partial_link_text_visible(partial_link_text)
@@ -303,7 +305,7 @@ self.get_link_status_code(link, allow_redirects=False, timeout=5)
self.assert_link_status_code_is_not_404(link)
-self.assert_no_404_errors(multithreaded=True)
+self.assert_no_404_errors(multithreaded=True, timeout=None)
# Duplicates: self.assert_no_broken_links(multithreaded=True)
self.print_unique_links_with_status_codes()
@@ -512,8 +514,22 @@ self.play_tour(name=None)
self.export_tour(name=None, filename="my_tour.js", url=None)
+############
+
self.activate_jquery_confirm()
+self.set_jqc_theme(theme, color=None, width=None)
+
+self.reset_jqc_theme()
+
+self.get_jqc_button_input(message, buttons, options=None)
+
+self.get_jqc_text_input(message, button=None, options=None)
+
+self.get_jqc_form_inputs(message, buttons, options=None)
+
+############
+
self.activate_messenger()
self.post_message(message, duration=None, pause=True, style="info")
@@ -613,6 +629,14 @@ self.assert_text_not_visible(text, selector="html", by=By.CSS_SELECTOR, timeout=
############
+self.wait_for_attribute_not_present(
+ selector, attribute, value=None, by=By.CSS_SELECTOR, timeout=None)
+
+self.assert_attribute_not_present(
+ selector, attribute, value=None, by=By.CSS_SELECTOR, timeout=None)
+
+############
+
self.accept_alert(timeout=None)
# Duplicates: self.wait_for_and_accept_alert(timeout=None)
From f55bad8b5fae4d784c348555fef9fc7be4f740af Mon Sep 17 00:00:00 2001
From: Michael Mintz
Date: Tue, 24 Aug 2021 00:21:20 -0400
Subject: [PATCH 22/23] Update the docs
---
README.md | 2 +-
mkdocs.yml | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 231ae705148..38e91c8ae3f 100755
--- a/README.md
+++ b/README.md
@@ -268,7 +268,7 @@ nosetests [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
β Automated/Manual Hybrid Mode:
-
SeleniumBase includes a solution called MasterQA, which speeds up manual testing by having automation perform all the browser actions while the manual tester handles validation.
+
SeleniumBase includes a solution called MasterQA, which speeds up manual testing by having automation perform all the browser actions while the manual tester handles validation.
β Feature-Rich:
For a full list of SeleniumBase features, Click Here.