from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from . import utils, wait
[docs]class Interactions(object):
def __init__(self, driver, timeout):
self.driver = driver
self.timeout = timeout
self.wait = wait.Wait(driver, timeout)
[docs] def click_on_svg_element(self, css):
'''click on an svg element
Arguments
css (str): css value describing the svg location
'''
script = '''var ev = document.createEvent("SVGEvents");
ev.initEvent("click",true,true);
var target = $("{value}").get(0);
target.dispatchEvent(ev);'''.format(value = css)
return self.driver.execute_script(script)
[docs] def click_button_with_text(self, text):
'''click on any button that matches the text
Arguments
text (str): string matching text value
'''
script = '''return $('button:contains("%s")').click()''' % text
return self.driver.execute_script(script)
[docs] def click_link_with_text(self, text):
'''click on any link with provided link text
Arguments
text (str): string matching link text
'''
return self.driver.find_element_by_link_text(text).click()
[docs] def double_click(self, element = None, locator = None, **kwargs):
'''double click on provided element or locator matching that element
Arguments
element (object): selenium element to double click on
locator (tuple): selenium locator tuple or kwargs describing the
location
'''
if not element:
locator = utils.translate_arguments(locator, **kwargs)
element = self.driver.find_element(locator)
actionChains = ActionChains(self.driver)
actionChains.double_click(element).perform()
[docs] def hover(self, element = None,
x_offset = 0, y_offset = 0, locator = None, **kwargs):
'''hover over a particular element
Arguments
element (object): selenium element to double click on
locator (tuple): selenium locator tuple or kwargs describing the
location
x_offset/y_offset (int): pixel offets from uppler left top corner.
'''
if not element:
locator = utils.translate_arguments(locator, **kwargs)
element = self.driver.find_element(locator)
actionChains = ActionChains(self.driver)
if x_offset or y_offset:
actionChains.move_to_element_with_offset(element,
x_offset,
y_offset).perform()
else:
actionChains.move_to_element(element).perform()
[docs] def select_from_drop_down(self, option, locator = None, **kwargs):
'''select text from drop down list
Arguments
option (text): text to match for selection
locator (tuple): selenium locator tuple or kwargs describing the
location
'''
locator = utils.translate_arguments(locator, **kwargs)
element = self.wait.until.visibility_of_element_located(locator)
select = Select(element)
select.select_by_visible_text(option)
[docs] def type_and_enter(self, value, locator = None, **kwargs):
'''send text + enter key to located element
Arguments
text (str): text to input
locator (tuple): selenium locator tuple or kwargs describing the
location
'''
locator = utils.translate_arguments(locator, **kwargs)
element = self.wait.until.visibility_of_element_located(locator)
return element.send_keys(value, Keys.RETURN)
[docs] def send_return(self, locator = None, **kwargs):
'''send enter key to located element
Arguments
locator (tuple): selenium locator tuple or kwargs describing the
location
'''
locator = utils.translate_arguments(locator, **kwargs)
element = self.wait.until.visibility_of_element_located(locator)
return element.send_keys(Keys.RETURN)
[docs] def send_tab(self, locator = None, **kwargs):
'''send tab key to located element
Arguments
locator (tuple): selenium locator tuple or kwargs describing the
location
'''
locator = utils.translate_arguments(locator, **kwargs)
element = self.wait.until.visibility_of_element_located(locator)
return element.send_keys(Keys.TAB)
[docs] def drag_and_drop(self, source, dest):
'''Drags and drops element from source to destination.
Arguments
source (tuple): locator that needs to be dragged
dest (tuple): locator that needs to be dropped to
'''
source = self.wait.until.visibility_of_element_located(source)
dest = self.wait.until.visibility_of_element_located(dest)
self.drag_and_drop_element(source, dest)
[docs] def drag_and_drop_element(self, source, dest):
'''Drags and drops element from source to destination.
Arguments
source (element): name of the element that needs to be dragged
dest (element): name of the element that needs to be dropped to
'''
ActionChains(self.driver).drag_and_drop(source, dest).perform()
[docs] def jquery_click(self, css):
'''perform a jquery click on provided css element
Arguments
css (str): css value describing the svg location
'''
self.driver.execute_script("$('%s').click()" % css)