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

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 사용)에서 첫 번째, 두 번째, 세 번째 등의 옵션을 어떻게 선택할 수 있습니까?



답변

메소드 의 소스를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


답변

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

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

나를 위해 일했다.


답변

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

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


답변

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

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

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


답변

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

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

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


답변

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

그러나 이것은했다 :

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


답변

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

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...