即使在 selenium ruby​​ 脚本完成后如何让浏览器保持打开状态

Posted

技术标签:

【中文标题】即使在 selenium ruby​​ 脚本完成后如何让浏览器保持打开状态【英文标题】:How to leave browser opened even after selenium ruby script finishes 【发布时间】:2011-11-25 04:57:09 【问题描述】:

我正在使用带有 selenium 网络驱动程序的 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 

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

【问题讨论】:

【参考方案1】:

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

查看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

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

  Selenium::WebDriver::Driver.class_eval do
    def quit
      #STDOUT.puts "#self.class#quit: no-op"
    end
  end

注意:如果您使用的是Selenium::WebDriver.for :chromechromedriver -- 您不是,但其他人可能是 -- 我注意到它也会杀死 chromedriver 进程,并且一旦该“服务”进程被杀死,Chrome 浏览器与其连接的进程也退出。

所以我还必须阻止该服务进程停止,如下所示:

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

我遇到了另一个问题,这可能不会影响到您,除非您将此驱动程序与 cucumber 一起使用......即使在我让它保持浏览器打开之后,它将在“关于:空白”页面上保持打开状态。看起来这是由这个钩子触发的:

gems/capybara-1.1.1/lib/capybara/cucumber.rb:

After do
  Capybara.reset_sessions!
end

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

调用 gems/capybara-1.1.1/lib/capybara/selenium/driver.rb:80:in `reset!'":

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

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

  Capybara::Selenium::Driver.class_eval do
    def reset!
    end
  end

【讨论】:

【参考方案2】:

对我有用的快速破解:

睡眠(9000)

在您的测试中,您有相当长的时间在驱动程序关闭之前使用浏览器。

【讨论】:

我认为这会阻止正在调试的单线程服务器为来自浏览器的其他请求提供服务:(【参考方案3】:

这是对 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 和 gets 行。 Selenium::WebDriver::Driver 给了我一个未找到的错误,可能是因为我从水豚中获取了硒。

这对于查看产生错误的代码很有用,但有一个缺点:浏览器在最后一页之后停止并显示空白屏幕。我必须单击后退按钮才能进入出现错误的页面,这可能并不总是有效。有人知道为什么浏览器会加载那个空页面并节省我研究水豚代码的时间吗?谢谢!

【讨论】:

【参考方案4】:

如果您在启用调试的情况下运行测试并在最后放置一个调试器行,它应该让浏览器保持打开状态。看看ruby-debug gem。也可能值得查看有关 Pry 的 Railscast。

【讨论】:

如果您可以暂停脚本的执行,那绝对是最简单的解决方案。如果您希望脚本完成/退出并仍然让浏览器保持打开状态,则此解决方案将不起作用。【参考方案5】:

这里有一些 Python 中的 sn-p:

将其放在脚本的末尾,将使浏览器窗口保持打开状态,并在手动关闭脚本时结束脚本(需要在开头进行一些导入):

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

【讨论】:

Selenium 更新版本用户注意事项:我发现我必须将 find_by_tag 更改为 find_element_by_tag_name 这只是打开浏览器,insta 关闭它,然后在 python Splinter(它使用 selenium 使用 chromedriver)中几分钟后再次打开它,但行为可能会有所不同。【参考方案6】:

Watir 的until 函数将保存脚本直到条件返回真。将超时设置为无穷大并检查所有要关闭的窗口。

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

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

【讨论】:

编辑解释。【参考方案7】:

这在很大程度上是其他评论者已经说过的关于覆盖驱动程序的退出,但这是我最终用于独立 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 并保持浏览器窗口打开。

【讨论】:

【参考方案8】:

您使用的是什么测试框架?

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

@driver = Selenium::WebDriver.for :firefox

在setup方法中,销毁浏览器

@driver.quit

拆解中。

只需在脚本的拆解部分添加一些逻辑,以便仅在需要时销毁浏览器。

【讨论】:

以上是关于即使在 selenium ruby​​ 脚本完成后如何让浏览器保持打开状态的主要内容,如果未能解决你的问题,请参考以下文章

Selenium:即使在应用 Wait 后表单也不可见

如果网站对其 UI 进行任何更改,selenium 网络自动化是不是仍然有效?

Selenium - 页面更改后找不到元素,即使它是可见的

ruby之selenium 安装篇

Selenium3快速入门:如何编写第一个脚本Hello world!

未知错误:即使在 chromedriver 升级后,调用函数结果也缺少 Selenium Send Keys 的“值”