有没有办法结合页面对象gem和javascript调用

时间:2014-10-14 12:55:08

标签: ruby selenium page-object-gem

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

填写注册表单时,表单会正确填写,但点击时会显示错误,说明即使填写了字段也需要字段。

这似乎是由于页面对象/ selenium方法没有触发javascript更改方法引起的,该方法是应用程序知道该字段已被填充所需的

可以使用

等代码修复此问题
on(SettingsPage).payment_method_account_number = number
@browser.execute_script("$('input[name=account_number]').change()")

但这显然不理想,并且首先必须再次声明字段name属性,从而打破了使用页面对象的重点

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

2 个答案:

答案 0 :(得分:1)

为避免在页面对象和execute_script脚本中复制元素定义,可以将页面对象元素传递给脚本。

底层的Selenium-WebDriver(以及Page-Object gem)支持正在执行的脚本中的arguments数组。这个arguments数组基本上采用Selenium-WebDriver元素并将它们转换为脚本可用的东西。 Page-Object execute_script方法处理元素到正确类型的转换,因此您只需:

  1. 声明使用参数array
  2. 的脚本
  3. 传入PageObject :: Element
  4. 例如,假设您的页面对象使用了访问者:

    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} =”方法,以便当场调用该事件。它有点复杂,但它将所有魔法集中到一个类并保持代码简洁。