2011-01-12 10 views
29

Sto cercando di acquisire familiarità con il nuovo browser web selenio rubino poiché sembra più intuitivo per lo più rispetto alla versione precedente del selenio e del driver del rubino è andato con questo. Inoltre, ho avuto problemi a far funzionare il vecchio selenio con Ruby 1.9.1 in Windows, quindi ho pensato di cercare un'alternativa. Finora ho fatto questo con il mio script:Come impostare un'opzione come selezionata utilizzando il client Selenium WebDriver (selenio 2.0) in rubino

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") 

Quindi, fondamentalmente sto accedendo al mio sito e cercando di aggiungere una voce di istruzione al mio profilo utente .. Ho un riferimento a una casella di selezione con opzioni (nella variabile country_select) e ora voglio selezionare un'opzione con un determinato valore .. Non vedo come farlo nel nuovo client .. L'unica cosa che posso pensare di fare è scorrere tutte le opzioni fino a quando non trovo quello che voglio, e poi chiamo execute_script: http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method metodo per impostare l'Indice selezionato.

C'è un altro modo per farlo? Nella Java API per il selenio 2.0/WebDriver qui: http://seleniumhq.org/docs/09_webdriver.html c'è un esempio di fare questo

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

Non sembra che la versione ruby ​​ha questa caratteristica anche se a meno che non mi manca qualcosa. Qualsiasi aiuto sarebbe apprezzato.

risposta

17

Si prega di notare che nessuno dei volontà sopra lavoro più. Element#select e Element#toggle sono stati deprecati.Hai bisogno di fare qualcosa di simile:

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

Informazioni complete qui: Non ho assolutamente alcuna conoscenza operativa di Ruby.

Tuttavia, sono abbastanza buono con il selenio quindi penso di poterti aiutare. Penso che quello che stai cercando sia il metodo select. Se il ruby ​​è qualcosa come gli altri driver, è possibile utilizzare il metodo select per indicare una delle opzioni selezionate.

In termini pseudocodice/java sarebbe simile a questa

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; 
     } 
    } 

L'oggetto Select si dispone sopra è in realtà in un pacchetto di supporto speciale. Esiste solo per Java e .Net in questo momento (gen 2011)

+0

Questo non sembra funzionare, ho provato country_select = driver.find_element (: xpath, "// selezionare [id = 'address_country']/option = 'Austria'") country_select.select e che didn non fare nulla Penso che il metodo select sia come chiamare select() in javascript (mette a fuoco in un campo ed evidenzia il testo) –

+0

Hai provato prima a ottenere l'elemento select, poi a scorrere le opzioni di WebElement e chiamare il metodo select sul WebElement che vuoi ? – pnewhook

+1

pnewhook capito bene. Ecco il codice Ruby equivalente: https://gist.github.com/777516 Se la selezione di Elemento # non funziona, provare a provare l'interruttore # dell'elemento. Se ritieni che l'API sia di livello troppo basso, potresti voler controllare la gemma watir-webdriver come un'API alternativa alla stessa tecnologia. – jarib

6

pnewhook capito, ma mi piacerebbe inviare la versione rubino qui così tutti possono vedere:

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

Per l'ultima versione di Webdriver (RC3) dovresti usare "click()" invece di setSelected(). . Anche option.getText() è uguale a ("nome che si desidera") dovrebbe essere usato al posto di option.getText() == "Nome che vuoi" in 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

Codice rubino con Esempio:

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

È possibile utilizzare XPath per evitare looping:

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 

Nel mio caso questo è solo un campione funzionante.

13

Non so che cosa selenio versione questo è venuto su, ma sembra che ci sia la classe Select che pnewhook menzionato in 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

Questa è la migliore risposta! Non c'è bisogno di scorrere gli elementi da soli, per non parlare di dover guardare: tag_name => 'opzione' più e più volte nel tuo codice. Suggerimento: per accedere facilmente alla classe Select (ad esempio Select.new al posto di Selenium :: WebDriver :: Support :: Select.new), utilizzare: include Selenium :: WebDriver :: Support –

+3

Se si desidera selezionare per valore, puoi farlo anche tu: '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

Il modo più semplice che è stato trovato:

select_elem.find_element (: css, "option [value = 'some_value']"). click

Problemi correlati