5

I am writing an automation test script using Robot Framework & Selenium2Library for testing our web application (I am writing test cases in .txt format)

I am having a problem on handling two different input fields using Robot Framework. I have to change the values of these two input types using RF. So far I couldn't find any specific keywords to perform this functionalities.

These are the different input fields I have to test:

  1. Range Input Field

html code : <input type="range" id="fontSize" min="8" max="20" step="1" value="12">

Here is the testing scenario : I have to move the slider to a different location & I have to check the value of input range field

  1. Color Picker

enter image description here

Here is the testing scenario: I have to move the pointer through out the color picker window & Select a particular color from the color picker ( I have to store the selected color into a variable for future reference)

I didn't get any particular solution for handling this issue. Is there any keywords in robot framework to test 'Range Input Field' & 'Color Picker'? Can you please suggest asolution for this issue

asked Oct 26, 2015 at 6:08
2
  • Can you point to a publicly available sample of the controls, so we can see and try possible solutions? Apart from that, yes, robotframework/Selenium don't have such high-level keywords and methods. I doubt any generic framework does - they have to be constructed for the particular SUT, according to the functionality it provides. Commented Mar 16, 2017 at 7:15
  • I'm having the same problem, have you found a way to solve it Commented Apr 19, 2017 at 13:14

1 Answer 1

1

For input[type="range"], following keyword Set Range can be used. I have tested this with this HTML and the used the attached test case for testing the keyword. Just add the following code snippet in Selenium2Library/keyword/_element.py and import math, time library.

import math
import time
def set_range(self, locator, val):
# The adjustment helper to drag the slider thumb
 def adjust(deltax):
 if deltax < 0:
 deltax = int(math.floor(min(-1, deltax)))
 else:
 deltax = int(math.ceil(max(1, deltax)))
 ac = ActionChains(self._current_browser())
 ac.click_and_hold(None)
 ac.move_by_offset(deltax, 0)
 ac.release(None)
 ac.perform()
 el = self._element_find(locator, True, True)
 minval = float(el.get_attribute("min") or 0)
 maxval = float(el.get_attribute("max") or 100)
 v = max(0, min(1, (float(val) - minval) / (maxval - minval)))
 width = el.size["width"]
 target = float(width) * v
 
 ac = ActionChains(self._current_browser())
 
 # drag from min to max value, to ensure oninput event
 ac.move_to_element_with_offset(el, 0, 1)
 ac.click_and_hold()
 ac.move_by_offset(width, 0)
 
 # drag to the calculated position
 ac.move_to_element_with_offset(el, target, 1)
 
 ac.release()
 ac.perform()
 
 # perform a binary search and adjust the slider thumb until the value matches
 minguess = 0
 maxguess = 0
 while True:
 curval = el.get_attribute("value")
 if float(curval) == float(val):
 return True
 prev_guess = target
 if float(curval) < float(val):
 minguess = target
 target += (maxguess - target) / 2
 else:
 maxguess = target
 target = minguess + (target - minguess) / 2
 deltax = target-prev_guess
 if abs(deltax) < 0.5:
 break # cannot find a way, fallback to javascript.
 
 time.sleep(0.1) # Don't consume CPU too much
 
 adjust(deltax)
 
 # Finally, if the binary search algoritm fails to achieve the final value
 # we'll revert to the javascript method so at least the value will be changed
 # even though the browser events wont' be triggered.
 
 # Fallback
 self._current_browser().execute_script("arguments[0].value=arguments[1];", el, val)
 curval = el.get_attribute("value")
 if float(curval) == float(val):
 return True
 else:
 raise Exception("Can't set value %f for the element." % val)

Here's the test case:

 *** Settings ***
Documentation TC1: A test case to set range
Resource common_resource.txt
*** Test Cases ***
A test case to set range
 Open Browser url=https://www.w3schools.com/code/tryit.asp?filename=FEXUIFH94YGB
 Click Element css=button[onclick="submitTryit(1)"]
 Select Frame css=iframe#iframeResult
 Wait Until Page Contains Element css=input[type="range"]
 Set Range css=input[type="range"] 8
 Set Range css=input[type="range"] 20

Reference: Selenium: How to automate html5 input range element on Webdriver

Bence Kaulics
1,00712 silver badges22 bronze badges
answered Apr 24, 2017 at 8:56

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.