Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fill correctly a shadowroot input text when text contains quotat… #177

Merged
merged 1 commit into from Jun 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.rst
Expand Up @@ -7,6 +7,7 @@ v1.7.2
*In development*

- Move utils.py and path_utils.py files to utils folder maintaining backwards compatibility
- Fix input text when element has a shadowroot and text contains quotation marks

v1.7.1
------
Expand Down
2 changes: 1 addition & 1 deletion toolium/pageelements/group_page_element.py
Expand Up @@ -43,7 +43,7 @@ def __init__(self, by, value, parent=None, driver_wrapper=None, order=None, wait
self.parent = parent #: element from which to find actual elements
self.order = order #: index value if the locator returns more than one element
self.wait = wait #: True if it must be loaded in wait_until_loaded method of the container page object
self.shadowroot = None #: Not implemented for PAgeElements yet
self.shadowroot = None #: Not implemented for Group yet
self.driver_wrapper = driver_wrapper if driver_wrapper else \
DriverWrappersPool.get_default_wrapper() #: driver wrapper instance
self.init_page_elements()
Expand Down
1 change: 1 addition & 0 deletions toolium/pageelements/input_text_page_element.py
Expand Up @@ -37,6 +37,7 @@ def text(self, value):
if self.driver_wrapper.is_ios_test() and not self.driver_wrapper.is_web_test():
self.web_element.set_value(value)
elif self.shadowroot:
value = value.replace("\"", "\\\"")
self.driver.execute_script('return document.querySelector("%s")'
'.shadowRoot.querySelector("%s")'
'.value = "%s"' % (self.shadowroot, self.locator[1], value))
Expand Down
2 changes: 1 addition & 1 deletion toolium/pageelements/page_element.py
Expand Up @@ -88,7 +88,7 @@ def _find_web_element(self):
if self.shadowroot:
if self.locator[0] != By.CSS_SELECTOR:
raise Exception('Locator type should be CSS_SELECTOR using shadowroot but found: '
'%s'.format(self.locator[0]))
'%s' % self.locator[0])
# querySelector only support CSS SELECTOR locator
self._web_element = self.driver.execute_script('return document.querySelector("%s").shadowRoot.'
'querySelector("%s")' % (self.shadowroot,
Expand Down
2 changes: 1 addition & 1 deletion toolium/pageelements/page_elements.py
Expand Up @@ -58,7 +58,7 @@ def __init__(self, by, value, parent=None, page_element_class=None, order=None):
self.locator = (by, value) #: tuple with locator type and locator value
self.parent = parent #: element from which to find actual elements
self.order = order #: index value if the locator returns more than one element
self.shadowroot = None #: Not implemented for PAgeElements yet
self.shadowroot = None #: Not implemented for PageElements yet
self.driver_wrapper = DriverWrappersPool.get_default_wrapper() #: driver wrapper instance
# update instance element class or use PageElement class
if page_element_class:
Expand Down
29 changes: 29 additions & 0 deletions toolium/test/pageelements/test_derived_page_element.py
Expand Up @@ -56,6 +56,7 @@ class LoginPageObject(PageObject):
language = Select(By.ID, 'language')
login = Button(By.ID, 'login')
menu = Menu(By.ID, 'menu')
username_shadowroot = InputText(By.XPATH, '//input[1]', shadowroot='shadowroot_css')


@pytest.fixture
Expand Down Expand Up @@ -119,6 +120,34 @@ def test_set_input_text(driver_wrapper):
mock_element.send_keys.assert_called_once_with('new input value')


def test_set_input_text_shadowroot(driver_wrapper):
# Configure driver mock
driver_wrapper.driver.find_element.return_value = mock_element
driver_wrapper.is_ios_test = mock.MagicMock(return_value=False)
text_value = 'new input value'
expected_script = 'return document.querySelector("shadowroot_css").shadowRoot.querySelector("//input[1]").value ' \
'= "new input value"'

LoginPageObject().username_shadowroot.text = text_value

mock_element.send_keys.assert_not_called()
driver_wrapper.driver.execute_script.assert_called_once_with(expected_script)


def test_set_input_text_shadowroot_quotation_marks(driver_wrapper):
# Configure driver mock
driver_wrapper.driver.find_element.return_value = mock_element
driver_wrapper.is_ios_test = mock.MagicMock(return_value=False)
text_value = 'new "input" value'
expected_script = 'return document.querySelector("shadowroot_css").shadowRoot.querySelector("//input[1]").value ' \
'= "new \\"input\\" value"'

LoginPageObject().username_shadowroot.text = text_value

mock_element.send_keys.assert_not_called()
driver_wrapper.driver.execute_script.assert_called_once_with(expected_script)


def test_get_selected_option(driver_wrapper):
select_page_element.SeleniumSelect = get_mock_select()

Expand Down
17 changes: 17 additions & 0 deletions toolium/test/pageelements/test_page_element.py
Expand Up @@ -39,6 +39,8 @@ def init_page_elements(self):
self.language = PageElement(By.ID, 'language')
self.email = PageElement(By.ID, 'email', mock_element)
self.address = PageElement(By.ID, 'address', (By.ID, 'parent'))
self.address_shadowroot = PageElement(By.CSS_SELECTOR, '#address', shadowroot='shadowroot_css')
self.address_shadowroot_by_id = PageElement(By.ID, 'address', shadowroot='shadowroot_css')


@pytest.fixture
Expand Down Expand Up @@ -137,6 +139,21 @@ def test_get_web_element_with_parent_web_element(driver_wrapper):
mock_element.find_element.assert_called_once_with(By.ID, 'email')


def test_get_web_element_shadowroot(driver_wrapper):
RegisterPageObject(driver_wrapper).address_shadowroot.web_element
expected_script = 'return document.querySelector("shadowroot_css").shadowRoot.querySelector("#address")'

mock_element.find_element.assert_not_called()
driver_wrapper.driver.execute_script.assert_called_once_with(expected_script)


def test_get_web_element_shadowroot_wrong_locator(driver_wrapper):
with pytest.raises(Exception) as excinfo:
RegisterPageObject(driver_wrapper).address_shadowroot_by_id.web_element
assert "Locator type should be CSS_SELECTOR using shadowroot but found: id" in str(excinfo.value)
mock_element.find_element.assert_not_called()


def test_get_web_element_in_test(driver_wrapper):
PageElement(By.XPATH, '//input[0]').web_element

Expand Down