使用Watir / Chrome时,`@ browser`是ChromeDriver对象的强制名称吗?

时间:2016-03-10 16:33:35

标签: cucumber watir watir-webdriver selenium-chromedriver

我想更改@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

也不起作用。有没有办法修改这个变量名?

2 个答案:

答案 0 :(得分:2)

通常,您可以将浏览器实例存储在任何名称的变量中。 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

答案 1 :(得分:1)

问题出在代码中的其他位置。如果你只运行你提供的行(在要求watir之后)

require 'watir-webdriver'
@b = Watir::Browser.new :chrome

在IRB会议中它会正常工作..

其他一些代码依赖项(可能是页面对象库)需要一个浏览器对象并期望一个特定的名称,而是获取一个nill(未初始化的)对象并抱怨。

此外,除非您想要为每个测试打开和关闭浏览器的开销(可能会增加大量时间),否则您可能需要提前初始化浏览器,例如在before_all挂钩中,或者在启动初期测试代码。然后在前挂钩

中执行类似清除缓存和cookie的操作