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

Ani*_*rma 14 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 
Run Code Online (Sandbox Code Playgroud)

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

Tyl*_*ick 13

我从来没有尝试过selenium-webdriver像这样的独立脚本,但我selenium-webdrivercapybara/ 的上下文中遇到了同样的问题cucumber.

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

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
Run Code Online (Sandbox Code Playgroud)

您应该能够对quit方法进行猴子修补,以便它不会执行任何操作,如下所示:

  Selenium::WebDriver::Driver.class_eval do
    def quit
      #STDOUT.puts "#{self.class}#quit: no-op"
    end
  end
Run Code Online (Sandbox Code Playgroud)

注意:如果您正在使用Selenium::WebDriver.for :chromechromedriver - 您不是,但其他人可能 - 我注意到它也会杀死该chromedriver过程,并且一旦"服务"过程被终止,Chrome 浏览器进程就会被连接它也退出了.

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

    Selenium::WebDriver::Chrome::Service.class_eval do
      def stop
        #STDOUT.puts "#{self.class}#stop: no-op"
      end
    end
Run Code Online (Sandbox Code Playgroud)

我遇到了另一个问题,这可能不会影响你,除非你使用黄瓜这个驱动程序......即使我把它打开浏览器,它仍将打开"关于:空白页.看起来这是由这个钩子触发的:

宝石/水豚-1.1.1/lib目录/豚/ cucumber.rb:

After do
  Capybara.reset_sessions!
end
Run Code Online (Sandbox Code Playgroud)

哪个叫gems/capybara-1.1.1/lib/capybara/session.rb:70:在'reset!'中

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

  def reset!
    ...
    @browser.navigate.to('about:blank')
    ...
  end
Run Code Online (Sandbox Code Playgroud)

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

  Capybara::Selenium::Driver.class_eval do
    def reset!
    end
  end
Run Code Online (Sandbox Code Playgroud)


小智 11

一个对我有用的快速黑客:

睡眠(9000)

在您的测试中,您可以在驱动程序关闭之前为浏览器提供相当长的时间.


pmo*_*sio 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
Run Code Online (Sandbox Code Playgroud)

这是我在gems/capybara-1.1.2/lib/capybara/selenium/driver.rb中发现的猴子修补

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

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


小智 4

如果您在启用调试的情况下运行测试并在末尾添加调试器行,则浏览器应该保持打开状态。查看ruby​​-debug gem。也可能值得查看有关Pry 的Railscast 。

  • 如果您可以暂停脚本的执行,那绝对是最简单的解决方案。如果您希望脚本完成/退出并“仍然”保持浏览器打开,则此解决方案将不起作用。 (3认同)