diff options
Diffstat (limited to 'qa/qa/page/base.rb')
-rw-r--r-- | qa/qa/page/base.rb | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb index d1b556b58fb..289094268b6 100644 --- a/qa/qa/page/base.rb +++ b/qa/qa/page/base.rb @@ -132,7 +132,7 @@ module QA all(element_selector_css(name), **kwargs) end - def check_element(name) + def check_element(name, click_by_js = false) if find_element(name, visible: false).checked? QA::Runtime::Logger.debug("#{name} is already checked") @@ -140,7 +140,7 @@ module QA end retry_until(sleep_interval: 1) do - find_element(name, visible: false).click + click_checkbox_or_radio(name, click_by_js) checked = find_element(name, visible: false).checked? QA::Runtime::Logger.debug(checked ? "#{name} was checked" : "#{name} was not checked") @@ -149,7 +149,7 @@ module QA end end - def uncheck_element(name) + def uncheck_element(name, click_by_js = false) unless find_element(name, visible: false).checked? QA::Runtime::Logger.debug("#{name} is already unchecked") @@ -157,7 +157,7 @@ module QA end retry_until(sleep_interval: 1) do - find_element(name, visible: false).click + click_checkbox_or_radio(name, click_by_js) unchecked = !find_element(name, visible: false).checked? QA::Runtime::Logger.debug(unchecked ? "#{name} was unchecked" : "#{name} was not unchecked") @@ -166,13 +166,31 @@ module QA end end + # Method for selecting radios + def choose_element(name, click_by_js = false) + if find_element(name, visible: false).checked? + QA::Runtime::Logger.debug("#{name} is already selected") + + return + end + + retry_until(sleep_interval: 1) do + click_checkbox_or_radio(name, click_by_js) + selected = find_element(name, visible: false).checked? + + QA::Runtime::Logger.debug(selected ? "#{name} was selected" : "#{name} was not selected") + + selected + end + end + # Use this to simulate moving the pointer to an element's coordinate # and sending a click event. # This is a helpful workaround when there is a transparent element overlapping # the target element and so, normal `click_element` on target would raise # Selenium::WebDriver::Error::ElementClickInterceptedError - def click_element_coordinates(name) - page.driver.browser.action.move_to(find_element(name).native).click.perform + def click_element_coordinates(name, **kwargs) + page.driver.browser.action.move_to(find_element(name, **kwargs).native).click.perform end # replace with (..., page = self.class) @@ -403,6 +421,14 @@ module QA end end end + + private + + def click_checkbox_or_radio(name, click_by_js) + box = find_element(name, visible: false) + # Some checkboxes and radio buttons are hidden by their labels and cannot be clicked directly + click_by_js ? page.execute_script("arguments[0].click();", box) : box.click + end end end end |