programing

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

lovejava 2023. 6. 3. 07:53

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 "option_name_here", :from => "organizationSelect"

저를 위해 일했습니다.

방법의 출처를 살펴보면, 당신이 통과했을 때 그것이 무엇을 하는지를 알 수 있습니다.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

다른 옵션은 다음과 같은 방법을 추가하는 것입니다.

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

파일에 또 다른 답을 추가하려면(설정에 따라 매우 많은 방법이 있기 때문에) - 리터럴을 선택하여 수행했습니다.option요소 및 클릭

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

별로 예쁘지는 않지만 효과가 있습니다 :/

불행하게도, 가장 인기 있는 대답은 저에게 전적으로 효과가 없었습니다.추가해야 했습니다..select_option진술의 끝까지

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

을 제외하고select_option선택이 수행되지 않았습니다.

Capybara 2.7에서 2017년에는 어떤 대답도 저에게 효과가 없었습니다."ArgumentError: 잘못된 인수 수(2개 지정, 예상되는 0개)"를 받았습니다.

하지만 이는 다음과 같습니다.

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

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

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

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

Capybara에서는 xpath로만 찾을 수 있습니다.

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

메소드 클릭

simple_form을 사용했습니다.

연결로 작업할 때:

= f.association :company, collection: Company.ordered, as: :select, include_blank: false
# output HTML
<select class="form__input" name="role[company_id]" id="role_company_id">
  <option value="1">APPLE</option>
  <option value="5">J.P. MORGAN</option>
  <option value="6">JOHNSON &amp; JOHNSON</option>
  <option value="4">KPMG</option>
  <option value="2">MICROSOFT</option>
  <option value="3">WALMART</option>
</select>

이것은 나에게 효과가 있었습니다.

find('#role_company_id').find(:xpath, 'option[3]').select_option

일반적인 작업 시 다음을 선택합니다.

= f.input :work_type, as: :select, collection: Role.work_types.collect { |key, value| [key.to_s.titleize, value] }, include_blank: false
# output HTML
<select class="form__input" name="role[work_type]" id="role_work_type">
  <option selected="selected" value="in_person">In Person</option>
  <option value="remote">Remote</option>
  <option value="hybrid">Hybrid</option>
</select>

이것은 나에게 효과가 있었습니다.

find_by_id("role_work_type").find("option[value='remote']").click

이게 도움이 되길 바랍니다.

이것은 단연코 가장 간단한 것입니다.

select("month", from: "repeat_on")

from매개 변수는 다음과 같아야 합니다.id다음과 같이:

<select id="repeat_on">
    <option value="month">month</option>
    <option value="day">day</option>
</select>

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

조직에 맞는 모델을 만듭니다. 추가로:HTML을 채우는 것이 더 쉬울 것입니다.

모델에 대한 공장(FactoryGirl)을 만듭니다.

공장과 함께 목록(create_list)을 생성합니다.

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

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

언급URL : https://stackoverflow.com/questions/20134085/how-to-select-option-in-drop-down-using-capybara