From 2388e65ae9e7b91993c2fed905d27d1d90776beb Mon Sep 17 00:00:00 2001 From: Luciano Martorella Date: Tue, 13 Jul 2021 16:43:19 +0200 Subject: [PATCH 01/55] - Added minimize keyword - Added atest --- atest/acceptance/windows.robot | 24 ++++++++++++++++++++++++ src/SeleniumLibrary/keywords/window.py | 5 +++++ 2 files changed, 29 insertions(+) diff --git a/atest/acceptance/windows.robot b/atest/acceptance/windows.robot index b9a6c5d38..7bcf9fdf8 100644 --- a/atest/acceptance/windows.robot +++ b/atest/acceptance/windows.robot @@ -108,6 +108,30 @@ Set Window Position using strings Should Be Equal ${x} ${200} Should Be Equal ${y} ${100} +Test Minimize and Maximize Will Actually Move and Resize Window + Set Window Position 300 200 + Set Window Size 400 300 + ${isHidden}= Execute Javascript return document.hidden; + Should Not Be True ${isHidden} + + Minimize Browser Window + + ${isHidden}= Execute Javascript return document.hidden; + Should Be True ${isHidden} + + Maximize Browser Window + + ${isHidden}= Execute Javascript return document.hidden; + Should Not Be True ${isHidden} + + ${x} ${y}= Get Window Position + ${width} ${height}= Get Window Size + # Windows: Can't test for zero in multi-monitor setups + Should Not Be Equal ${x} ${300} + Should Not Be Equal ${y} ${200} + Should Be True ${width} > 400 + Should Be True ${height} > 300 + Select Window By Title After Close Window [Tags] Known Issue Internet Explorer Known Issue Safari Cannot Be Executed in IE diff --git a/src/SeleniumLibrary/keywords/window.py b/src/SeleniumLibrary/keywords/window.py index 43588d7d5..01feee1fe 100644 --- a/src/SeleniumLibrary/keywords/window.py +++ b/src/SeleniumLibrary/keywords/window.py @@ -186,6 +186,11 @@ def maximize_browser_window(self): """Maximizes current browser window.""" self.driver.maximize_window() + @keyword + def minimize_browser_window(self): + """Minimizes current browser window.""" + self.driver.minimize_window() + @keyword def get_window_size(self, inner: bool = False) -> Tuple[float, float]: """Returns current window width and height as integers. From 994a13885276a0931c1aac358700f78dab7c9c4b Mon Sep 17 00:00:00 2001 From: Luciano Martorella Date: Fri, 29 Jul 2022 17:28:17 +0200 Subject: [PATCH 02/55] - Fixed kw count --- utest/test/api/test_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utest/test/api/test_plugins.py b/utest/test/api/test_plugins.py index 7218e637b..fd4d06ff4 100644 --- a/utest/test/api/test_plugins.py +++ b/utest/test/api/test_plugins.py @@ -22,7 +22,7 @@ def setUpClass(cls): def test_no_libraries(self): for item in [None, "None", ""]: sl = SeleniumLibrary(plugins=item) - self.assertEqual(len(sl.get_keyword_names()), 173) + self.assertEqual(len(sl.get_keyword_names()), 174) def test_parse_library(self): plugin = "path.to.MyLibrary" From bbcc8370e9acfd27edfa266e361c1899572527ec Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Wed, 9 Aug 2023 12:47:51 -0400 Subject: [PATCH 03/55] Initial commit adding keywords and tests for #1822 --- atest/acceptance/keywords/elements.robot | 41 ++++++++++++++++++++++++ src/SeleniumLibrary/keywords/element.py | 31 ++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/atest/acceptance/keywords/elements.robot b/atest/acceptance/keywords/elements.robot index 95bf90734..8e503d21e 100644 --- a/atest/acceptance/keywords/elements.robot +++ b/atest/acceptance/keywords/elements.robot @@ -60,6 +60,47 @@ Get Element Attribute ${class}= Get Element Attribute ${second_div} class Should Be Equal ${class} Second Class +Get DOM Attribute + ${id}= Get DOM Attribute link:Link with id id + Should Be Equal ${id} some_id + # Test custom attribute + ${existing_custom_attr}= Get DOM Attribute id:emptyDiv data-id + Should Be Equal ${existing_custom_attr} my_id + ${doesnotexist_custom_attr}= Get DOM Attribute id:emptyDiv data-doesnotexist + Should Be Equal ${doesnotexist_custom_attr} ${None} + # ToDo: + # Ref: https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + +Get non existing DOM Attribute + ${class}= Get DOM Attribute link:Link with id class + Should Be Equal ${class} ${NONE} + +More DOM Attributes + [Setup] Go To Page "forms/enabled_disabled_fields_form.html" + # Test get empty attribute + ${disabled}= Get DOM Attribute css:input[name="disabled_input"] disabled + Should Be Equal ${disabled} true # ${True} + ${disabled}= Get DOM Attribute css:input[name="disabled_password"] disabled + Should Be Equal ${disabled} true # disabled + # Test empty string as the value for the attribute + ${empty_value}= Get DOM Attribute css:input[name="disabled_password"] value + Should Be Equal ${empty_value} ${EMPTY} + ${disabled}= Get DOM Attribute css:input[name="enabled_password"] disabled + Should Be Equal ${disabled} ${NONE} # false + +Get Property + [Setup] Go To Page "forms/enabled_disabled_fields_form.html" + # ${attributes}= Get Property css:input[name="readonly_empty"] attributes + ${tagName_prop}= Get Property css:input[name="readonly_empty"] tagName + Should Be Equal ${tagName_prop} INPUT + # Get a boolean property + ${isConnected}= Get Property css:input[name="readonly_empty"] isConnected + Should Be Equal ${isConnected} ${True} + + # ToDo: nned to test own versus inherited property + # ToDo: Test enumerated property + ${children}= Get Property id:table1 children + Get Element Attribute Value Should Be Should Be Succesfull Element Attribute Value Should Be link=Absolute external link href http://www.google.com/ Element Attribute Value Should Be link=Absolute external link nothere ${None} diff --git a/src/SeleniumLibrary/keywords/element.py b/src/SeleniumLibrary/keywords/element.py index 94a901dec..7d16f8f36 100644 --- a/src/SeleniumLibrary/keywords/element.py +++ b/src/SeleniumLibrary/keywords/element.py @@ -409,6 +409,37 @@ def get_element_attribute( """ return self.find_element(locator).get_attribute(attribute) + @keyword + def get_dom_attribute( + self, locator: Union[WebElement, str], attribute: str + ) -> str: + """Returns the value of ``attribute`` from the element ``locator``. `Get DOM Attribute` keyword + only returns attributes declared within the element's HTML markup. + + See the `Locating elements` section for details about the locator + syntax. + + Example: + | ${id}= | `Get DOM Attribute` | css:h1 | id | + + """ + return self.find_element(locator).get_dom_attribute(attribute) + + @keyword + def get_property( + self, locator: Union[WebElement, str], property: str + ) -> str: + """Returns the value of ``property`` from the element ``locator``. + + See the `Locating elements` section for details about the locator + syntax. + + Example: + | ${text_length}= | `Get Property` | css:h1 | text_length | + + """ + return self.find_element(locator).get_property(property) + @keyword def element_attribute_value_should_be( self, From ce741a7f0049bbc1b6abd28034ea52661a06f939 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Wed, 9 Aug 2023 13:56:04 -0400 Subject: [PATCH 04/55] Added another atest to check for "attibute" that is both an attribute and property --- atest/acceptance/keywords/elements.robot | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/atest/acceptance/keywords/elements.robot b/atest/acceptance/keywords/elements.robot index 8e503d21e..c548a2b7b 100644 --- a/atest/acceptance/keywords/elements.robot +++ b/atest/acceptance/keywords/elements.robot @@ -99,8 +99,16 @@ Get Property # ToDo: nned to test own versus inherited property # ToDo: Test enumerated property + # Test proprty which returns webelement ${children}= Get Property id:table1 children + +Get "Attribute" That Is Both An DOM Attribute and Property + [Setup] Go To Page "forms/enabled_disabled_fields_form.html" + ${value_property}= Get Property css:input[name="readonly_empty"] value + ${value_attribute}= Get DOM Attribute css:input[name="readonly_empty"] value + Should Be Equal ${value_property} ${value_attribute} + Get Element Attribute Value Should Be Should Be Succesfull Element Attribute Value Should Be link=Absolute external link href http://www.google.com/ Element Attribute Value Should Be link=Absolute external link nothere ${None} From a4e5c1efc8e9a49eb2b277b34fc17dd73cbb96ea Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Sat, 12 Aug 2023 20:57:22 -0400 Subject: [PATCH 05/55] Fixed issue with mutable default value --- src/SeleniumLibrary/keywords/browsermanagement.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index 6e31baa06..a1d3474ff 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -340,7 +340,7 @@ def _make_new_browser( @keyword def create_webdriver( - self, driver_name: str, alias: Optional[str] = None, kwargs={}, **init_kwargs + self, driver_name: str, alias: Optional[str] = None, kwargs=None, **init_kwargs ) -> str: """Creates an instance of Selenium WebDriver. @@ -371,6 +371,8 @@ def create_webdriver( `Close All Browsers` keyword is used. See `Switch Browser` for an example. """ + if not kwargs: + kwargs = {} if not isinstance(kwargs, dict): raise RuntimeError("kwargs must be a dictionary.") for arg_name in kwargs: From f4d9d377956100e6dae28d75a5b0cc53facdf802 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Thu, 12 Oct 2023 13:53:33 -0400 Subject: [PATCH 06/55] Modified/improved logic to check against default argument --- src/SeleniumLibrary/keywords/browsermanagement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index a1d3474ff..b648432cb 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -371,7 +371,7 @@ def create_webdriver( `Close All Browsers` keyword is used. See `Switch Browser` for an example. """ - if not kwargs: + if kwargs is None: kwargs = {} if not isinstance(kwargs, dict): raise RuntimeError("kwargs must be a dictionary.") From 5da9e12b07c0f075859494659136d61241663437 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Wed, 1 Nov 2023 19:42:15 -0400 Subject: [PATCH 07/55] Updated documentation for expected value if attribute is not there --- src/SeleniumLibrary/keywords/element.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SeleniumLibrary/keywords/element.py b/src/SeleniumLibrary/keywords/element.py index 7d16f8f36..140f527df 100644 --- a/src/SeleniumLibrary/keywords/element.py +++ b/src/SeleniumLibrary/keywords/element.py @@ -414,7 +414,8 @@ def get_dom_attribute( self, locator: Union[WebElement, str], attribute: str ) -> str: """Returns the value of ``attribute`` from the element ``locator``. `Get DOM Attribute` keyword - only returns attributes declared within the element's HTML markup. + only returns attributes declared within the element's HTML markup. If the requested attribute + is not there, the keyword returns ${None}. See the `Locating elements` section for details about the locator syntax. From e8bd21f7438c5e9b5f7baf7544db4333ed5ef2a6 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Thu, 9 Nov 2023 11:34:43 -0500 Subject: [PATCH 08/55] Added selenium versions to test matrix - Also documented some temporary changes to GitHub Actions test execution - Corrected pypy version in conditional check --- .github/workflows/CI.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index f2f7b08db..294777a52 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,6 +11,7 @@ jobs: matrix: python-version: [3.8, 3.11] # 3.12, pypy-3.9 rf-version: [4.1.3, 5.0.1, 6.0.1] + selenium-version: [4.3.0, 4.12.0, 4.13.0, 4.14.0, 4.15.2] steps: - uses: actions/checkout@v3 @@ -42,6 +43,9 @@ jobs: pip install -r requirements.txt pip install robotstatuschecker>=1.4 pip install requests robotframework-pabot + - name: Install Seleninum v${{ matrix.selenium-version }} + run: | + pip install --upgrade selenium==${{ matrix.selenium-version }} - name: Install RF ${{ matrix.rf-version }} run: | pip install -U --pre robotframework==${{ matrix.rf-version }} @@ -56,6 +60,7 @@ jobs: run: | invoke gen-stub + # Temporarily ignoring pypy execution - name: Run tests with headless Chrome and with PyPy if: matrix.python-version == 'pypy-3.9' run: | @@ -78,7 +83,7 @@ jobs: xvfb-run --auto-servernum python atest/run.py --zip firefox # - name: Run tests with Selenium Grid - # if: matrix.python-version == '3.11' && matrix.rf-version == '3.2.2' && matrix.python-version != 'pypy-3.7' + # if: matrix.python-version == '3.11' && matrix.rf-version == '3.2.2' && matrix.python-version != 'pypy-3.9' # run: | # wget --no-verbose --output-document=./selenium-server-standalone.jar http://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar # sudo chmod u+x ./selenium-server-standalone.jar From 8796cb7f39a287efe12c359f9b3131192f8dba00 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Thu, 9 Nov 2023 11:53:42 -0500 Subject: [PATCH 09/55] Don't use selenium-manager with Python v4.3.0 --- .github/workflows/CI.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 294777a52..ab357b5b1 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -50,6 +50,7 @@ jobs: run: | pip install -U --pre robotframework==${{ matrix.rf-version }} - name: Install drivers via selenium-manager + if: matrix.selenium-version != '4.3.0' run: | SELENIUM_MANAGER_EXE=$(python -c 'from selenium.webdriver.common.selenium_manager import SeleniumManager; sm=SeleniumManager(); print(f"{str(sm.get_binary())}")') echo "$SELENIUM_MANAGER_EXE" From 1220cdd5aabee54de04e2b914b77a4d527d300a1 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Thu, 9 Nov 2023 12:03:49 -0500 Subject: [PATCH 10/55] Removed Python versions 4.3.0, 4.12.0 from test matrix Removed python version greater than 60 days old --- .github/workflows/CI.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index ab357b5b1..f147174e5 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -11,7 +11,7 @@ jobs: matrix: python-version: [3.8, 3.11] # 3.12, pypy-3.9 rf-version: [4.1.3, 5.0.1, 6.0.1] - selenium-version: [4.3.0, 4.12.0, 4.13.0, 4.14.0, 4.15.2] + selenium-version: [4.13.0, 4.14.0, 4.15.2] steps: - uses: actions/checkout@v3 @@ -50,7 +50,6 @@ jobs: run: | pip install -U --pre robotframework==${{ matrix.rf-version }} - name: Install drivers via selenium-manager - if: matrix.selenium-version != '4.3.0' run: | SELENIUM_MANAGER_EXE=$(python -c 'from selenium.webdriver.common.selenium_manager import SeleniumManager; sm=SeleniumManager(); print(f"{str(sm.get_binary())}")') echo "$SELENIUM_MANAGER_EXE" From b3007618d9d18dd3634ef5608fb79bcc8306e7ae Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 10 Nov 2023 16:15:15 -0500 Subject: [PATCH 11/55] Cleaned up Get DOM Attribute, Get Property atests --- atest/acceptance/keywords/elements.robot | 55 +++++++++++++++++------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/atest/acceptance/keywords/elements.robot b/atest/acceptance/keywords/elements.robot index c548a2b7b..eb0bd76ac 100644 --- a/atest/acceptance/keywords/elements.robot +++ b/atest/acceptance/keywords/elements.robot @@ -3,6 +3,7 @@ Documentation Tests elements Test Setup Go To Page "links.html" Resource ../resource.robot Library String +Library DebugLibrary *** Test Cases *** Get Many Elements @@ -60,48 +61,72 @@ Get Element Attribute ${class}= Get Element Attribute ${second_div} class Should Be Equal ${class} Second Class +# About DOM Attributes and Properties +# ----------------------------------- +# When implementing the new `Get DOM Attirbute` and `Get Property` keywords (#1822), several +# questions were raised. Fundamentally what is the difference between a DOM attribute and +# a Property. As [1] explains "Attributes are defined by HTML. Properties are defined by the +# DOM (Document Object Model)." +# +# Below are some references which talk to some descriptions and oddities of DOM attributes +# and properties. +# +# References: +# [1] HTML attributes and DOM properties: +# https://angular.io/guide/binding-syntax#html-attribute-vs-dom-property +# [2] W3C HTML Specification - Section 13.1.2.3 Attributes: +# https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 +# [3] JavaScript.Info - Attributes and properties: +# https://javascript.info/dom-attributes-and-properties +# [4] "Which CSS properties are inherited?" - StackOverflow +# https://stackoverflow.com/questions/5612302/which-css-properties-are-inherited +# [5] MDN Web Docs: Attribute +# https://developer.mozilla.org/en-US/docs/Glossary/Attribute +# [6] MDN Web Docs: HTML attribute reference +# https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes + Get DOM Attribute + # Test get DOM attribute ${id}= Get DOM Attribute link:Link with id id Should Be Equal ${id} some_id # Test custom attribute ${existing_custom_attr}= Get DOM Attribute id:emptyDiv data-id - Should Be Equal ${existing_custom_attr} my_id + Should Be Equal ${existing_custom_attr} my_id ${doesnotexist_custom_attr}= Get DOM Attribute id:emptyDiv data-doesnotexist Should Be Equal ${doesnotexist_custom_attr} ${None} - # ToDo: - # Ref: https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - -Get non existing DOM Attribute + # Get non existing DOM Attribute ${class}= Get DOM Attribute link:Link with id class Should Be Equal ${class} ${NONE} More DOM Attributes [Setup] Go To Page "forms/enabled_disabled_fields_form.html" - # Test get empty attribute + # Test get empty boolean attribute ${disabled}= Get DOM Attribute css:input[name="disabled_input"] disabled - Should Be Equal ${disabled} true # ${True} + Should Be Equal ${disabled} true + # Test boolean attribute whose value is a string ${disabled}= Get DOM Attribute css:input[name="disabled_password"] disabled - Should Be Equal ${disabled} true # disabled + Should Be Equal ${disabled} true # Test empty string as the value for the attribute ${empty_value}= Get DOM Attribute css:input[name="disabled_password"] value Should Be Equal ${empty_value} ${EMPTY} + # Test non-existing attribute ${disabled}= Get DOM Attribute css:input[name="enabled_password"] disabled - Should Be Equal ${disabled} ${NONE} # false + Should Be Equal ${disabled} ${NONE} Get Property [Setup] Go To Page "forms/enabled_disabled_fields_form.html" - # ${attributes}= Get Property css:input[name="readonly_empty"] attributes ${tagName_prop}= Get Property css:input[name="readonly_empty"] tagName Should Be Equal ${tagName_prop} INPUT # Get a boolean property ${isConnected}= Get Property css:input[name="readonly_empty"] isConnected Should Be Equal ${isConnected} ${True} - - # ToDo: nned to test own versus inherited property + # Test property which returns webelement + ${children_prop}= Get Property id:table1 children + Length Should Be ${children_prop} ${1} + ${isWebElement}= Evaluate isinstance($children_prop[0], selenium.webdriver.remote.webelement.WebElement) modules=selenium + Should Be Equal ${isWebElement} ${True} + # ToDo: need to test own versus inherited property # ToDo: Test enumerated property - # Test proprty which returns webelement - ${children}= Get Property id:table1 children - Get "Attribute" That Is Both An DOM Attribute and Property [Setup] Go To Page "forms/enabled_disabled_fields_form.html" From 4a1f413c4a4b29d196e76b8da5371019a23d3c32 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 10 Nov 2023 16:17:02 -0500 Subject: [PATCH 12/55] Updated number of library keywords to 179 --- utest/test/api/test_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utest/test/api/test_plugins.py b/utest/test/api/test_plugins.py index 89e33c247..b80581af1 100644 --- a/utest/test/api/test_plugins.py +++ b/utest/test/api/test_plugins.py @@ -22,7 +22,7 @@ def setUpClass(cls): def test_no_libraries(self): for item in [None, "None", ""]: sl = SeleniumLibrary(plugins=item) - self.assertEqual(len(sl.get_keyword_names()), 177) + self.assertEqual(len(sl.get_keyword_names()), 179) def test_parse_library(self): plugin = "path.to.MyLibrary" From 6af2c8226a6d663df6073ff27b82014ca6259ba3 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 10 Nov 2023 16:37:25 -0500 Subject: [PATCH 13/55] Revert "Updated number of library keywords to 179" This reverts commit 4a1f413c4a4b29d196e76b8da5371019a23d3c32. --- utest/test/api/test_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utest/test/api/test_plugins.py b/utest/test/api/test_plugins.py index b80581af1..89e33c247 100644 --- a/utest/test/api/test_plugins.py +++ b/utest/test/api/test_plugins.py @@ -22,7 +22,7 @@ def setUpClass(cls): def test_no_libraries(self): for item in [None, "None", ""]: sl = SeleniumLibrary(plugins=item) - self.assertEqual(len(sl.get_keyword_names()), 179) + self.assertEqual(len(sl.get_keyword_names()), 177) def test_parse_library(self): plugin = "path.to.MyLibrary" From bbb999001449f608cf269887b0d8792c73a2d92c Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 10 Nov 2023 17:09:19 -0500 Subject: [PATCH 14/55] Updated number of library keywords to 179 --- utest/test/api/test_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utest/test/api/test_plugins.py b/utest/test/api/test_plugins.py index 89e33c247..b80581af1 100644 --- a/utest/test/api/test_plugins.py +++ b/utest/test/api/test_plugins.py @@ -22,7 +22,7 @@ def setUpClass(cls): def test_no_libraries(self): for item in [None, "None", ""]: sl = SeleniumLibrary(plugins=item) - self.assertEqual(len(sl.get_keyword_names()), 177) + self.assertEqual(len(sl.get_keyword_names()), 179) def test_parse_library(self): plugin = "path.to.MyLibrary" From 7ab0a2c7ed5844abf8e3d424cbd73930c0606db8 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 10 Nov 2023 17:37:01 -0500 Subject: [PATCH 15/55] Added test where the property is different than the attribute Using prefilled value on an input element, first verify that the value attribute and property are the same. Then modifying the value by inputting text verify the value property has changed but the attribute value remains the same. --- atest/acceptance/keywords/elements.robot | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/atest/acceptance/keywords/elements.robot b/atest/acceptance/keywords/elements.robot index eb0bd76ac..5419baa15 100644 --- a/atest/acceptance/keywords/elements.robot +++ b/atest/acceptance/keywords/elements.robot @@ -134,6 +134,19 @@ Get "Attribute" That Is Both An DOM Attribute and Property ${value_attribute}= Get DOM Attribute css:input[name="readonly_empty"] value Should Be Equal ${value_property} ${value_attribute} +Modify "Attribute" That Is Both An DOM Attribute and Property + [Setup] Go To Page "forms/prefilled_email_form.html" + ${initial_value_property}= Get Property css:input[name="email"] value + ${initial_value_attribute}= Get DOM Attribute css:input[name="email"] value + Should Be Equal ${initial_value_property} ${initial_value_attribute} + Should Be Equal ${initial_value_attribute} Prefilled Email + Input Text css:input[name="email"] robot@robotframework.org + ${changed_value_property}= Get Property css:input[name="email"] value + ${changed_value_attribute}= Get DOM Attribute css:input[name="email"] value + Should Not Be Equal ${changed_value_property} ${changed_value_attribute} + Should Be Equal ${changed_value_attribute} Prefilled Email + Should Be Equal ${changed_value_property} robot@robotframework.org + Get Element Attribute Value Should Be Should Be Succesfull Element Attribute Value Should Be link=Absolute external link href http://www.google.com/ Element Attribute Value Should Be link=Absolute external link nothere ${None} From 1aa3d16f83b7a7cf2a4601752f0f2b00c2138461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rene=CC=81?= Date: Fri, 17 Nov 2023 16:32:36 +0100 Subject: [PATCH 16/55] fixed type hinting so that it is not converted to str MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: René --- atest/acceptance/keywords/async_javascript.robot | 8 ++++++++ atest/acceptance/keywords/javascript.robot | 8 ++++++++ src/SeleniumLibrary/keywords/javascript.py | 4 ++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/atest/acceptance/keywords/async_javascript.robot b/atest/acceptance/keywords/async_javascript.robot index 2a9f8fcbd..7fc72b198 100644 --- a/atest/acceptance/keywords/async_javascript.robot +++ b/atest/acceptance/keywords/async_javascript.robot @@ -19,6 +19,14 @@ Execute Async Javascript With ARGUMENTS and JAVASCRIPT Marker ... alert(arguments[0]); Alert Should Be Present 123 timeout=10 s +Execute Javascript with dictionary object + &{ARGS}= Create Dictionary key=value number=${1} boolean=${TRUE} + ${returned} Execute Async Javascript arguments[1](arguments[0]); ARGUMENTS ${ARGS} + Should Be True type($returned) == dict + Should Be Equal ${returned}[key] value + Should Be Equal ${returned}[number] ${1} + Should Be Equal ${returned}[boolean] ${TRUE} + Should Be Able To Return Javascript Primitives From Async Scripts Neither None Nor Undefined ${result} = Execute Async Javascript arguments[arguments.length - 1](123); Should Be Equal ${result} ${123} diff --git a/atest/acceptance/keywords/javascript.robot b/atest/acceptance/keywords/javascript.robot index 2a2195cb2..a8d61fa7f 100644 --- a/atest/acceptance/keywords/javascript.robot +++ b/atest/acceptance/keywords/javascript.robot @@ -85,6 +85,14 @@ Execute Javascript from File With ARGUMENTS Marker ... 123 Alert Should Be Present 123 timeout=10 s +Execute Javascript with dictionary object + &{ARGS}= Create Dictionary key=value number=${1} boolean=${TRUE} + ${returned} Execute JavaScript return arguments[0] ARGUMENTS ${ARGS} + Should Be True type($returned) == dict + Should Be Equal ${returned}[key] value + Should Be Equal ${returned}[number] ${1} + Should Be Equal ${returned}[boolean] ${TRUE} + Open Context Menu [Tags] Known Issue Safari Go To Page "javascript/context_menu.html" diff --git a/src/SeleniumLibrary/keywords/javascript.py b/src/SeleniumLibrary/keywords/javascript.py index 0c793d9a1..9c2bb1c90 100644 --- a/src/SeleniumLibrary/keywords/javascript.py +++ b/src/SeleniumLibrary/keywords/javascript.py @@ -30,7 +30,7 @@ class JavaScriptKeywords(LibraryComponent): arg_marker = "ARGUMENTS" @keyword - def execute_javascript(self, *code: Union[WebElement, str]) -> Any: + def execute_javascript(self, *code: Any) -> Any: """Executes the given JavaScript code with possible arguments. ``code`` may be divided into multiple cells in the test data and @@ -73,7 +73,7 @@ def execute_javascript(self, *code: Union[WebElement, str]) -> Any: return self.driver.execute_script(js_code, *js_args) @keyword - def execute_async_javascript(self, *code: Union[WebElement, str]) -> Any: + def execute_async_javascript(self, *code: Any) -> Any: """Executes asynchronous JavaScript code with possible arguments. Similar to `Execute Javascript` except that scripts executed with From 1a74bf81715096e5460edc718fef7209e141288a Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 17 Nov 2023 14:23:50 -0500 Subject: [PATCH 17/55] Added type hint --- src/SeleniumLibrary/keywords/browsermanagement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SeleniumLibrary/keywords/browsermanagement.py b/src/SeleniumLibrary/keywords/browsermanagement.py index d4f563375..665ffe89b 100644 --- a/src/SeleniumLibrary/keywords/browsermanagement.py +++ b/src/SeleniumLibrary/keywords/browsermanagement.py @@ -334,7 +334,7 @@ def _make_new_browser( @keyword def create_webdriver( - self, driver_name: str, alias: Optional[str] = None, kwargs=None, **init_kwargs + self, driver_name: str, alias: Optional[str] = None, kwargs: Optional[dict] = None, **init_kwargs ) -> str: """Creates an instance of Selenium WebDriver. From f539edb598bb09a47ebfe591a129c062af052906 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Sat, 18 Nov 2023 09:13:49 -0500 Subject: [PATCH 18/55] Added RF v6.1.1 to the test matrix --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index f2f7b08db..5ecbed4ae 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: python-version: [3.8, 3.11] # 3.12, pypy-3.9 - rf-version: [4.1.3, 5.0.1, 6.0.1] + rf-version: [4.1.3, 5.0.1, 6.0.1, 6.1.1] steps: - uses: actions/checkout@v3 From 8dd4fe2e4a4b2e069b5e878141d45bf7956ca8be Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Sat, 18 Nov 2023 22:08:58 -0500 Subject: [PATCH 19/55] Release notes for 6.2.0rc1 --- docs/SeleniumLibrary-6.2.0rc1.rst | 127 ++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 docs/SeleniumLibrary-6.2.0rc1.rst diff --git a/docs/SeleniumLibrary-6.2.0rc1.rst b/docs/SeleniumLibrary-6.2.0rc1.rst new file mode 100644 index 000000000..2de9c477f --- /dev/null +++ b/docs/SeleniumLibrary-6.2.0rc1.rst @@ -0,0 +1,127 @@ +======================== +SeleniumLibrary 6.2.0rc1 +======================== + + +.. default-role:: code + + +SeleniumLibrary_ is a web testing library for `Robot Framework`_ that utilizes +the Selenium_ tool internally. SeleniumLibrary 6.2.0rc1 is a new release with +compatability fixes for recent selenium versions and some bug fixes. + +All issues targeted for SeleniumLibrary v6.2.0 can be found +from the `issue tracker`_. + +If you have pip_ installed, just run + +:: + + pip install --pre --upgrade robotframework-seleniumlibrary + +to install the latest available release or use + +:: + + pip install robotframework-seleniumlibrary==6.2.0rc1 + +to install exactly this version. Alternatively you can download the source +distribution from PyPI_ and install it manually. + +SeleniumLibrary 6.2.0rc1 was released on Saturday November 18, 2023. SeleniumLibrary supports +Python 3.8 through 3.11, Selenium 4.12.0 through 4.15.2 and +Robot Framework 5.0.1 and 6.1.1. + +.. _Robot Framework: http://robotframework.org +.. _SeleniumLibrary: https://github.com/robotframework/SeleniumLibrary +.. _Selenium: http://seleniumhq.org +.. _pip: http://pip-installer.org +.. _PyPI: https://pypi.python.org/pypi/robotframework-seleniumlibrary +.. _issue tracker: https://github.com/robotframework/SeleniumLibrary/issues?q=milestone%3Av6.2.0 + + +.. contents:: + :depth: 2 + :local: + +Most important enhancements +=========================== + +- Remove deprecated headless option for chrome and firefox. (`#1858`_, rc 1) + If one specified either `headlesschrome` or `headlessfirefox` as the browser within the + Open Browser keyword, then the library would handle setting this option with the underlying + Selenium driver. But the methods to do so were depracted and then removed in Selenium + v4.13.0. Thus one was not getting a headless browser in these instances. This resolves that + issue. + +- Resolve issue with service log_path now log_output. (`#1870`_, rc 1) + Selenium changed the arguments for the service log within v4.13.0. This change allows for a + seamless usage across versions before and after v4.13.0. + +- Execute JavaScript converts arguments to strings with robot==6.1 (`#1843`_, rc 1) + If any ARGUMENTS were passed into either the `Execute Javascript` or `Execute Async Javascript` + then they were converted to strings even if they were of some other type. This has been + corrected within this release. + +Acknowledgements +================ + +I want to thank the following for helping to get out this release, + +- `René Rohner `_ for pointing out that Create Webdriver had a + mutable default value (`#1817`_) +- `Kieran Trautwein `_ for resolving the issue with + deprecated headless option for chrome and firefox. (`#1858`_, rc 1) +- `Nicholas Bollweg `_ for assisting in resolving the issue + with service log_path now log_output. (`#1870`_, rc 1) +- `Igor Kozyrenko `_ for reporting the argument issue with Execute + JavaScript and `René Rohner `_for resolving it. (`#1843`_, rc 1) +- `Robin Matz `_ for improving the documentation on page load + timeout (`#1821`_, rc 1) + +and **Yuri Verweij, Lisa Crispin, and Tatu Aalto**. + +Full list of fixes and enhancements +=================================== + +.. list-table:: + :header-rows: 1 + + * - ID + - Type + - Priority + - Summary + - Added + * - `#1817`_ + - bug + - critical + - Create Webdriver has mutable default value + - rc�1 + * - `#1858`_ + - bug + - critical + - Remove deprecated headless option for chrome and firefox. + - rc�1 + * - `#1870`_ + - bug + - critical + - Resolve issue with service log_path now log_output. + - rc�1 + * - `#1843`_ + - bug + - high + - Execute JavaScript converts arguments to strings with robot==6.1 + - rc�1 + * - `#1821`_ + - enhancement + - medium + - Improve documentation on page load timeout + - rc�1 + +Altogether 5 issues. View on the `issue tracker `__. + +.. _#1817: https://github.com/robotframework/SeleniumLibrary/issues/1817 +.. _#1858: https://github.com/robotframework/SeleniumLibrary/issues/1858 +.. _#1870: https://github.com/robotframework/SeleniumLibrary/issues/1870 +.. _#1843: https://github.com/robotframework/SeleniumLibrary/issues/1843 +.. _#1821: https://github.com/robotframework/SeleniumLibrary/issues/1821 From 7469076038c40da149504f6596813979630d62d3 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Sat, 18 Nov 2023 22:09:47 -0500 Subject: [PATCH 20/55] Updated version to 6.2.0rc1 --- src/SeleniumLibrary/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SeleniumLibrary/__init__.py b/src/SeleniumLibrary/__init__.py index 5754cb0f0..a418e2839 100644 --- a/src/SeleniumLibrary/__init__.py +++ b/src/SeleniumLibrary/__init__.py @@ -51,7 +51,7 @@ from SeleniumLibrary.utils import LibraryListener, is_truthy, _convert_timeout, _convert_delay -__version__ = "6.1.3" +__version__ = "6.2.0rc1" class SeleniumLibrary(DynamicCore): From 5874349f7995f60a3232ec3ffd818f31b6871e53 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Sat, 18 Nov 2023 22:10:35 -0500 Subject: [PATCH 21/55] Generate stub file for 6.2.0rc1 --- src/SeleniumLibrary/__init__.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SeleniumLibrary/__init__.pyi b/src/SeleniumLibrary/__init__.pyi index eedbad5ab..3f651199a 100644 --- a/src/SeleniumLibrary/__init__.pyi +++ b/src/SeleniumLibrary/__init__.pyi @@ -27,7 +27,7 @@ class SeleniumLibrary: def close_browser(self): ... def close_window(self): ... def cover_element(self, locator: Union[selenium.webdriver.remote.webelement.WebElement, str]): ... - def create_webdriver(self, driver_name: str, alias: Optional[Optional[str]] = None, kwargs = {}, **init_kwargs): ... + def create_webdriver(self, driver_name: str, alias: Optional[Optional[str]] = None, kwargs: Optional[Optional[dict]] = None, **init_kwargs): ... def current_frame_should_contain(self, text: str, loglevel: str = 'TRACE'): ... def current_frame_should_not_contain(self, text: str, loglevel: str = 'TRACE'): ... def delete_all_cookies(self): ... @@ -45,8 +45,8 @@ class SeleniumLibrary: def element_should_not_contain(self, locator: Union[selenium.webdriver.remote.webelement.WebElement, str], expected: Optional[str], message: Optional[Optional[str]] = None, ignore_case: bool = False): ... def element_text_should_be(self, locator: Union[selenium.webdriver.remote.webelement.WebElement, str], expected: Optional[str], message: Optional[Optional[str]] = None, ignore_case: bool = False): ... def element_text_should_not_be(self, locator: Union[selenium.webdriver.remote.webelement.WebElement, str], not_expected: Optional[str], message: Optional[Optional[str]] = None, ignore_case: bool = False): ... - def execute_async_javascript(self, *code: Union[selenium.webdriver.remote.webelement.WebElement, str]): ... - def execute_javascript(self, *code: Union[selenium.webdriver.remote.webelement.WebElement, str]): ... + def execute_async_javascript(self, *code: Any): ... + def execute_javascript(self, *code: Any): ... def frame_should_contain(self, locator: Union[selenium.webdriver.remote.webelement.WebElement, str], text: str, loglevel: str = 'TRACE'): ... def get_action_chain_delay(self): ... def get_all_links(self): ... From 485151eb66e4c9927cc9955f6d03d374f8ed6c87 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Sat, 18 Nov 2023 22:12:00 -0500 Subject: [PATCH 22/55] Generated docs for version 6.2.0rc1 --- docs/SeleniumLibrary-6.2.0rc1.html | 1852 ++++++++++++++++++++++++++++ 1 file changed, 1852 insertions(+) create mode 100644 docs/SeleniumLibrary-6.2.0rc1.html diff --git a/docs/SeleniumLibrary-6.2.0rc1.html b/docs/SeleniumLibrary-6.2.0rc1.html new file mode 100644 index 000000000..6057aac57 --- /dev/null +++ b/docs/SeleniumLibrary-6.2.0rc1.html @@ -0,0 +1,1852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Opening library documentation failed

