好的,我需要加强这个思维过程 - 我的大脑受伤了。我希望得到您对某些方法的反馈。
我会提前发布我的问题,以防我在下面的描述中失去你的注意力:
您以前编写过类似产品吗?你是怎么做到的?
这些方法中的任何一种对于任何方法都是非常/可怕的 原因?如果是,那该怎么办?
我正在测试一个工作流程,为了论证,我们将其称为购物车,其中包含各种text_fields,radio_buttons和select_lists。 一家公司提供此购物车~60个客户,并非所有客户使用相同的确切形式,但一般过程是相同的。总体思路在客户端之间是相同的(相同的目标功能),并且客户端的子集具有相同的确切工作流程,但许多客户端是唯一的。在这种情况下,唯一可能意味着某些字段不是必需的,而它们可能适用于其他客户。或者,某个客户存在某些问题/ text_fields,其他客户根本不会使用。
此时脚本的目标只是通过Web界面生成订单,而不是将流程的每个步骤都验证为“测试”。你必须在这里相信我一点。仍然有许多共同的细节能够以可接受的准确度运行负面/边缘情况。
到目前为止,我看到的方法是:
使用页面对象模式,为每个客户端站点创建“页面”文件,并根据正在测试的客户端使用不同的页面Class。这很乏味,大多数都很脆弱,需要做很多工作才能维护。但是,只要可以访问特定的页面文件,它就可以使用相同的功能/场景。
创建一个方法来从DOM中抓取所有输入元素,检测它们是否是我们需要注入特定所需输入的保留字段,或者只是填写信息以完成订单。这不会背负数据库,因此整体性能应该更好。
挂入数据库,收集用于构建其页面的特定客户端所需的所有信息,并动态构建订单的字段,并相应地回答它们。这在理论上听起来很棒,如果有任何维护则需要很少。数据库抓取很容易,构建字段的难度我还不知道......
现在我正在使用: 的Watir-的webdriver 黄瓜 Cheezy的页面对象宝石 续集
答案 0 :(得分: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’ => ‘cheezy@example.com’,
‘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都会有所不同。