2012-02-11 4 views
4

Я удивлен, что, похоже, не было большого обсуждения этого.watir-webdriver cookie jar сохранение и загрузка

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

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

UPDATE

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

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

ответ

7
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 
+0

Почти. Благодаря! Сохранение и перезагрузка массива из текстового файла становится несколько проблематичным, поэтому я использовал YAML. Вывод полного решения ниже – Marcos

4

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

+0

Изменен, чтобы включить файл cookie: domain: expires: path и: secure также ... возможно, причина, по которой моя банка казалась проигнорированной, и мне все равно приходилось создавать совершенно новый сеанс каждый раз! – Marcos

+0

хороший материал. Заставляет меня задаться вопросом, сколько людей потребуется или использовать такие методы, как .save_cookies и .load_cookies, если они должны быть добавлены. –

+0

Я использую эти две функции куки-файлов cookie в других библиотеках веб-хостинга в течение многих лет - обычно продлить время сеанса сеанса или манипулировать данными за пределами площадки - и было бы очень приятно видеть их в спецификациях Watir. Но я просто столкнулся с другой проблемой, о которой я чувствую, о чем я должен предупредить; комментируя выше. – Marcos

Смежные вопросы