2015-01-19 1 views
1

루비 1.9.3가, 3.1.10, RSpec에 2.13.0 레일과 카피 바라 2.2.1, 나는 페이지에서 오전, 주어진 부분 ID (아마도 정규식)

를 HTML 요소를 찾습니다 중첩 된 양식을 사용하는 앱 이 양식은 구성원을 대기열에 추가합니다. 회원이 이미 저장되어있는 경우 HTML의 해당 회원 ID는 queue_queue_members_attributes_0_user_id이고 1, 2 등이 계속됩니다. JavaScript를 통해 Add New Member에 대한 링크를 클릭하면 새 선택 상자의 HTML ID는 다음과 유사합니다. queue_queue_members_attributes_1421760178806_user_id

위에서 볼 수 있듯이 중첩 된 숫자가있는 모든 새 선택 상자에 대해 임의의 숫자 문자열이 생성됩니다. 속성이 아직 저장되지 않았습니다. 카피 바라와 함께 효과적으로 테스트하려면이 HTML 요소의 ID를 알아야합니다.

대기열에 구성원을 추가하는 페이지입니다. 회원이 이미있는 경우 선택 상자의 ID는 0, 1 등입니다. 내가 클릭하면이 경우 다음 1421760178806.

원래 시도

에, 새로운 선택 상자의 ID를 임의로 생성 된 번호입니다 내가 사양을 위해 만든 도우미 메서드입니다 "신규 회원 추가". 처음에는 효과가있었습니다. 그러나 최근에 대기열 구성원을 테스트해야했습니다. 대기열 구성원 팩토리를 추가하고 새 대기열 팩터 리 인스턴스로 생성하면이 문제가 발생했습니다. 이제는 xpath 쿼리와 일치하는 2 개의 선택 상자가 있습니다.

def select_member(member) 
    find(:xpath, "//select[contains(@id, '_user_id')]/option[@value='#{member.id}']").select_option 
end 

Failure/Error: select_member(@test_user) 
Capybara::Ambiguous: 
Ambiguous match, found 2 elements matching xpath "//select[contains(@id, '_user_id')]/option[@value='6647']" 

변경 사항을 적용하면 FactoryGirl을 통해 생성시 멤버가 대기열에 추가됩니다. 즉, xpath 표현식은 선택 상자 두 개 (하나는 ID가 0이고 다른 하나는 1421760178806)와 일치 함을 의미합니다. 후자의 숫자 (하나의 "0"이외의 문자) 만 일치 시키길 원합니다. 내 테스트는 하나의 멤버 만 추가하기 때문에 ids> 0에 대해 걱정하지 않아도됩니다.

내가 다른 오류로 실행 때까지 나는 this SO question 처음에 도움이되었다고

두 번째 시도.

def select_member(member) 
    find(:xpath, "//select[matches(@id, '[0-9]{2,}_user_id')]/option[@value='#{member.id}']").select_option 
end 

Failure/Error: select_member(@test_user) 
Capybara::Webkit::InvalidResponseError: 
INVALID_EXPRESSION_ERR: DOM XPath Exception 51 
+2

질문에 HTML 소스를 추가하십시오. XPath 2.0을 사용하고 있습니까?그것은 예외적 일 것입니다. XPath 2.0.0이 없습니다. 여기에 Ruby 클래스가 있습니까? http://ruby-doc.org/stdlib-2.0/libdoc/rexml/rdoc/REXML/XPath.html? –

+0

감사합니다. xpath를 보석으로 지정했습니다. HTML 소스에 관해서는 내가 찾고자하는 전체 요소를 의미합니까? – onebree

+0

정확히''xpath'] (https://github.com/jnicklas/xpath) 보석이 당신을 위해 무엇을 기대합니까? –

답변

2

업데이트 된 보석으로 레일 4로 이동하면 게시 후 약 1 개월 내 질문을 해결할 수있었습니다. 다음은 여전히 ​​Rails 3 프로젝트에서 도움이 될 것입니다.

많은 조사와 파기 끝에 우리 앱이 기본 Capybara 선택기로 xpath을 가지고 있다는 것을 알았습니다. 나는 왜 그런지 모르지만, 우리의 견해가 form-in-forms-in-tables로 복잡해 졌다고 생각합니다. 이제는 트위터 부트 스트랩과 레일즈 4에서보기가 깔끔해졌습니다. 기본 Capybara 선택기를 기본 옵션 인 :css으로 변경하기로 결정했습니다. 이로 인해 요소의 (청소기) ID, 이름 또는 레이블에 따라 select 또는 fill_in이 허용되었습니다.

중첩 된 양식 문제와 관련하여 spec helper 메서드를 만들어 해결했습니다. 여기에서 양식 요소가 들어있는 테이블을 찾습니다. xpath를 사용하여, 나는 그 인스턴스에서 테이블의 마지막 행을 찾습니다. 마지막 행 선택은 Capybara에서 within do 블록으로 작동합니다.

# xpath selector - locate last nested row within a given table id 
def last_row(id) 
    find(:xpath, "//table[@id='#{id}']//tbody/tr[last()]") 
end 

within last_row("queues") do 
    # css selector - select item based on label 
    select "Extension User 2", from: "Queue member" 
    select "1", from: "Penalty" 
end 

위의 내용이 어떻게 든 CSS로 바뀔 수 있지만 필자는 테스트에서 두 셀렉터가 모두 새 것이 었습니다. CSS 선택기 버전으로 자유롭게 의견을 말하십시오.