2012-09-04 16 views
56

Dla HTMLKapibara: Wybierz opcję przy wartości nie tekst

<select id="date"> 
    <option value="20120904">Tue 4 Sep 2012</option> 
    <option value="20120905">Wed 5 Sep 2012</option> 
    <option value="20120906">Thu 6 Sep 2012</option> 
</select> 

Mam następujący kod Kapibara Ruby

select "20120905", :from => "date" 

ale to błędy z:

cannot select option, no option with text '20120905' in select box 'date' (Capybara::ElementNotFound) 

jednak , jeśli wykonam

select "Wed 5 Sep 2012", :from => "date" 

Jest OK.

Czy jest możliwe wybranie opcji w Capybara przez Wartość nie Tekst?

Dzięki

Odpowiedz

66

Będzie to działać, aby wybrać opcję, wartość:

find("option[value='20120905']").click 

Aby utrzymać zakres selektora można owinąć go w obrębie bloku jako takie:

within '#date' do 
    find("option[value='20120905']").click 
end 
+22

Po przejściu z Selenium do Poltergeist stwierdzono, że ta metoda nie działa. Dlatego zastąpiony przez find ('# select_id'). Find ('option [value = "1"]') select_option Przepraszamy za zły angielski. – woto

+0

@ woto Wszystkie te opcje nie działają dla mnie. Zasadniczo opcja znajduje się bez problemów. Sprawdziłem wynik i znalazłem poprawną opcję, ale go nie kliknąłem ani nie wybrałem. Myślę, że najpierw trzeba otworzyć select przed wybraniem opcji. –

4

Można go również uzyskać, wykonując następujące czynności:

find_by_id('date').find("option[value='20120905']").click 
38

Z Poltergeist jako kierowca nie mogę kliknąć na opcję jak sugerowano w niektórych z pozostałych opcji powyżej, zamiast tego można wykonać następujące czynności:

page.find_by_id('date').find("option[value='20120905']").select_option

+0

Bardzo przydatne. Stworzyłem metodę pomocnika w spec/support/capybara.rb: def opcje_sekcji id = parametry [: id] wartość = parametry [: wartość] page.find_by_id (id) .find ("opcja [wartość = '# {value} '] "). select_option end – justingordon

+3

' click' bo dla mnie 'Element, z którym próbujesz wejść w interakcję, nie jest częścią DOM lub nie jest aktualnie widoczny na stronie' ale 'select_option' działa dla mi w porządku. Dzięki! –

+0

Jest to również odpowiedź dla web-capibara. – dojosto

18

Napisałem metody pomocnika:

def select_by_value(id, value) 
    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 
    option = find(:xpath, option_xpath).text 
    select(option, :from => id) 
end 

zapisywania w pliku .rb w specyfikacji/wsparcia/

przykład zastosowanie:

before do 
    select_by_value 'some_field_id', 'value' 
    click_button 'Submit' 
end 
+0

Intencja - ujawniająca się nazwa, dobra realizacja. Dzięki. – slothbear

+0

To (nadal) wydaje się być jedyną wersją, która działa bez javascript i jest w pewnym stopniu niezależna od sterownika ... – Patru

0

Kliknij użyciu find_field działa dobrze:

find_field("date").find("option[value='20120905']").click 
+0

Dało mi to błąd. Nie można znaleźć css "opcja [wartość = '20120905']" –

1

Metoda pomocnik całkiem sprytny. Chciałbym zmienić to trochę:

def select_by_value(id, value) 

    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 

    find(:xpath, option_xpath).click 

koniec

lub po prostu:

find(:xpath, "//select[@id='date']/option[@value='20120904']").click 
0

Można również użyć capybara-ui który będzie wyglądał pierwszy dopasować tekst, a następnie dopasować wartość.

# define your form widget, in this case in a role 
class UserRole < Capybara::UI::Role 
    form :my_form do 
    select :my_select, 'my_select' 
    end 
end 

# then just submit your form params via #submit 
role = UserRole.new 

role.submit :my_form, my_select: '20120905' 

Zobacz więcej o formach kapibara-ui here.

1

W moim przypadku mam kilka opcji z tym samym tekstem, dlatego muszę wybierać według wartości. Łącząc kilka odpowiedzi, znalazłem dla mnie najlepsze rozwiązanie:

 
def select_by_value(id, value) 
    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 
    find(:xpath, option_xpath).select_option 
end 
Powiązane problemy