You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.2 KiB
59 lines
2.2 KiB
""" Control a react-select droplist. """
|
|
|
|
from selenium.webdriver.common.keys import Keys
|
|
|
|
from asl_articles.tests.utils import find_child, find_children
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
class ReactSelect:
|
|
"""Control a react-select droplist."""
|
|
|
|
def __init__( self, elem ):
|
|
self.select = elem
|
|
|
|
def select_by_name( self, val ):
|
|
"""Select an option by name."""
|
|
find_child( ".react-select__dropdown-indicator", self.select ).click()
|
|
options = [ e for e in find_children( ".react-select__option", self.select )
|
|
if e.text == val
|
|
]
|
|
assert len( options ) == 1
|
|
options[0].click()
|
|
|
|
def get_multiselect_choices( self ):
|
|
"""Get the available multi-select choices."""
|
|
btn = find_child( ".react-select__dropdown-indicator", self.select )
|
|
btn.click() # show the dropdown
|
|
choices = [ e.text for e in find_children( ".react-select__option", self.select ) ]
|
|
btn.click() # close the dropdown
|
|
return choices
|
|
|
|
def get_multiselect_values( self ):
|
|
"""Get the current multi-select values."""
|
|
return [ e.text for e in find_children( ".react-select__multi-value", self.select ) ]
|
|
|
|
def update_multiselect_values( self, *vals ):
|
|
"""Add/remove multi-select values."""
|
|
for v in vals:
|
|
if v.startswith( "+" ):
|
|
self.add_multiselect_value( v[1:] )
|
|
elif v.startswith( "-" ):
|
|
self.remove_multiselect_value( v[1:] )
|
|
else:
|
|
assert False, "Multi-select values must start with +/-."
|
|
|
|
def add_multiselect_value( self, val ):
|
|
"""Add a multi-select value."""
|
|
elem = find_child( "input", self.select )
|
|
elem.clear()
|
|
elem.send_keys( val )
|
|
elem.send_keys( Keys.RETURN )
|
|
|
|
def remove_multiselect_value( self, val ):
|
|
"""Remove a multi-select value."""
|
|
for elem in find_children( ".react-select__multi-value", self.select ):
|
|
if elem.text == val:
|
|
find_child( ".react-select__multi-value__remove", elem ).click()
|
|
return
|
|
assert False, "Can't find multi-select value: {}".format( val )
|
|
|