使用 Watir/Chrome 时,`@browser` 是 ChromeDriver 对象的强制名称吗?
Is `@browser` the obligatory name for the ChromeDriver object when using Watir/Chrome?
我想更改 @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
也不行。有什么办法可以修改这个变量名吗?
问题出在您的代码中的其他地方。如果您 运行 只是您提供的行(在需要 watir 之后)
require 'watir-webdriver'
@b = Watir::Browser.new :chrome
在 IRB session 中它会工作得很好..
一些其他代码依赖项(可能是页面 objects 库)需要浏览器 object 并且需要一个特定的名称,得到一个 nill (un-initialized) object 而不是抱怨。
此外,除非您想要为每次测试打开和关闭浏览器的开销(可能会增加大量时间),否则您可能希望更早地初始化浏览器,例如在 before_all 挂钩中,或者在测试代码启动的早期。然后在 before hook
中做一些类似清除缓存和 cookies 的事情
通常,您可以将浏览器实例存储在任何名称的变量中。 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
我想更改 @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
也不行。有什么办法可以修改这个变量名吗?
问题出在您的代码中的其他地方。如果您 运行 只是您提供的行(在需要 watir 之后)
require 'watir-webdriver'
@b = Watir::Browser.new :chrome
在 IRB session 中它会工作得很好..
一些其他代码依赖项(可能是页面 objects 库)需要浏览器 object 并且需要一个特定的名称,得到一个 nill (un-initialized) object 而不是抱怨。
此外,除非您想要为每次测试打开和关闭浏览器的开销(可能会增加大量时间),否则您可能希望更早地初始化浏览器,例如在 before_all 挂钩中,或者在测试代码启动的早期。然后在 before hook
中做一些类似清除缓存和 cookies 的事情通常,您可以将浏览器实例存储在任何名称的变量中。 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