2011-01-12 17 views
29

Próbuję zapoznać się z nowym selenem-webowym serwerem ruby, ponieważ wydaje się on bardziej intuicyjny niż poprzednia wersja selenu i sterownika ruby to poszło z tym. Poza tym miałem problem ze starszym selenem do pracy z rubinem 1.9.1 w oknach, więc pomyślałem, że będę szukał alternatywy. tej pory robiłem to z moim skryptu:Jak ustawić opcję wybraną przy użyciu klienta Selenium WebDriver (selen 2.0) w rubinie

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

Więc w zasadzie jestem zalogowaniu do mojej strony i próbuje dodać wpis edukacji do mojego profilu użytkownika .. Mam odwołanie do zaznaczania z opcje (w zmiennej country_select), a teraz chcę wybrać opcję z określoną wartością. Nie widzę sposobu, aby to zrobić w nowym kliencie. Jedyne, co mogę zrobić, to przeglądanie wszystkich opcji do momentu znalezienia tego, którego chcę, a następnie wywołaj metodę execute_script: http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method , aby ustawić selectedIndex.

Czy jest jakiś inny sposób na zrobienie tego? w API Java dla selenu 2.0/webdriver tutaj: http://seleniumhq.org/docs/09_webdriver.html jest przykładem robi to

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

nie wydaje się, że wersja Ruby ma tę funkcję, choć chyba mi czegoś brakuje. Każda pomoc będzie doceniona.

Odpowiedz

17

Należy pamiętać, że żaden z powyższych woli pracować już. Element#select i Element#toggle zostały przestarzałe.Musisz zrobić coś takiego:

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

Pełne ujawnienie tutaj: Nie mam absolutnie żadnej praktycznej wiedzy o Ruby.

Jednak jestem całkiem niezły z Selenium, więc myślę, że mogę pomóc. Myślę, że to, czego szukasz, to metoda select. Jeśli ruby ​​są podobne do innych sterowników, możesz użyć wybranej metody, aby powiedzieć jedną z opcji, które zostały wybrane.

Pod względem pseudokod/JAVA to wyglądać mniej więcej tak

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

Select przedmiot masz powyżej jest faktycznie w specjalnym pakiecie pomocy. istnieje ona tylko dla Java i .NET w tej chwili (sty 2011)

+0

nie wydają się działać, próbowałem country_select = driver.find_element (: XPath "// wybrać [id = 'address_country']/option = 'Austria'") country_select.select i że nie zrobił Nic nie rób. Myślę, że metoda select jest jak wywoływanie select() w javascript (skupia się na polu i podświetla tekst) –

+0

Czy próbowałeś najpierw uzyskać wybrany element, następnie iterować przez opcje WebElement i wywołać metodę select w WebElement, którego chcesz ? – pnewhook

+1

pnewhook dobrze. Oto odpowiednik kodu Ruby: https://gist.github.com/777516 Jeśli Element # select nie działa, być może wypróbuj Przełączenie elementu #. Jeśli uważasz, że API jest zbyt niski, możesz sprawdzić gem Watir-Webdriver jako alternatywny interfejs API dla tej samej technologii. – jarib

6

pnewhook dostał ale chciałbym opublikować wersję rubinowy tu więc każdy może go zobaczyć:

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

Dla najnowszej wersji z Webdriver (RC3) powinieneś użyć "click()" zamiast setSelected(). . Również option.getText() jest równa („Nazwa chcesz”) powinien być stosowany zamiast option.getText() == „Nazwa chcesz” w 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

Kodeksu Ruby z przykładu:

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

Można użyć XPath celu uniknięcia zapętlenie:

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

lub

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 

W moim przypadku jest to tylko jedna próbka robocza.

13

nie wiem jaka wersja Selen do tego doszło, ale wygląda na to, że jest to klasa, która pnewhook Wybierz wspomniano w selen 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

To jest najlepsza odpowiedź! Nie ma potrzeby powtarzania elementów na własną rękę, nie wspominając o konieczności ciągłego przeglądania kodu tag_name => 'option'. Wskazówka: aby uzyskać łatwy dostęp do klasy Select (np. Select.new zamiast Selenium :: WebDriver :: Support :: Select.new), użyj: include Selenium :: WebDriver :: Support –

+3

Jeśli chcesz wybrać według wartości, możesz to również zrobić: '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

Najprostszym sposobem ja znaleziono:

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