ruby - dropdowns - selenium select option c#
¿Cómo configuro una opción como seleccionada usando el cliente Selenium WebDriver(selenio 2.0) en ruby? (10)
Código Ruby 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
Estoy tratando de familiarizarme con el nuevo ruby selenium-webdriver, ya que parece ser más intuitivo que la versión anterior de selenio y el controlador de ruby que lo acompaña. 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 he hecho esto con mi script:
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")
Básicamente, estoy iniciando sesión en mi sitio y tratando de agregar una entrada de educación a mi 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 la que quiero, y luego ejecutar 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 hacer esto? En la API java para selenio 2.0 / webdriver aquí: http://seleniumhq.org/docs/09_webdriver.html hay un ejemplo de cómo hacer esto
Select select = new Select(driver.findElement(By.xpath("//select")));
select.deselectAll();
select.selectByVisibleText("Edam");
No parece que la versión de ruby tenga esta característica, a menos que me falta algo. Cualquier ayuda sería apreciada.
Divulgación completa aquí: no tengo 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 de 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 de 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;
}
}
El objeto Select que tienes arriba está realmente en un paquete de Soporte especial. Solo existe para Java y .Net en este momento (enero de 2011)
La forma más fácil que encontré fue:
select_elem.find_element (: css, "option [value = ''some_value'']"). click
No sé de qué versión de Selenio surgió, pero parece que existe la clase Select que pnewhook mencionó en Selenium 2.20
option = Selenium::WebDriver::Support::Select.new(@driver.find_element(:xpath => "//select"))
option.select_by(:text, "Edam")
Para la última versión de Webdriver (RC3) debe usar "click ()" en lugar de setSelected (). También option.getText (). Equals ("Name you want") debería usarse en lugar de option.getText () == "Name you want" 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;
}
}
Puedes usar XPath para evitar el bucle:
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 + "'']"));
Tenga en cuenta que ninguno de los anteriores funcionará más. Element#select
y Element#toggle
han quedado en desuso. Necesitas hacer algo como:
my_select.click
my_select.find_elements( :tag_name => "option" ).find do |option|
option.text == value
end.click
pnewhook lo consiguió, pero me gustaría publicar la versión de ruby aquí para que todos puedan verla:
require "selenium-webdriver"
driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10
driver.get "https://example.com"
country_select = driver.find_element(:id=> "address_country")
options = country_select.find_elements(:tag_name=>"option")
options.each do |el|
if (el.attributes("value") == "USA")
el.click()
break
end
end
#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
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.