Skip to content

Instantly share code, notes, and snippets.

@adamgoucher
Created October 31, 2012 00:51
Show Gist options
  • Save adamgoucher/3984135 to your computer and use it in GitHub Desktop.
Save adamgoucher/3984135 to your computer and use it in GitHub Desktop.
page object-ish class for jquery.ui.selectmenu and python webdriver
from selenium.common.exceptions import UnexpectedTagNameException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
class Selectmenu(object):
def __init__(self, webelement):
if webelement.tag_name.lower() != "select":
raise UnexpectedTagNameException(
"Selectmenu only works on <select> elements, not on <%s>" %
webelement.tag_name)
if webelement.is_displayed():
raise ElementNotVisibleException(
"jquery.ui.selectmenu select's are hidden. This is not.")
self._id = webelement.get_attribute("id")
self.driver = webelement._parent
@property
def options(self):
ul = self.driver.find_element_by_id("%s-menu" % self._id)
options = ul.find_elements_by_css_selector('a[role="option"]')
visible_text = []
for option in options:
visible_text.append(self.driver.execute_script(
"""
var element = arguments[0];
if (element.innerText) {
return element.innerText;
} else {
return element.textContent;
}
""",
option
))
return visible_text
def select_by_visible_text(self, text):
w = WebDriverWait(self.driver, 5)
ul = self.driver.find_element_by_id("%s-menu" % self._id)
a = ul.find_element_by_xpath('//a[text()="%s"]' % text)
li = ul.find_element_by_xpath('//a[text()="%s"]/..' % text)
self.driver.find_element_by_id("%s-button" % self._id).click()
w.until(lambda driver : a.is_displayed())
# holy cow this is a hack, but there is some bit of internal state
# i don't know how to sync on happening here. this makes it work and
# my head hurts so giving up
import time
time.sleep(1)
ac = ActionChains(self.driver)
ac.click_and_hold(a)
ac.release(li)
ac.perform()
w.until(lambda driver : not a.is_displayed())
@property
def first_selected_option(self):
button = self.driver.find_element_by_id("%s-button" % self._id)
return button.find_element_by_css_selector('.ui-selectmenu-status').text
from selenium.webdriver import Firefox
from selenium.webdriver.support.wait import WebDriverWait
from selectmenu import Selectmenu
class TestSelectmenu(object):
def setup_method(self, method):
self.driver = Firefox()
self.driver.get("http://jquery-ui.googlecode.com/svn/branches/labs/selectmenu/index.html")
def teardown_method(self, method):
self.driver.quit()
def test_options(self):
select = self.driver.find_element_by_id("speedA")
selectmenu = Selectmenu(select)
assert(len(selectmenu.options) == 5)
def test_select_by_visible_text(self):
select = self.driver.find_element_by_id("speedA")
selectmenu = Selectmenu(select)
selectmenu.select_by_visible_text('Faster')
assert(selectmenu.first_selected_option == 'Faster')
def test_first_selected_option(self):
select = self.driver.find_element_by_id("speedA")
selectmenu = Selectmenu(select)
assert(selectmenu.first_selected_option == 'Medium')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment