我正在自动化一个网站,该网站的页面包含一个单选按钮选择的选项列表。选择其中一个无线电时,会显示文本字段和选择列表。
我创建了一个文件(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尝试了同样的事情,但也失败了。
答案 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解决方法所提到的相同的限制。 叹气学习这么多,时间太少了!