Ruby 有没有一种方法可以组合页面对象gem和javascript调用

Ruby 有没有一种方法可以组合页面对象gem和javascript调用,ruby,selenium,page-object-gem,Ruby,Selenium,Page Object Gem,我正在使用页面对象gem和selenium 填写注册表单时,表单会正确填写,但单击“应用”时,会出现错误,说明即使已填写字段,也需要这些字段 这似乎是因为page object/selenium方法没有触发javascript更改方法,应用程序需要该方法才能知道字段已填充 这可以通过使用以下代码进行修复: on(SettingsPage).payment_method_account_number = number @browser.execute_script("$('input[name=a

我正在使用页面对象gem和selenium

填写注册表单时,表单会正确填写,但单击“应用”时,会出现错误,说明即使已填写字段,也需要这些字段

这似乎是因为page object/selenium方法没有触发javascript更改方法,应用程序需要该方法才能知道字段已填充

这可以通过使用以下代码进行修复:

on(SettingsPage).payment_method_account_number = number
@browser.execute_script("$('input[name=account_number]').change()")
但这显然并不理想,因为必须再次声明fields
name
属性,从而打破了首先使用page对象的全部意义


有没有比我所展示的更好的方法来解决这个问题?

我也遇到过类似的问题,但事件是“onblur”而不是“onchange”。我可以想象on change会启动,但如果不启动,您可以使用类似于我的方法。最后,我创建了一个重新定义“#{name}=”方法的函数,以同时调用现场事件。它稍微复杂一点,但它将所有魔法集中到一个类中,并保持代码简短。

为了避免在页面对象和执行脚本中重复元素定义,可以将页面对象元素传递给脚本

底层Selenium WebDriver(因此页面对象gem)支持正在执行的脚本中的
参数
数组。这个arguments数组基本上接受SeleniumWebDriver元素,并将它们转换为脚本可以使用的内容。Page对象
execute\u script
方法处理元素到正确类型的转换,因此您只需:

  • 声明使用参数数组的脚本
  • 传入PageObject::元素
  • 例如,假设您的页面对象使用了访问器:

    text_field(:payment_method_account_number, :name => 'account_number')
    
    因此,页面对象将有一个
    payment\u method\u account\u number\u元素
    方法,该方法返回此文本字段的PageObject::元素

    在要执行的脚本中,可以用arguments数组替换元素的位置,并将PageObject::元素传递给
    execute\u脚本
    方法:

    execute_script("$(arguments[0]).change();", payment_method_account_number_element)
    
    然后,您可以将对的调用重新写入为:

    on(SettingsPage) do |page|
      page.payment_method_account_number = number
      page.execute_script("$(arguments[0]).change();", page.payment_method_account_number_element)
    end
    

    (或者,正如Dane所指出的,将其放入页面对象中的一个方法中。)

    您可以发布您对
    付款方法\账户\编号的定义吗?页面对象方法没有触发更改方法似乎很奇怪。
    text\u字段(:payment\u method\u account\u number,:name=>“account\u number”)