1

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

我创建了一个文件 (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”检查了它。即使我将参数更改为像“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

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

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

4

2 回答 2

3

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

domain = "blah"

这是调用 domain= 方法的代码:

domain = "blah"

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

def configure_domain(config={})
    check_option_sub_domain
    self.domain = config[:domain]
    self.tld = config[:tld]
end
于 2012-05-12T12:23:00.093 回答
2

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

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

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

我希望这里的东西对你有用。

更新(2012 年 1 月 3 日)

在深入研究页面对象的实际 Ruby 代码时,我发现 select_list 集也使用了 send_keys,因此实际上我在这里仍然有与我直接使用 send_keys 解决方法所提到的相同的限制。 感叹 要学的东西太多,时间太少了!

于 2012-01-02T18:52:36.617 回答