Как оставить браузер открытым даже после завершения работы скрипта селенового рубина - PullRequest
14 голосов
/ 26 сентября 2011

Я использую скрипт 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 ]

13 голосов
/ 27 сентября 2011

Я никогда не пытался использовать selenium-webdriver в отдельном скрипте, подобном этому, но я столкнулся с той же проблемой, используя selenium-webdriver в контексте 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 - которые вы не , но могут быть и другие люди - я заметил, что он также убивает процесс 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 / Библиотека / водосвинка / cucumber.rb:

After do
  Capybara.reset_sessions!
end

Что вызывает 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

И я решил это с помощью другого обезьяньего патча:

  Capybara::Selenium::Driver.class_eval do
    def reset!
    end
  end
11 голосов
/ 31 августа 2012

Это код, который работал для меня с 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

Я просто добавил путы и строки получения. Selenium :: WebDriver :: Driver выдавал мне не найденную ошибку, вероятно, из-за того, что я получаю селен из капибары.

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

11 голосов
/ 22 мая 2012

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

sleep (9000)

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

4 голосов
/ 26 сентября 2011

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

2 голосов
/ 02 августа 2018

Функция Watir until будет удерживать сценарий, пока условие не вернет true. Установите время ожидания в бесконечность и проверьте, чтобы все окна были закрыты.

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

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

2 голосов
/ 14 октября 2013

Вот фрагмент кода на Python:

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

import time
import sys
...
while 1:
    time.sleep(5)
    try:
       b = browser.find_by_tag("body")      
    except:
      sys.exit()
1 голос
/ 29 апреля 2015

Это в значительной степени то, что другие комментаторы уже говорили о переопределении выхода в драйвере, но вот упрощенный код, который я в итоге использовал для автономного скрипта 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, он запустит Firefox, перейдет по этому URL и оставит окно браузера открытым.

0 голосов
/ 29 марта 2013

Какой тестовый фреймворк вы используете?

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

@driver = Selenium::WebDriver.for :firefox

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

@driver.quit

в демонтаже.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...