Capybara를 사용하여 드롭 다운에서 옵션을 선택하는 방법


125

Capybara (2.1.0)를 사용하여 드롭 다운 메뉴에서 항목을 선택하려고합니다.

숫자로 선택하고 싶습니다 (두 번째, 세 번째 등의 옵션 선택을 의미 함).

나는 모든 종류의 일을 시도하는 것이 좋지만 운이없는 것을 좋아했습니다.

값을 사용하여 선택할 수있었습니다.

 find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click

그러나 그 방법으로 b / c 방법을 사용하고 싶지 않습니다. 값이 바뀌고 테스트가 취약합니다.

드롭 다운의 HTML은 다음과 같습니다.

<td class="value">
    <select name="organizationSelect" id="organizationSelect" class="required">
     <option value="NULL">Choose...</option>
     <option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8">&nbsp;Institution1</option>
     <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;Institution / test</option>
    </select>
</td>

나는 또한 이것을 시도했다 :

  option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text  
  select(option, :from => organizationSelect)

그러나이 오류가 발생합니다 :

Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous)

드롭 다운 (Capybara 사용)에서 첫 번째, 두 번째, 세 번째 등의 옵션을 어떻게 선택할 수 있습니까?

답변:


129

메소드 의 소스를select 살펴보면 from키 를 전달할 때 수행하는 작업 이 본질적으로 다음과 같은 것을 알 수 있습니다 .

find(:select, from, options).find(:option, value, options).select_option

즉,이 발견 <select>당신이있는 거 관심 분야는 다음을 발견 <option>한 후, 그 내에서 호출 select_option상의 <option>노드입니다.

당신은 이미 처음 두 가지를 거의 끝냈습니다. 나는 그것들을 재 배열했습니다. 그런 다음 select_option마지막에 방법 을 사용할 수 있습니다 .

find('#organizationSelect').find(:xpath, 'option[2]').select_option

1
캐롤 너무 감사합니다! 도움을 주셔서 감사합니다! : D
Farooq

2
앞으로 이것을 연구하는 사람들을 위해이 참고 문헌을 추가하고 싶습니다 : gist.github.com/zhengjia/428105
BKSpurgeon

3
좋은 답변입니다! Rails 5에서 다음과 같은 방법으로도 추가하고 싶습니다 select('option_name', from: 'select_box'). 값은 id, name, 관련 레이블 요소가 될 수 있습니다. Capybara 및 DSL 옵션에 대한 자세한 내용은 여기를 참조하십시오 .
Nesha Zoric

177

어떤 이유로 그것은 나를 위해 작동하지 않았습니다. 그래서 나는 다른 것을 사용해야했습니다.

select "option_name_here", :from => "organizationSelect"

나를 위해 일했다.


1
방법이 적어도 3 가지 옵션을 취하는 것처럼 보이기 때문에 이상하게 작동하지 않습니다. 제안한 코드는 capybara 가이드의 예제 코드와 일치하지만
Linus

1
그렇지 않은 form, 그것은이다 from. 다음은 select
fontno

3
from 값에 주목할 가치는 아마도 이름, 아이디 또는 레이블 텍스트 일 ​​것입니다. 즉, "#organizationSelect"는 올바르지 않지만 "organizationSelect"는 작동해야합니다.
MZB

이것은 나를 위해 작동하지 않았지만 carols10cents의 솔루션은 효과가있었습니다. 이것은 당신의 대답에 대한 비평가가 아닙니다. 최신 버전의 카피 바라에서도조차도 일부 전화가 작동하고 직감으로 인해 여러 솔루션이 유효 해 보인다고 믿어도 전화가 안된다는 것이 정말 이상합니다. 날 미치게 만들어 이것은 파이어 폭스와 관련이 있습니까 (또는 어떤 브라우저 카피 바라가 사용합니까?)
혼돈 이론

옵션 이름과 옵션 값이 동일한 경우에만 작동한다고 생각합니다.
pixelearth

8

또 다른 옵션은 이와 같은 방법을 추가하는 것입니다

  def select_option(css_selector, value)
    find(:css, css_selector).find(:option, value).select_option
  end

유용한 옵션find("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option옵션 옵션의 값은 그렇지 않은 동안 표시된 옵션 텍스트 인 나를 위해 일했습니다.
codenoob

4

불행히도 가장 인기있는 답변은 전적으로 효과가 없었습니다. 나는 .select_option진술의 끝에 추가해야했다

select("option_name_here", from: "organizationSelect").select_option

없이는 select_option선택이 수행되지 않았습니다.


메소드가 부울 값을 반환하기 .select_option때문에 어떻게 호출 할 수 select있습니까?
Ruby

4

더미에 또 다른 대답을 추가하려면 (설정에 따라 너무 많은 방법이 있기 때문에) 리터럴 option요소 를 선택 하고 클릭하여 수행했습니다.

find(".some-selector-for-dropdown option[value='1234']").select_option

별로 예쁘지는 않지만 작동합니다.


2

capybara 2.7과 함께 2017 년에는 아무런 대답도 없었습니다. "ArgumentError : 잘못된 수의 인수 (주어진 2, 예상 된 0)"가 ​​있습니다.

그러나 이것은했다 :

find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option

0

직접 답변은 아니지만 서버에서 허용하는 경우 다음을 수행 할 수 있습니다.

1) 조직의 모델을 작성하십시오. 추가 : HTML을 채우는 것이 더 쉬울 것입니다.

2) 모델에 대한 팩토리 (FactoryGirl)를 작성하십시오.

3) 팩토리를 사용하여 목록 (create_list)을 작성하십시오.

4) 다음을 사용하여 목록에서 조직을 '선택'(샘플)합니다.

# Random select
option = Organization.all.sample 

# Select the FIRST(0) by id
option = Organization.all[0] 

# Select the SECOND(1) after some restriction
option = Organization.where(some_attr: some_value)[2]
option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on... 

4
내가 모델을 만들 필요가있는 경우, 카피 바라 사용하여 의미가 없습니다
user1735921을

전혀 답이 아닙니다. 이것은 Capybara에 관한 질문입니다.
로빈 도허티

0

내가 찾은 가장 간결한 방법은 다음과 같습니다 (capybara 3.3.0 및 크롬 드라이버 사용).

all('#id-of-select option')[1].select_option

두 번째 옵션을 선택합니다. 필요에 따라 인덱스를 증가시킵니다.


0

카피 바라으로 만 사용할 수 있습니다 찾을 수XPath는

find(:xpath, "//*[@id='organizationSelect']/option[2]").click

방법 클릭

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.