2011-01-12 14 views
29

? Estoy tratando de familiarizarme con el nuevo ruby ​​selenium-webdriver ya que parece más intuitivo que la versión anterior de selenio y el driver ruby. eso fue con eso. Además, tuve problemas para conseguir que el viejo selenio funcionara con ruby ​​1.9.1 en windows, así que pensé que buscaría una alternativa. Hasta ahora lo he hecho con mi guión:¿Cómo configuro una opción como seleccionada usando el cliente Selenium WebDriver (selenium 2.0) en ruby ​​

require "selenium-webdriver" 

driver = Selenium::WebDriver.for :firefox 
driver.get "https://example.com" 

element = driver.find_element(:name, 'username') 
element.send_keys "mwolfe" 
element = driver.find_element(:name, 'password') 
element.send_keys "mypass" 
driver.find_element(:id, "sign-in-button").click 
driver.find_element(:id,"menu-link-my_profile_professional_info").click 
driver.find_element(:id,"add_education_btn").click 
country_select = driver.find_element(:name, "address_country") 

Así que básicamente estoy ingresando a mi sitio y tratar de añadir una entrada de educación al perfil de usuario .. tengo una referencia a un cuadro de selección con opciones (en la variable country_select) y ahora quiero seleccionar una opción con un valor determinado ... No veo cómo hacer esto en el nuevo cliente ... Lo único que se me ocurre hacer es recorrer todas las opciones hasta que encuentre el que quiero, y luego ejecute execute_script: http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method método para establecer el selectedIndex.

¿Hay alguna otra manera de hacerlo? En la API de Java para el selenio 2.0/WebDriver aquí: http://seleniumhq.org/docs/09_webdriver.html no es un ejemplo de hacer esto

Select select = new Select(driver.findElement(By.xpath("//select"))); 
select.deselectAll(); 
select.selectByVisibleText("Edam"); 

No parece que la versión de rubí tiene esta característica, aunque a menos que me falta algo. Cualquier ayuda sería apreciada.

Respuesta

17

Tenga en cuenta que ninguna de la voluntad por encima de trabajar más Element#select y Element#toggle han quedado en desuso.Es necesario hacer algo como:

my_select.click 
my_select.find_elements(:tag_name => "option").find do |option| 
    option.text == value 
end.click 
34

Descripción completa aquí: No tengo absolutamente ningún conocimiento práctico de Ruby.

Sin embargo, soy bastante bueno con Selenium, así que creo que puedo ayudar. Creo que lo que estás buscando es el método select. Si ruby ​​se parece a los otros controladores, puede usar el método de selección para indicar una de las opciones que está seleccionado.

En términos pseudocódigo/java se vería algo como esto

WebElement select = driver.findElement(By.name("select")); 
    List<WebElement> options = select.findElements(By.tagName("option")); 
    for(WebElement option : options){ 
     if(option.getText().equals("Name you want")) { 
      option.click(); 
      break; 
     } 
    } 

La Selección de objeto que tiene encima es en realidad en un paquete especial de ayudas. Sólo existe para Java y .Net en el momento (ene 2011)

+0

Esto no parece funcionar, he intentado country_select = driver.find_element (: XPath, "// seleccionar [id = 'address_country']/opción = 'Austria'") country_select.select y que didn no hagas nada Creo que el método de selección es como llamar a select() en javascript (pone el foco en un campo y resalta el texto) –

+0

¿Intentó primero obtener el elemento seleccionado, luego iterar a través de las opciones de WebElement y llamar al método de selección en el WebElement que desea ? – pnewhook

+1

pnewhook lo hizo bien. Aquí está el código Ruby equivalente: https://gist.github.com/777516 Si la selección del elemento # no funciona, quizás intente con la opción Element # toggle. Si crees que la API tiene un nivel demasiado bajo, es posible que desees consultar la gema watir-webdriver como una API alternativa a la misma tecnología. – jarib

6

pnewhook lo consiguió pero me gustaría para publicar la versión rubí aquí para que todos puedan verlo:

