即使在selenium ruby​​脚本完成后如何打开浏览器

时间:2011-09-26 12:57:53

标签: ruby selenium webdriver

我正在使用带有selenium web-driver的ruby脚本,用于自动化网页登录。问题是在脚本完成后它也关闭了浏览器。我想在脚本完成后保持浏览器打开。在测试用浏览器窗口执行其他操作后,有什么方法可以让浏览器保持打开状态?

我这样做。

if browser == "Firefox"
     driver = Selenium::WebDriver.for :firefox
end

if stack == "example.com"
      driver.get "http://www.example.com/tests/
end

element = driver.find_element :name => "email"
element.clear
element.send_keys username

element = driver.find_element :name => "password"
element.clear
element.send_keys password

element = driver.find_element :name => "commit"
element.submit 

=============================================== ====

8 个答案:

答案 0 :(得分:13)

我从未真正尝试在这样的独立脚本中使用selenium-webdriver,但我在selenium-webdriver / {{1}的上下文中使用capybara遇到了同样的问题}。

查看cucumber的源代码,我发现这个钩子在脚本完成后显式关闭了浏览器。如果您使用capybara selenium-webdriver,那么这可能没有帮助,但它对我有帮助...

capybara注册一个gems/capybara-1.1.1/lib/capybara/selenium/driver.rb钩子,然后在浏览器对象上调用at_exit

quit

您应该可以对require 'selenium-webdriver' class Capybara::Selenium::Driver < Capybara::Driver::Base ... def browser unless @browser @browser = Selenium::WebDriver.for(options[:browser], options.reject { |key,val| SPECIAL_OPTIONS.include?(key) }) main = Process.pid at_exit do # Store the exit status of the test run since it goes away after calling the at_exit proc... @exit_status = $!.status if $!.is_a?(SystemExit) quit if Process.pid == main exit @exit_status if @exit_status # Force exit with stored status end end @browser end 方法进行修补,以便它不会执行任何操作,如下所示:

quit

注意:如果您使用 Selenium::WebDriver::Driver.class_eval do def quit #STDOUT.puts "#{self.class}#quit: no-op" end end Selenium::WebDriver.for :chrome - 你不是,但其他人可能 - 我注意到它也杀了chromedriver进程,一旦“服务”进程被杀死,Chrome连接到它的浏览器进程也退出。

所以我不得不阻止服务进程停止,如下所示:

chromedriver

我遇到了另外一个问题,这可能不会影响到你,除非你使用黄瓜这个驱动程序......即使我把它打开后仍然打开浏览器,它将在“about:blank”页面上保持打开状态。看起来这是由这个钩子触发的:

宝石/水豚-1.1.1 / LIB /水豚/ cucumber.rb:

    Selenium::WebDriver::Chrome::Service.class_eval do
      def stop
        #STDOUT.puts "#{self.class}#stop: no-op"
      end
    end

调用gems / capybara-1.1.1 / lib / capybara / session.rb:70:在`reset!'“

哪个叫gems / capybara-1.1.1 / lib / capybara / selenium / driver.rb:80:在'reset!'“中:

After do
  Capybara.reset_sessions!
end

我用另一个猴子补丁解决了这个问题:

  def reset!
    ...
    @browser.navigate.to('about:blank')
    ...
  end

答案 1 :(得分:11)

对我有用的快速黑客:

睡觉(9000)

在您的测试中,

在驱动程序关闭之前为您提供了相当多的时间来浏览浏览器。

答案 2 :(得分:11)

这是与Capybara一起使用的代码

Capybara::Selenium::Driver.class_eval do
  def quit
    puts "Press RETURN to quit the browser"
    $stdin.gets
    @browser.quit
  rescue Errno::ECONNREFUSED
    # Browser must have already gone
  end
end

这是我在gems / capybara-1.1.2 / lib / capybara / selenium / driver.rb中找到的猴子补丁

我刚刚添加了puts和获取行。 Selenium :: WebDriver :: Driver给我一个未发现的错误可能是因为我从水豚中获得了硒。

这有助于查看生成错误的代码是什么,但有一个缺点:浏览器停在最后一页并显示一个空白屏幕。我必须单击后退按钮才能转到带有错误的页面,该错误可能并不总是有效。有人知道为什么浏览器加载那个空页并节省我挖掘水豚代码的时间吗?谢谢!

答案 3 :(得分:4)

如果在启用调试的情况下运行测试并在最后删除调试器行,则应该打开浏览器。看看ruby-debug gem。关于Pry的这个Railscast也可能值得一试。

答案 4 :(得分:2)

这里是Python的一些片段:

将它放在脚本的末尾,将打开浏览器窗口并在手动关闭时结束脚本(在开头需要一些导入):

import time
import sys
...
while 1:
    time.sleep(5)
    try:
       b = browser.find_by_tag("body")      
    except:
      sys.exit()

答案 5 :(得分:2)

Watir的until函数将保存脚本,直到条件返回true。将超时设置为无穷大,然后检查所有窗口是否关闭。

Watir::Wait.until(timeout: Float::INFINITY) {@browser.windows.length == 0}
@browser.close

将其放在脚本末尾,然后手动关闭所有选项卡以退出。

答案 6 :(得分:1)

这很大程度上是其他评论者已经说过的关于覆盖驱动程序的问题,但这是我最终用于独立的Capybara脚本的简化代码:

require 'capybara'

session = Capybara::Session.new(:selenium)
session.driver.class.class_eval { def quit; end }
session.visit('http://localhost:3000')
# ... other stuff

假设您有一个在localhost:3000上运行的Web服务器,这将启动Firefox,导航到此URL并保持浏览器窗口打开。

答案 7 :(得分:0)

您使用的是哪种测试框架?

通常,您的测试框架具有某种setupteardown方法,您可以定义这些方法以启动浏览器

@driver = Selenium::WebDriver.for :firefox

在setup方法中,并销毁浏览器

@driver.quit

在拆解中。

只需在脚本的拆卸部分放置一些逻辑,以便只在需要时销毁浏览器。