Как оставить браузер открытым даже после того, как селен рубин script заканчивается

Я использую ruby ​​ script с веб-драйвером селена для автоматизации входа в веб-страницу. Проблема заключается в том, что после завершения script он закрывает браузер. Я хочу, чтобы браузер открывался даже после завершения script. Есть ли способ, по которому я могу оставить браузер открытым после того, как тест сделает что-то еще с окном браузера?

Я так делаю.

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 в автономном script, как это, но я столкнулся с той же проблемой, используя selenium-webdriver в контексте capybara/cucumber.

Посмотрев исходный код для capybara, я нашел этот крючок, который явно закрывает браузер после завершения script. Если вы не используете 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 - что вы не являетесь, но другие люди могут быть - я заметил, что он также убивает процесс chromedriver, и как только этот "сервисный" процесс убит, процесс браузера Chrome, который был подключен к нему, также завершается.

Поэтому мне также пришлось не допустить остановки этого процесса обслуживания, например:

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

Была и другая проблема, с которой я столкнулся, что, вероятно, не повлияет на вас, если вы не используете этот драйвер с огурцом... Даже после того, как я получил его, чтобы оставить браузер открытым, он будет оставлен открытым на странице "about: blank". Похоже, это вызвано этим крюком:

драгоценные камни/водосвинка-1.1.1/Library/водосвинка/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

Это код, который работал у меня с 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 и get. Selenium:: WebDriver:: Драйвер давал мне не найденную ошибку, вероятно, потому, что я получаю селен изнутри capybara.

Это полезно, чтобы увидеть, какой код генерировал ошибку, но есть недостаток: браузер останавливается за последней страницей и отображает пустой экран. Я должен нажать кнопку "Назад", чтобы перейти на страницу с ошибкой, которая может не всегда работать. Кто-нибудь знает, почему браузер загружает эту пустую страницу и избавляет меня от времени, чтобы вникнуть в код capybara? Спасибо!

Ответ 3

Быстрый взлом, который работал у меня:

сон (9000)

в вашем тесте дает вам достаточно времени, чтобы поиграть с браузером, прежде чем драйвер закроет его.

Ответ 4

Если вы запустите тест с включенной отладкой и отбросьте строку отладчика в конце, он должен оставить браузер открытым. Посмотрите на рубиновый отладочный камень. Также может быть стоит проверить этот Railscast на Pry.

Ответ 5

Вот несколько фрагментов в Python:

Поместив это в конец вашего script, вы откроете окна браузера и закроете script, когда он будет закрыт вручную (требуется импорт в начале):

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

Ответ 6

Это во многом то, что другие комментаторы уже заявили об отказе от работы с драйвером, но здесь упрощенный код, который я использовал для автономного Capybara script:

require 'capybara'

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

Предполагая, что у вас есть веб-сервер, запущенный на localhost: 3000, это запустит Firefox, перейдите к этому URL-адресу и оставьте окно браузера открытым.

Ответ 7

Какую тестовую среду вы используете?

Обычно ваша тестовая среда имеет своего рода методы setup и teardown, которые вы можете определить, что позволяет запускать браузер

@driver = Selenium::WebDriver.for :firefox

в методе установки и уничтожить браузер

@driver.quit

при отрыве.

Просто поместите некоторую логику вокруг фрагментации ваших скриптов, чтобы уничтожить браузер, когда захотите.