2012-04-05 68 views
3

好的,我需要在這個思維過程中的提升 - 我的大腦傷害。我想就某些方法獲得您的反饋意見。Watir-Webdriver覆蓋網站與許多客戶端的方法

萬一我下面的描述中失去您的關注我會後我的問題了前面:

  • 你以前的腳本類似的產品?你是如何看待它的?

  • 對於任何 的原因,是否有任何這些方法突出顯示/可怕?如果是這樣,什麼?

  • 是否有另一種方法,您會發現 更合適?

還有就是我測試,爲了便於討論工作流,我們將其稱之爲購物車,包括各種text_fields,radio_buttons和select_lists的。一家公司爲約60位客戶提供此購物車,並非所有客戶都使用相同的確切形式,但一般流程與相同。客戶端(相同的目標功能)之間的一般想法是相同的,並且存在具有相同確切工作流程的客戶端子集,但許多是唯一的。在這種情況下,唯一可能意味着某些字段不是必需的,而它們可能適用於其他客戶端。或者,對於一個客戶而言,某些問題/ text_fields存在,而其他人根本不會使用。

此時腳本的目標僅僅是通過Web界面生成訂單,而不是將流程的每個單獨步驟都驗證爲「測試」。你必須在這裏相信我一點。仍然有許多共同的細節能夠以可接受的準確度運行負面/邊緣情況。

,我看到到目前爲止的方法是:

  1. 使用頁面對象模式,爲每一個客戶的網站「頁」文件並使用,這取決於客戶正在測試不同的頁面類。這是單調乏味的,大多是脆弱的,還有很多工作要維護。然而,它可以工作,我可以使用相同的功能/場景給大家,只要他們的特定頁面文件是可訪問的。

  2. 創建颳去所有從DOM中輸入元素的方法,檢測它們是否是我們需要注入所需的特定輸入,或只需填寫信息獲取訂單完成保留字段。這不會在數據庫上搭載,因此整體性能應該更好。

  3. 掛鉤到數據庫中,收集用於構建頁面的特定客戶端所需的所有信息,並動態構建訂單的字段,並相應地回答它們。這在理論上聽起來很好,如果有任何維護需要很少的話。 DB刮容易,建築等領域的難度是未知的,我...

現在我使用: 的Watir-webdriver的 黃瓜 Cheezy的頁面對象寶石 續集

+0

如果您認爲有應該閱讀的博客/文章或我應該購買的書籍,請讓我知道。我意識到我不能成爲第一個考慮這個決定的人,我也不希望別人爲我做這件事。 – 2012-04-05 20:28:27

+0

客戶端配置有多穩定,誰配置它們?例如,測試維護者會知道表單/頁面何時更改?表單經常變更還是保持原來的狀態?鑑於不同的方法,我要求更好地瞭解所需的維護。 – 2012-04-06 13:57:05

+0

@JustinKo - 主要部分(頁面排序,問題)應該足夠靜態,不要擔心它們會發生變化,除非在極端情況下。諸如可用性之類的功能(美國地區地圖只有在可用狀態下才有活動狀態鏈接)將會相當有規律地發生變化,但我已經有了一種方法來動態檢測這些動態,或者接受用戶對腳本的輸入並根據位置可用性。 – 2012-04-06 14:13:35

回答

3

我會使用cheezy的頁面對象,幷包含可能包含的每個字段/問題。那麼我會超過每個客戶的默認值,僅包括他們使用的字段/問題。希望我沒有過分簡單化。

更新: 在page populator,它會合並你發送的任何數據(作爲散列)與默認數據。在他的default data post中,他演示瞭如何使用默認數據。我想,你可以創建一個類結帳頁面

class CheckoutPage 
    include PageObject 

    text_field(:name, :id => 「order_name」) 
    text_field(:address, :id => 「order_address」) 
    text_field(:email, :id => 「order_email」) 
    select_list(:pay_type, :id => 「order_pay_type」) 
    button(:place_order, :value => 「Place Order」) 

    PageObject::PageFactory.routes = { 
    :default => [[HomePage, :select_puppy], 
       [DetailsPage, :add_to_cart], 
       [ShoppingCartPage, :continue_to_checkout], 
       [CheckoutPage, :complete_order]] 
    } 

    def complete_order(data = {}) 
    data = DEFAULT_DATA.merge(data) 
    self.name = data['name'] 
    self.address = data['address'] 
    self.email = data['email'] 
    self.pay_type = data['pay_type'] 
    place_order 
    end 
end 

然後重載它使用該網站的具體供應商,每個人都有其自身的默認數據。

class Nordies < CheckoutPage 
     DEFAULT_DATA = { 
     ‘name’ => ‘cheezy’, 
     ‘address’ => ‘123 Main Street’, 
     ‘email’ => ‘[email protected]’, 
     ‘pay_type’ => ‘Purchase order’ 
     } 

PageObject::PageFactory.routes = { 
    :default => [[HomePage, :select_puppy], 
       [DetailsPage, :add_to_cart], 
       [ShoppingCartPage, :setup_creditcard], 
       [CreditCardPage, :continue_to_checkout], 
       [CheckoutPage, :complete_order]] 
} 
end 

然後,.complete_order對於每個供應商都會有所不同。

+0

我不確定你的意思是超載的默認值,但通過其餘的答案,它聽起來像你基本上通過「if field_one.exists?{fill it out}」方法運行?我試圖使用Cheezy的默認數據方法,因爲它對於過去的其他項目來說一直很好,使用新的populate_page_with方法。我不確定技術上使用這種方法是否合適。 – 2012-04-05 20:45:27

+0

http://rubydoc.info/github/cheezy/page-object/master/frames – 2012-04-05 20:52:24

+0

對,我使用他的寶石(並且在它是寶石之前使用了他的頁面對象方法),但我不確定你的意思是超載的價值。我認爲我們有點太簡潔了! – 2012-04-05 20:55:03