2014-02-14 9 views
0

이렇게하면 가능하지 않습니까? 맞춤 선택기를 허용하는 기능을 확장하는 코드를 추가했습니다.Watir-Webdriver의 사용자 지정 특성에서 라디오 단추를 선택하려고 시도 중

module Watir 
    class ElementLocator  
    alias :old_normalize_selector :normalize_selector 

    def normalize_selector(how, what) 
     case how 
     when :data_sku 
      [how, what] 
     else 
      old_normalize_selector(how, what) 
     end 
    end 
    end 
end 

그리고 임의 코드 배열에서 코드를 선택하려고합니다. 주석을 달지 않은 가운데 두 줄이 있어도 여전히 오류가 발생합니다.

$monthlydata = ["GC311Z-02","GC307Z-02","GC308Z-02","GC309Z-02","GC310Z-02"].sample 
#Watir::Wait.until { @b.radio(:data_sku, $monthlydata) } 
#@b.radio(:xpath, "//input[@data_sku='$monthlydata']").exists? 
@b.radio(:xpath, "//input[@data_sku='$monthlydata']").set **(line causing the error)** 

오류는 UnknownObjectException : 요소를 찾을 수 없습니다. 오류가 발생하는 행이 마지막에 표시됩니다.

UPDATE

내 업데이트 된 코드 점점 시간 초과 오류 :

if @b.url == "http://www.website.com/cart/plans?ProductId=product" 
     $monthlydata = ["GC311Z-02","GC307Z-02","GC308Z-02","GC309Z-02","GC310A-02"].sample 
     assert @b.radio(:data_sku, $monthlydata).when_present.set 
    end 

    $monthlymin = ["GC504Z","GC505Z","GC506Z","GC507Z","GC508Z"].sample 
    assert @b.radio(:data_sku, $monthlymin).when_present.set 

    $monthlytxt = ["GC313Z-02","GC314Z-02","GC315Z-02","GC316Z-02","GC320Z-02"].sample 
    assert @b.radio(:data_sku, $monthlytxt).when_present.set 

스택 트레이스 :

Error: test_goproject(TestShoppingCart) 

    Watir::Wait::TimeoutError: timed out after 30 seconds, waiting for {:data_sku= 
>"GC309Z-02", :tag_name=>"input", :type=>"radio"} to become present 

C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.7/lib/watir-webdriver/wa 
it.rb:33:in `until' 

C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.7/lib/watir-webdriver/wa 
it.rb:106:in `method_missing' 

C:/Users/User.Name/Downloads/shoppingcart2.rb:95:in `test_goproject' 

    92: 
    93:    if @b.url == "http://www.website.com/cart/plans?ProductId=product" 
    94:      $monthlydata = ["GC311Z-02","GC307Z-02","GC308Z- 
02","GC309Z-02","GC310Z-02"].sZmple 
    => 95:      assert @b.radio(:data_sku, $monthlydZtZ).when_pr 
esent.set 
    96:    end 
    97: 
    98:    $monthlymin = ["GC504Z","GC505Z","GC506Z","GC507Z","GC50 
8Z"].sample 
+0

감사합니다, 나는 $ monthlydata에서 내 배열을 체크 아웃에서 그것을 알아 냈다. 내가 $ monthlydata 값을 얻고있는 영역은 내가 잡는 다양한 웹 페이지 전부가 아닙니다. –

+0

라디오 요소를 찾으려는 시도에서 시간 초과가 발생하기 때문에 위의 스택 추적을 추가하려고합니다. –

+0

문제가 해결되었습니다. 신경 쓰지 마. –

답변

1

내가 페이지에 라디오 버튼 같은 HTML이 있다고 가정 :

<input type="radio" data-sku="GC311Z-02" /> 

솔루션 1 - 데이터 속성 찾기

Watir은 이미 사용자 정의 데이터 속성을 통해 요소 찾기를 지원합니다. normalize_selector 방법을 패치 할 필요가 없습니다. 당신이 한 때

올바르게 데이터 속성 로케이터를 정의 :

@b.radio(:data_sku, $monthlydata) 

그러나, 라인 :

Watir::Wait.until { @b.radio(:data_sku, $monthlydata) } 

당신이 무엇을 기대하지 않습니다. Watir::Wait.until은 블록이 true로 평가 될 때까지 대기합니다. 라인 @b.radio(:data_sku, $monthlydata)은 Watir 요소 오브젝트 (아직 위치하지 않은 오브젝트)를 리턴 할 때 항상 진리 값을 리턴합니다. 그러므로 기다리지 마십시오. 블록이 요소가 있는지 확인해야 :

Watir::Wait.until { @b.radio(:data_sku, $monthlydata).present? } 

비록, 당신은이를 단축 할 수있다 :

@b.radio(:data_sku => $monthlydata).when_present.set 

:

@b.radio(:data_sku => $monthlydata).wait_until_present 

아니면 라디오 버튼을 설정하려는부터 솔루션 2 - Xpath

나는 권장하지 않지만 이 시나리오에서 xpath 라우트를 사용할 수 있습니다. 그 이유는 다음과 같습니다.

@b.radio(:xpath, "//input[@data_sku='$monthlydata']").set 

$monthlydata이 제대로 삽입되지 않았기 때문입니다. 작성된 것처럼 xpath는 "$ monthlydata"값을 갖는 data-sku 속성을 찾습니다 (임의로 선택한 값이 아님).

$monthlydata이 리터럴이 아닌 실제로 해석되도록 string interpolation을 수행해야합니다. 뿐만 아니라, XPath는 @data-sku 대신 @data_sku 필요

@b.radio(:xpath, "//input[@data-sku='#{$monthlydata}']").when_present.set 
+0

대기 상태를 설명하고 코드를 단순화 해 주셔서 감사합니다. 내가 그것을 도울 수 있다면 나를 위해 xpath를 사용하지 마라. –