我正在使用页面对象gem和selenium,
填写注册表单时,表单会正确填写,但点击时会显示错误,说明即使填写了字段也需要字段。
这似乎是由于页面对象/ selenium方法没有触发javascript更改方法引起的,该方法是应用程序知道该字段已被填充所需的
可以使用
等代码修复此问题on(SettingsPage).payment_method_account_number = number
@browser.execute_script("$('input[name=account_number]').change()")
但这显然不理想,并且首先必须再次声明字段name
属性,从而打破了使用页面对象的重点
有没有比我展示的方法更好的方法来解决这个问题?
答案 0 :(得分:1)
为避免在页面对象和execute_script脚本中复制元素定义,可以将页面对象元素传递给脚本。
底层的Selenium-WebDriver(以及Page-Object gem)支持正在执行的脚本中的arguments
数组。这个arguments数组基本上采用Selenium-WebDriver元素并将它们转换为脚本可用的东西。 Page-Object execute_script
方法处理元素到正确类型的转换,因此您只需:
例如,假设您的页面对象使用了访问者:
text_field(:payment_method_account_number, :name => 'account_number')
因此,页面对象将具有payment_method_account_number_element
方法,该方法返回此文本字段的PageObject :: Element。
在您要执行的脚本中,您可以使用arguments数组替换元素的定位方式,并将PageObject :: Element传递给execute_script
方法:
execute_script("$(arguments[0]).change();", payment_method_account_number_element)
然后您可以将呼叫重新写入on
:
on(SettingsPage) do |page|
page.payment_method_account_number = number
page.execute_script("$(arguments[0]).change();", page.payment_method_account_number_element)
end
(或者,正如Dane指出的那样,将其放入页面对象中的方法中。)
答案 1 :(得分:0)
我遇到了类似的问题,但事件是“onblur”而不是“onchange”。我会想象改变会发生变化,但如果没有,你可以使用类似于我的方法。我最终创建了一个widget,重新定义了“#{name} =”方法,以便当场调用该事件。它有点复杂,但它将所有魔法集中到一个类并保持代码简洁。