Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从PageObject类内部访问on、visit和if方法_Ruby_Cucumber_Watir_Watir Webdriver_Page Object Gem - Fatal编程技术网

Ruby 从PageObject类内部访问on、visit和if方法

Ruby 从PageObject类内部访问on、visit和if方法,ruby,cucumber,watir,watir-webdriver,page-object-gem,Ruby,Cucumber,Watir,Watir Webdriver,Page Object Gem,我有一个Cucumber/Watir/PageObject项目。我试图在实际页面对象内的步骤定义之外设置@current_页面变量。无论我做什么,我都会犯错误 #的未定义方法“on”(命名错误) test_page.rb #编码:utf-8 ##测试模块 类TestPage

我有一个Cucumber/Watir/PageObject项目。我试图在实际页面对象内的步骤定义之外设置@current_页面变量。无论我做什么,我都会犯错误


#的未定义方法“on”(命名错误)


test_page.rb
#编码:utf-8
##测试模块
类TestPage<另一个TestPage
包含页面对象
div(:test_按钮,id:'testbutton')
#
#打开测试页面2
#
#@param[Boolean]test_按钮默认为false。如果为true,将选择测试按钮
#@return[PageObject]新创建的Test2Page页面对象
#
def open_test2(测试按钮=false)
测试按钮。单击“如果测试”按钮
打开(Test2Page)
结束
结束

test_steps.rb
和(/^Test2屏幕可见$/)执行以下操作
@当前页面。打开测试2
结束

我尝试了
包括
扩展
两种
PageObject::PageFactory
PageNavigation
,但都没有成功。我还尝试将
World(TestPage)
World(TestPage.new)
添加到TestPage文件的底部。这也不起作用,似乎是因为
TestPage
是一个类


因此,我的问题是,如何在我的PageObject内部和步骤定义外部设置
@current\u page
变量,要在page对象中使用
on
方法,需要包括
PageObject::PageFactory

# Page that calls the on method
class MyPage
  include PageObject
  include PageObject::PageFactory

  def do_stuff
    on(MyPage2)
  end
end

# Page that is returned by the on method
class MyPage2
  include PageObject
end

# Script that calls the methods and shows that the on method works
browser = Watir::Browser.new
page = MyPage.new(browser)
current_page = page.do_stuff
p current_page.class
#=> MyPage2
但是,页面对象无法更改步骤使用的
@current_page
。页面对象不知道Cucumber实例的
@current\u page
变量。我认为您必须手动分配页面:

And(/^the Test2 screen is visible$/) do
  @current_page = @current_page.open_test2
end

请注意,这假设
open_test2
正在返回一个页面对象,它当前正在返回一个页面对象(即
on
方法返回一个页面对象)。

我已经包含
页面对象::页面工厂
,但我没有考虑只返回页面对象,然后在页面一侧设置它。我没有意识到@current_页面只对Cucumber实例可见。这是否意味着
世界上的任何东西都可以访问它?因为您可以将模块添加到
World
,所以不能吗?因此,如果我的类是一个模块,我将它添加到
World
中,那么我是否可以访问
@current\u page
变量?我猜简短的答案是“是”,因为这正是PageObject::PageFactory所做的。但是,将页面对象类转换为模块不太可能起作用。