+
    +
  • Verify that you have JavaScript enabled in your browser.
  • +
  • Make sure you are using a modern enough browser. If using Internet Explorer, version 11 is required.
  • +
  • Check are there messages in your browser's JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • +
+
+ + + + + + + + + + + + + + + + From c052133c9ff097d5756587376de4d7ff51659e42 Mon Sep 17 00:00:00 2001 From: Dor Blayzer <59066376+Dor-bl@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:52:18 +0200 Subject: [PATCH 23/55] fix: Selenium CI badge show wrong status --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 24a36213c..6948a9ea5 100644 --- a/README.rst +++ b/README.rst @@ -28,8 +28,8 @@ different versions and the overall project history. .. image:: https://img.shields.io/pypi/l/robotframework-seleniumlibrary.svg :target: https://www.apache.org/licenses/LICENSE-2.0 -.. image:: https://github.com/robotframework/SeleniumLibrary/workflows/SeleniumLibrary%20CI/badge.svg - :target: https://github.com/robotframework/SeleniumLibrary/actions?query=workflow%3A%22SeleniumLibrary+CI%22 +.. image:: https://github.com/robotframework/SeleniumLibrary/actions/workflows/CI.yml/badge.svg?branch=master + :target: https://github.com/robotframework/SeleniumLibrary/actions/workflows/CI.yml Keyword Documentation --------------------- From af4df69966be5658cfab1b5204f874e46f8a2cea Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 24 Nov 2023 21:14:02 -0500 Subject: [PATCH 24/55] Release notes for 6.2.0 --- docs/SeleniumLibrary-6.2.0.rst | 124 +++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 docs/SeleniumLibrary-6.2.0.rst diff --git a/docs/SeleniumLibrary-6.2.0.rst b/docs/SeleniumLibrary-6.2.0.rst new file mode 100644 index 000000000..542bb66a1 --- /dev/null +++ b/docs/SeleniumLibrary-6.2.0.rst @@ -0,0 +1,124 @@ +===================== +SeleniumLibrary 6.2.0 +===================== + + +.. default-role:: code + + +SeleniumLibrary_ is a web testing library for `Robot Framework`_ that utilizes +the Selenium_ tool internally. SeleniumLibrary 6.2.0 is a new release with +compatibility fixes for recent selenium versions and some bug fixes. + +If you have pip_ installed, just run + +:: + + pip install --upgrade robotframework-seleniumlibrary + +to install the latest available release or use + +:: + + pip install robotframework-seleniumlibrary==6.2.0 + +to install exactly this version. Alternatively you can download the source +distribution from PyPI_ and install it manually. + +SeleniumLibrary 6.2.0 was released on Friday November 24, 2023. SeleniumLibrary supports +Python 3.8 through 3.11, Selenium 4.12.0 through 4.15.2 and +Robot Framework 5.0.1 and 6.1.1. + +.. _Robot Framework: http://robotframework.org +.. _SeleniumLibrary: https://github.com/robotframework/SeleniumLibrary +.. _Selenium: http://seleniumhq.org +.. _pip: http://pip-installer.org +.. _PyPI: https://pypi.python.org/pypi/robotframework-seleniumlibrary +.. _issue tracker: https://github.com/robotframework/SeleniumLibrary/issues?q=milestone%3Av6.2.0 + + +.. contents:: + :depth: 2 + :local: + +Most important enhancements +=========================== + +- Remove deprecated headless option for chrome and firefox. (`#1858`_) + If one specified either `headlesschrome` or `headlessfirefox` as the browser within the + Open Browser keyword, then the library would handle setting this option with the underlying + Selenium driver. But the methods to do so were depracted and then removed in Selenium + v4.13.0. Thus one was not getting a headless browser in these instances. This resolves that + issue. + +- Resolve issue with service log_path now log_output. (`#1870`_) + Selenium changed the arguments for the service log within v4.13.0. This change allows for a + seamless usage across versions before and after v4.13.0. + +- Execute JavaScript converts arguments to strings with robot==6.1 (`#1843`_) + If any ARGUMENTS were passed into either the `Execute Javascript` or `Execute Async Javascript` + then they were converted to strings even if they were of some other type. This has been + corrected within this release. + +Acknowledgements +================ + +I want to thank the following for helping to get out this release, + +- `René Rohner `_ for pointing out that Create Webdriver had a + mutable default value (`#1817`_) +- `Kieran Trautwein `_ for resolving the issue with + deprecated headless option for chrome and firefox. (`#1858`_) +- `Nicholas Bollweg `_ for assisting in resolving the issue + with service log_path now log_output. (`#1870`_) +- `Igor Kozyrenko `_ for reporting the argument issue with Execute + JavaScript and `René Rohner `_for resolving it. (`#1843`_) +- `Robin Matz `_ for improving the documentation on page load + timeout (`#1821`_) +- `Dor Blayzer `_ for reporting and fixing the SeleniumLibrary CI badge. () + +and **Yuri Verweij, Lisa Crispin, and Tatu Aalto**. + +Full list of fixes and enhancements +=================================== + +.. list-table:: + :header-rows: 1 + + * - ID + - Type + - Priority + - Summary + * - `#1817`_ + - bug + - critical + - Create Webdriver has mutable default value + * - `#1858`_ + - bug + - critical + - Remove deprecated headless option for chrome and firefox. + * - `#1870`_ + - bug + - critical + - Resolve issue with service log_path now log_output. + * - `#1843`_ + - bug + - high + - Execute JavaScript converts arguments to strings with robot==6.1 + * - `#1821`_ + - enhancement + - medium + - Improve documentation on page load timeout + * - `#1872`_ + - --- + - medium + - fix: Selenium CI badge show wrong status + +Altogether 6 issues. View on the `issue tracker `__. + +.. _#1817: https://github.com/robotframework/SeleniumLibrary/issues/1817 +.. _#1858: https://github.com/robotframework/SeleniumLibrary/issues/1858 +.. _#1870: https://github.com/robotframework/SeleniumLibrary/issues/1870 +.. _#1843: https://github.com/robotframework/SeleniumLibrary/issues/1843 +.. _#1821: https://github.com/robotframework/SeleniumLibrary/issues/1821 +.. _#1872: https://github.com/robotframework/SeleniumLibrary/issues/1872 From fbfaadc3b999b497c9a94ba20bdb356f2e4c69c3 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 24 Nov 2023 21:14:41 -0500 Subject: [PATCH 25/55] Updated version to 6.2.0 --- src/SeleniumLibrary/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SeleniumLibrary/__init__.py b/src/SeleniumLibrary/__init__.py index a418e2839..52dedf5d0 100644 --- a/src/SeleniumLibrary/__init__.py +++ b/src/SeleniumLibrary/__init__.py @@ -51,7 +51,7 @@ from SeleniumLibrary.utils import LibraryListener, is_truthy, _convert_timeout, _convert_delay -__version__ = "6.2.0rc1" +__version__ = "6.2.0" class SeleniumLibrary(DynamicCore): From 7496dc7ee862926a50ad9c4c0f1549ead6029309 Mon Sep 17 00:00:00 2001 From: Ed Manlove Date: Fri, 24 Nov 2023 21:15:59 -0500 Subject: [PATCH 26/55] Generated docs for version 6.2.0 --- docs/SeleniumLibrary.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/SeleniumLibrary.html b/docs/SeleniumLibrary.html index 856f1d547..00db82f92 100644 --- a/docs/SeleniumLibrary.html +++ b/docs/SeleniumLibrary.html @@ -1181,7 +1181,7 @@ jQuery.extend({highlight:function(e,t,n,r){if(e.nodeType===3){var i=e.data.match(t);if(i){var s=document.createElement(n||"span");s.className=r||"highlight";var o=e.splitText(i.index);o.splitText(i[0].length);var u=o.cloneNode(true);s.appendChild(u);o.parentNode.replaceChild(s,o);return 1}}else if(e.nodeType===1&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&!(e.tagName===n.toUpperCase()&&e.className===r)){for(var a=0;a