【问题标题】:Watir-webdriver keeps opening multiple browsersWatir-webdriver 不断打开多个浏览器
【发布时间】:2016-03-08 15:44:21
【问题描述】:

您好 * 成员,

我一直在搜索该网站(以及网络的其他部分)以寻找这个问题的答案,但我所有的搜索查询都返回了 Watir 的令人敬畏的功能......我似乎是少数遇到的人之一这个特殊的问题。我希望那里的人能给我一个简单的答案:)

我正在研究网站测试自动化。当前的测试集是用 Cucumber/Ruby/Selenium-Webdriver/Capybara 编写的。我个人对结合 Cucumber 和 Ruby 切换到 Watir-Webdriver 感兴趣,但我正在努力解决以下问题:

每次我运行黄瓜测试时,Watir 都会打开不是一个,而是两个浏览器屏幕。它似乎想要启动一个空白屏幕(它只是转到我默认配置的站点),以及另一个执行实际测试步骤的浏览器屏幕。

请记住,我对此很陌生,只是在遵循初学者教程时遇到了这个问题。目前还没有什么特别的。

在我的“Support/env.rb”文件中,我有以下内容:

require "cucumber"
require 'watir-webdriver'

app_host = ENV['apphost']

Before do
  @browser = Watir::Browser.start app_host, :firefox
end


Before  do |scenario|
  @scenario_tag = scenario.source_tag_names
  @browser.cookies.clear
end

at_exit do
  @browser.close
end

我的步骤文件中的第一位(GoogleSearch.rb -- 是的,就是这么基本):

require_relative "../support/env"

Given(/^that I have gone to the Google page$/) do
  @browser.goto 'http://www.google.com'
end

现在,当我运行此测试时,我希望只启动一个浏览器。但相反,自动化会启动两个浏览器屏幕。一个只是留在后台什么都不做,另一个包含测试步骤。

再次,我已经搜索了一段时间(我通常很擅长),但我在任何地方都没有找到我的问题的答案。我让它工作的唯一方法是从我的步骤文件中的一个步骤开始,启动一个浏览器(而不是在 env.rb 文件中这样做)。但我不想通过打开浏览器来开始每个测试..

任何帮助将不胜感激。如果需要我提供更多信息,我会尽快更新。

提前致谢!

【问题讨论】:

  • 提供的 env.rb 是否准确?您同时拥有@browserbrowser 令人怀疑。
  • 嗨贾斯汀,感谢您的回复。我已经用当前的 env.rb 内容更新了我的起始帖子。在看到您关于使用@browser 和浏览器的评论后,我确实将“browser.close”更改为“@browser.close”。但是,在启动一个场景时,我仍然会得到两个浏览器实例...

标签: cucumber watir watir-webdriver


【解决方案1】:

问题是env.rb被加载了两次:

  • 运行cucumber 命令时自动包含它
  • 在调用require_relative "../support/env" 行时,它第二次被包含在GoogleSearch.rb 中。

因此,每个钩子都注册了两次。换句话说,Cucumber 将在每个场景之前运行的钩子视为:

Before do
  @browser = Watir::Browser.start app_host, :firefox
end

Before  do |scenario|
  @scenario_tag = scenario.source_tag_names
  @browser.cookies.clear
end

Before do
  @browser = Watir::Browser.start app_host, :firefox
end

Before  do |scenario|
  @scenario_tag = scenario.source_tag_names
  @browser.cookies.clear
end

如您所见,Watir::Browser.start 被调用了两次,从而导致了两个浏览器。第一个没有使用,因为第二个调用使用相同的变量。

要解决此问题,只需删除 require_relative "../support/env" 行。

请注意,这只会解决为每个场景打开两个浏览器的问题。您会注意到,对于每个场景,您仍然会获得一个新的浏览器,并且只有最后一个浏览器会被关闭。如果您只希望一个浏览器用于所有场景,您应该查看global hooks

【讨论】:

  • 嗨@Justin Ko,再次感谢您的回复。它背后的逻辑似乎如此明显和可以理解,我真的希望这能解决我的问题......但它还没有:(我改变了 env.rb 文件只做一个“之前”动作(@browser = Watir::Browser.start , :firefox),并从我的 ruby​​ 步骤文件中完全删除引用(对于 env.rb 的 require_relative)。它仍然打开两个浏览器。
  • 我做了一件事来检查它可能出错的地方;在我的 env.rb 钩子中,我添加了 '@browser.maximize' 以查看它会在什么时候最大化浏览器。然后我将“@browser.bring_to_front”添加到我的 GoogleSearch.rb 文件中。只有第二个屏幕被最大化,并被带到前面。所以第一个屏幕似乎从字面上看是多余的。但是我不知道它来自哪里以及如何打开它......还有其他建议吗?非常感谢您的帮助!
  • 我们可以检查env.rb 被加载了多少次吗?在require 'watir-webdriver' 行之后,您可以添加一些输出吗?例如p 'loading env.rb'?当你运行 Cucumber 时,消息会被写入多少次?
  • 两次 :O -- cucumber features/test.feature "loading env.rb" "loading env.rb
  • 终于。你对 require_relative 的看法是完全正确的,除了我的前任在这里工作有多个包含步骤的 ruby​​ 文件。这些文件中的每一个都以 env.rb 上的“require_relative”开头——我从所有文件中删除了它(大约有 12 个),现在它只是通过运行 cucumber 命令加载一个!谢谢! --编辑:我希望我能支持你的答案,但我需要 15 个代表大声笑。但再次,非常感谢!