2011-01-12 4 views
29

Ich versuche, mit dem neuen Rubin Selen-Webdriver vertraut zu machen, da es mehr intuitiv als die vorherige Version von Selen und der Ruby-Treiber scheint das ging damit. Außerdem hatte ich Probleme, das alte Selen mit Ruby 1.9.1 in Windows zu arbeiten, also dachte ich, ich würde nach einer Alternative suchen. Bisher habe ich das mit meinem Skript getan habe:Wie stelle ich eine Option wie Selenium WebDriver (Selen 2.0) Client in 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") 

Also im Grunde in meiner Website ich anmelden und versuchen, eine Ausbildung Eintrag für mein Benutzerprofil hinzuzufügen .. Ich habe einen Verweis auf eine Auswahlbox mit Optionen (in der Variable country_select) und jetzt möchte ich eine Option mit einem bestimmten Wert auswählen. Ich sehe nicht, wie dies in dem neuen Client zu tun ist. Das einzige, was mir einfällt, ist das Durchlaufen aller Optionen bis ich die gewünschte finde und dann execute_script aufrufen: http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method Methode, um den selectedIndex zu setzen.

Gibt es eine andere Möglichkeit, dies zu tun? In der Java-API für Selen 2.0/WebDriver hier: http://seleniumhq.org/docs/09_webdriver.html es ist ein Beispiel für diese Es erscheint

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

tun nicht, dass die Ruby-Version, obwohl diese Funktion hat, es sei denn ich etwas fehle. Jede Hilfe wäre willkommen.

Antwort

17

Bitte beachten Sie, dass keine der oben genannten Willen arbeite mehr. Element#select und Element#toggle sind veraltet.Sie tun müssen, um so etwas wie:

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

Volle Offenlegung hier: Ich habe absolut keine Kenntnisse von Ruby.

Allerdings bin ich ziemlich gut mit Selenium, also denke ich, dass ich helfen kann. Ich denke, was Sie suchen, ist die select Methode. Wenn Ruby den anderen Treibern ähnlich ist, können Sie die Select-Methode verwenden, um eine der ausgewählten Optionen anzugeben.

In Pseudo-Code/java Bedingungen wäre es etwas so aussehen

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

Das Objekt wählen Sie oben haben tatsächlich in einem speziellen Support-Paket ist. Es existiert nur für Java und .NET zur Zeit (Jan 2011)

+0

Dies nicht zu funktionieren scheint, habe ich versucht, country_select = driver.find_element (: xpath "[id = 'ADDRESS_COUNTRY'] // wählen/option = 'Österreich'") country_select.select und dass didn tu nichts. Ich denke, die Select-Methode ist wie Aufruf von select() in Javascript (legt den Fokus in einem Feld und markiert den Text) –

+0

Haben Sie zuerst das select-Element versucht, durchlaufen Sie dann die WebElement-Optionen und rufen Sie die select-Methode für das gewünschte WebElement auf ? – pnewhook

+1

pnewhook hat es richtig gemacht. Hier ist der entsprechende Ruby-Code: https://gist.github.com/777516 Wenn Element # Auswahl funktioniert nicht, versuchen Sie vielleicht Element # toggle. Wenn Sie der Meinung sind, dass die API zu niedrig ist, sollten Sie das WATIR-Webdriver-Juwel als alternative API für die gleiche Technologie ausprobieren. – jarib

6

pnewhook es bekam, aber ich mag die Ruby-Version hier veröffentlichen, damit jeder sehen kann:

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

Für die neueste Version von Webdriver (RC3) sollten Sie statt setSelected() "click()" verwenden. . Auch option.getText() gleich ("Name Sie wollen") sollten statt option.getText verwendet werden() == "Name, den Sie wollen" 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

Ruby-Code mit Beispiel:

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

Sie XPath können Looping zu vermeiden:

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

oder

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 

In meinem Fall ist dies nur ein funktionierendes Beispiel.

13

Ich weiß nicht, welche Version Selen dazu kam, aber es sieht aus wie es die Select-Klasse, die in Selenium 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

Dies ist die beste Antwort! Es gibt keine Notwendigkeit, Elemente selbst zu durchlaufen, ganz zu schweigen davon, dass Sie in Ihrem Code immer wieder nachsehen müssen: tag_name => 'option'. Pro-Tipp: Für den einfachen Zugriff auf die Select-Klasse (zB Select.new anstelle von Selenium :: WebDriver :: Support :: Select.new), verwenden Sie: include Selenium :: WebDriver :: Support –

+3

Wenn Sie nach Wert auswählen möchten, Sie können das auch tun: '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

Der einfachste Weg, die ich erwähnt pnewhook gefunden wurde:

select_elem.find_element. (: css "Option [value = 'some_value']") klicken