带Ruby的PageObject - 在文本字段中设置文本只能在主文件中使用

时间:2011-12-30 12:14:07

标签: ruby selenium webdriver pageobjects page-object-gem

我正在自动化一个网站,该网站的页面包含一个单选按钮选择的选项列表。选择其中一个无线电时,会显示文本字段和选择列表。

我创建了一个文件(test_contracting.rb),它是我执行测试的文件(ruby test_contracting.rb)和其他一些代表我的页面的类。

在我的类ContractPage上,我有以下元素声明:

  checkbox(:option_sub_domain, :id => "option_sub_domain")
  text_field(:domain, :id => "domain_text") 
  select_list(:tld, :id => "domain_tld")

我在ContractPage中创建了一个方法来设置域的配置,如下所示:

  def configure_domain(config={})
        check_option_sub_domain
        domain = config[:domain]
        tld = config[:tld]
   end

当我从test_contracting.rb调用configure_domain方法时,它会选择单选按钮,但不会使用值填充该字段。参数正确地进入方法。我用“puts”检查了它。即使我将params更改为像“bla”这样的一般字符串,它也不起作用。令人讨厌的一点是,如果在test_contracting.rb上我调用完全相同的组件,它就可以工作。

my_page_instance = ContractPage.new(browser)
my_page_instance.domain = "bla"
my_page_instance.tld = ".com"

我发现的工作是在configure_domain方法中,实现以下内容:

domain_element.value = config[:domain]
tld_element.send_keys config[:locaweb_domain]

然后它奏效了。

我可以在此处找到我作为参考使用的PageObjects模块的文档:http://rubydoc.info/github/cheezy/page-object/master/PageObject/Accessors#select_list-instance_method

你们有没有解释为什么pageobject自动生成的方法设置对象的值在这个范围/上下文中不起作用?

顺便说一下,一位朋友用Java尝试了同样的事情,但也失败了。

2 个答案:

答案 0 :(得分:3)

在ruby中,所有等于方法(以=符号结尾的方法)需要有一个接收器。让我向您展示一些可以说明原因的代码。以下是将局部变量设置为值的代码:

domain = "blah"

以下是调用domain = method的代码:

domain = "blah"

为了让ruby知道你正在调用方法而不是设置局部变量,你需要添加一个接收器。只需将上面的方法更改为此方法即可:

def configure_domain(config={})
    check_option_sub_domain
    self.domain = config[:domain]
    self.tld = config[:tld]
end

答案 1 :(得分:2)

我对Selenium和页面对象的这个世界很陌生,但也许我最近的一个发现可能对你有帮助。

我发现select_list字段的赋值方法只有在我开始使用“self”时才对我有用。这是我在页面对象代码中用来访问它的原因。例如,self.my_select_list =“我的选择列表值”

另一个注意事项 - 你提到的send_keys解决方法很聪明,可能会有很多用途,但在我的情况下,选择列表值是可变的,可能有几个以相同字母开头的选项。

我希望这里的内容对你有用。

更新(1月3日至12日)

进一步深入了解页面对象的实际Ruby代码后,我发现select_list集合也使用了send_keys,所以实际上我仍然有与我直接使用send_keys解决方法所提到的相同的限制。 叹气学习这么多,时间太少了!