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.