¿Interactuando con el menú desplegable de JavaScript usando WebDriver y Ruby?

Estoy escribiendo la automatización para una página web con Ruby y Selenium WebDriver pero he encontrado un problema de locking con algunos de los menús desplegables en el sitio que se realizan con JavaScript en lugar de HTML estándar. En estos menús desplegables, los usuarios pueden seleccionar una opción del menú desplegable o hacer clic en ella y comenzar a escribir para filtrar los resultados según lo que se haya escrito (supongo que la idea es que estos menús desplegables son para listas potencialmente muy largas de opciones).

El problema es que no puedo encontrar una manera de interactuar con ellos usando WebDriver, aunque he logrado que funcione en el IDE de Selenium usando el siguiente código, pero exportar este script IDE a Ruby no funciona:

 select css=select[name=dsref] demo  

El código de WebDriver que estoy usando es:

 def clickOn (parameters = {}) # This will accept a locator type and name to click on # # EXAMPLE # # clickOn( # locatorType: :link, # locatorName: 'Home' # ) # # This will click on the link named 'Home' locatorType = parameters[:locatorType] locatorName = parameters[:locatorName] $driver.find_element(locatorType, locatorName).click end clickOn( locatorType: :xpath, locatorName: '/html/body/form/fieldset[4]/div[2]/div/div/div/a/span' ) 

Luego intenté ubicar la selección del menú desplegable de la misma manera utilizando la ruta x del campo de valores ocultos, pero no puedo ubicar los valores ocultos.

El javascript con el que estoy tratando de interactuar es:

 

chosen=Chosen { form_field=select#sel2DZ.admn_dropdownmenu, options= {...}, active_field= true , more...} demo demo download
demo
  • demo
  • demo download

¿Alguna idea sobre cómo puedo establecer el valor de este menú desplegable utilizando Ruby WebDriver?

El javascript solo está interactuando con un desplegable oculto, por lo que puede mostrar el desplegable real usando:

 @driver.execute_script("document.getElementsByName('#{ 

Esto configurará la visualización del menú desplegable oculto en "bloque" para que pueda interactuar con él de manera normal.

Trabajo con la API de Python, pero creo que deberías entender el enfoque. Aquí está el método que estoy usando en mis pruebas. Así que en realidad hago clic en el enlace, espero a que aparezca el menú desplegable, haga clic en la opción.

 def select_random_js_dropdown_option(driver, link_to_call_dropdown_xpath, dropdown_option_xpath): options = driver.find_elements_by_xpath(dropdown_option_xpath) driver.find_element_by_xpath(link_to_call_dropdown_xpath).click() wait_for_element_to_load(driver, dropdown_option_xpath) random.choice(options).click() def wait_for_element_to_load(driver, element_xpath, time_to_wait): try: return WebDriverWait(driver, time_to_wait).until(lambda driver : driver.find_element_by_xpath(element_xpath).is_displayed()) finally: pass 

Así es como uso Ruby para interactuar con un menú desplegable.

 Selenium::WebDriver::Support::Select.new(@driver.find_element(:name, name)).select_by(:text, data_to_select) 

Así es como selecciono de la lista desplegable en Ruby:

 option = Selenium::WebDriver::Support::Select.new(browser.find_element(:id => "00NZ0000001G35y") ) option.select_by(:text, "Mumbai") 

Espero que te ayude!