2014-02-14 57 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

要添加我的stacktrace以上,因爲我仍然嘗試查找無線電元素超時。 –

+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將等待塊評估爲真。行@b.radio(:data_sku, $monthlydata)將始終返回一個真值,因爲它正在返回一個Watir元素對象(尚未定位的對象)。因此,等待不會等待。該塊需要驗證的元素存在:

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

雖然,您可以縮短這:

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

或者因爲你要設置的單選按鈕:

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

解決方案2 - Xpath

雖然我不建議去在這種情況下xpath路由,這是可能的。該行的原因:

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

失敗的是$monthlydata未正確插入。正如所寫的,xpath表示要查找具有值「$ monthlydata」(不是隨機選擇的值)的data-sku屬性。

你需要做一個string interpolation這樣$monthlydata實際上是解釋而不是文字。同時,XPath的要求@data-sku而不是@data_sku

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

非常感謝您解釋如何等待並簡化我的代碼。如果我可以幫忙,不要使用xpath。 –