watir-webdriver cookie jar сохранение и загрузка - PullRequest
5 голосов
/ 11 февраля 2012

Я удивлен, что, кажется, не было много дискуссий по этому вопросу.

в Механизация Я могу легко прочитать весь файл cookie из браузера, сохранить его в файлеи загрузите его в более поздний сеанс / прогон, прежде чем снова загрузить страницы этого сайта.

Как можно сделать то же самое с watir-webdriver ?

ОБНОВЛЕНИЕ

Теперь с 0.5.2 я вижу новые методы browser.cookies.to_hash, которые превратили бы этот вопрос в "Как реализовать .from_hash или аналогичный загрузчик, используя, например, .clearи .add? "

Однако я бы особенно заинтересовался загрузкой и сохранением всех файлов cookie с использованием предыдущих версий (0.4.1), которые мои серверы, вероятно, застряли на некоторое время.Возможно, с помощью драйвера Selenium?

Ответы [ 2 ]

8 голосов
/ 11 февраля 2012
browser = Watir::Browser.new :firefox
browser.goto 'http://google.com'
# save cookies
saved_cookies = browser.cookies.to_a
# clear and get new cookies
browser.cookies.clear
browser.goto 'http://google.com'
# set new cookies
browser.cookies.clear
saved_cookies.each do |saved_cookie|
  browser.cookies.add(saved_cookie[:name], saved_cookie[:value])
end
4 голосов
/ 13 февраля 2012

Применение цикла pOdeje для повторного заполнения банки cookie, вот решение, которое включает в себя сохранение файлов cookie в файл, который можно прочитать в последующем запуске Ruby. При прямом File.open записи и чтении массива были некоторые проблемы, с которыми я не хотел бы обходиться (разбор?), Но Сериализация объекта YAML , уже включенная в Ruby, хорошо подходила для этой задачи.

require 'yaml'

# Save/serialize cookies 
# File.open("ST.cookies.txt", 'w').write $browser.cookies.to_a.to_s 
File.open("ST.cookies.yaml", 'w').write YAML::dump($browser.cookies.to_a)


# Load/deserialize cookies
# $cookies = File.open("ST.cookies.txt", 'r').to_a # returns 1-elem array of single long line, not indiv elements
$cookies = YAML::load(File.open("ST.cookies.yaml", 'r'))
$browser.cookies.clear
$cookies.each do |saved_cookie|
  $browser.cookies.add saved_cookie[:name], 
      saved_cookie[:value],
      :domain => saved_cookie[:domain], 
      :expires => saved_cookie[:expires], 
      :path => saved_cookie[:path], 
      :secure => saved_cookie[:secure]
    end

Тем не менее, в поисках метода до watir-webdriver 0.5.x.

CAVEAT

Пока еще не полностью протестирован, но, похоже, мне нужно сначала загрузить URL-адрес, к которому применяются файлы cookie, , а затем загрузить в мой файл cookie, используя вышеуказанный метод, и наконец загрузите этот URL в $browser объект во второй раз . Это лишь незначительное неудобство и затраты времени для моего случая, когда я остаюсь в одном и том же домене на протяжении всей веб-сессии, но я вижу, что это превращается в настоящую проблему для файлов cookie, затрагивающих несколько не связанных сайтов (как это было на самом деле ожидание моих старых программ с использованием других языков и библиотек, таких как Mechanize). Curl, Wget и вообще другие инструменты, которые я использовал для взаимодействия с SOAP, всегда позволяют мне контролировать свои среды POST / сеанса / cookie до загрузки сайта. Просто мысль.

...