我想更改@browser
变量的名称,因为我已经厌倦了输入它。
在env.rb
:
before do
@b = Watir::Browser.new :chrome
end
抛出错误:
Unable to pick a platform for the provided browser or element: nil.
nil was passed to the PageObject constructor instead of a valid browser or element object. (RuntimeError)
before do
@browser = Watir::Browser.new :chrome
end
按预期工作。
@browser = Watir::Browser.new :chrome
@b = @browser
也不起作用。有没有办法修改这个变量名?
答案 0 :(得分:2)
通常,您可以将浏览器实例存储在任何名称的变量中。 Watir-Webdriver不关心,Cheezy的页面对象也不关心。页面对象的初始化只关心传入的实际对象是什么 - 即它必须是Watir::Browser
或Watir::Element
(或Selenium-WebDriver等价物)。
但是,使用PageObject::PageFactory
时不是这样。在on_page
method,隐式visit_page
和if_page
中,代码经过硬编码以查找@browser
变量。
def on_page(page_class, params={:using_params => {}}, visit=false, &block)
page_class = class_from_string(page_class) if page_class.is_a? String
return super(page_class, params, visit, &block) unless page_class.ancestors.include? PageObject
merged = page_class.params.merge(params[:using_params])
page_class.instance_variable_set("@merged_params", merged) unless merged.empty?
@current_page = page_class.new(@browser, visit)
block.call @current_page if block
@current_page
end
页面对象的初始化始终使用@browser
完成。将浏览器实例存储在@b
时,表示@browser
为nil
。这导致你看到的例外。如果您想使用PageFactory
,则需要坚持@browser
。
如果变量真的困扰你,那么猴子补丁总是有选择。只需重新定义on_page
和on
方法即可使用您喜欢的任何变量。以下重新定义了使用@b
的方法:
require 'page-object'
module PageObject
module PageFactory
def on_page(page_class, params={:using_params => {}}, visit=false, &block)
page_class = class_from_string(page_class) if page_class.is_a? String
return super(page_class, params, visit, &block) unless page_class.ancestors.include? PageObject
merged = page_class.params.merge(params[:using_params])
page_class.instance_variable_set("@merged_params", merged) unless merged.empty?
@current_page = page_class.new(@b, visit)
block.call @current_page if block
@current_page
end
alias_method :on, :on_page
end
end
答案 1 :(得分:1)
问题出在代码中的其他位置。如果你只运行你提供的行(在要求watir之后)
require 'watir-webdriver'
@b = Watir::Browser.new :chrome
在IRB会议中它会正常工作..
其他一些代码依赖项(可能是页面对象库)需要一个浏览器对象并期望一个特定的名称,而是获取一个nill(未初始化的)对象并抱怨。
此外,除非您想要为每个测试打开和关闭浏览器的开销(可能会增加大量时间),否则您可能需要提前初始化浏览器,例如在before_all挂钩中,或者在启动初期测试代码。然后在前挂钩
中执行类似清除缓存和cookie的操作