require "selenium-webdriver" 
driver = Selenium::WebDriver.for :firefox 
driver.manage.timeouts.implicit_wait = 10 
driver.get "https://mysite.com" 
country_select = driver.find_element(:id=> "address_country") 
options = country_select.find_elements(:tag_name=>"option") 
options.each do |el| 
    if (el.value == "USA") 
     el.select() 
     break 
    end 
end 
2

Para la última versión de Webdriver (RC3) debe usar "click()" en lugar de setSelected(). . También option.getText() es igual ("nombre que desea") se debe utilizar en lugar de option.getText() == "nombre que desea" en JAVA:

<!-- language: lang-java --> 
WebElement select = driver.findElement(By.name("select")); 
List<WebElement> options = select.findElements(By.tagName("option")); 
for(WebElement option : options){ 
    if(option.getText().equals("Name you want"){ 
     option.click(); 
     break; 
    } 
} 
1

Código rubí con Ejemplo:

require "selenium-webdriver" 

driver = Selenium::WebDriver.for :ie 

driver.navigate.to "http://google.com" 
a=driver.find_element(:link,'Advanced search') 

a.click 


a=driver.find_element(:name,'num') 

options=a.find_elements(:tag_name=>"option") 
options.each do |g| 
    if g.text == "20 results" 
    g.click 
    break 
    end 
end 
6

Usted puede utilizar XPath para evitar bucles:

String nameYouWant = "Name you want"; 
WebElement select = driver.findElement(By.id(id)); 
WebElement option = 
    select.findElement(By.xpath("//option[contains(text(),'" + nameYouWant + "')]")); 
option.click(); 

o

WebElement option = 
    select.findElement(By.xpath("//option[text()='" + nameYouWant + "']")); 
2
require "selenium-webdriver" 
webdriver = Selenium::WebDriver.for :firefox 

driver.navigate.to url 

dropdown = webdriver.find_element(:id,dropdownid) 
return nil if dropdown.nil? 
selected = dropdown.find_elements(:tag_name,"option").detect { |option| option.attribute('text').eql? value} 
if selected.nil? then 
    puts "Can't find value in dropdown list" 
else 
    selected.click 
end 

En mi caso, esta es solo una muestra de trabajo.

13

No sé qué versión de selenio sucedió esto, pero parece que no es la clase selecta que pnewhook menciona en Selenio 2,20

http://selenium.googlecode.com/svn-history/r15117/trunk/docs/api/rb/Selenium/WebDriver/Support/Select.html

option = Selenium::WebDriver::Support::Select.new(@driver.find_element(:xpath => "//select")) 
option.select_by(:text, "Edam") 
+3

¡Esta es la mejor respuesta! No hay necesidad de iterar elementos por su cuenta, sin mencionar tener que mirar una y otra vez en su código: tag_name => 'option'. Consejo profesional: para acceder fácilmente a la clase Select (es decir, Select.new en lugar de Selenium :: WebDriver :: Support :: Select.new), use: include Selenium :: WebDriver :: Support –

+3

Si desea seleccionar por valor, usted puede hacer eso también: 'option.select_by (: value," edam ")' – chiborg

0
#SELECT FROM DROPDOWN IN RUBY USING SELENIUM WEBDRIVER 
#AUTHOR:AYAN DATE:14 June 2012 

require "rubygems" 
require "selenium-webdriver" 



    begin 
    @driver = Selenium::WebDriver.for :firefox 
    @base_url = "http://www.yoururl.com" 
    @driver.manage.timeouts.implicit_wait = 30 

    @driver.get "http://www.yoursite.com" 


    #select Urugway as Country 
    Selenium::WebDriver::Support::Select.new(@driver.find_element(:id, "country")).select_by(:text, "Uruguay") 

     rescue Exception => e 
     puts e 
     @driver.quit 


    end 
0

La manera más fácil que encontrado fue:

select_elem.find_element (: css, "opción [value = 'some_value']"). haga clic en

Cuestiones relacionadas