使用 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::BrowserWatir::Element(或 Selenium-WebDriver 等价物)。

但是,使用 PageObject::PageFactory 时情况并非如此。在 on_page method 和隐式 visit_pageif_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 中时,这意味着 @browsernil。这导致了您看到的异常。如果你想像写的那样使用 PageFactory,你需要坚持 @browser

如果变量真的困扰您,总有猴子修补的选项。只需重新定义 on_pageon 方法即可使用您喜欢的任何变量。下面重新定义方法使用@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