watir-webdriver cookie jar保存和加载

时间:2012-02-11 10:19:24

标签: serialization cookies watir watir-webdriver

我很惊讶那里似乎没有太多讨论。

<{3>} Mechanize我可以轻松地从浏览器中读取整个cookie jar,将其存储到文件中,然后将其加载到以后的会话/运行中,然后重新加载该网站的页面。

如何用 watir-webdriver 做同样的事情?

更新

现在使用0.5.2我确实看到了新方法browser.cookies.to_hash 这将把这个问题变成“如何使用例如。.clear.add实现 .from_hash 或类似的加载器?”

但是,我特别热衷于使用之前版本(0.4.1)加载和保存所有cookie,我的服务器可能会暂时停留一段时间。通过Selenium司机可能吗?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

应用pOdeje的循环重新填充cookie jar,这里有一个解决方案,包括将cookie存储到一个文件中,可以在以后的Ruby运行中读取。直接File.open写入和读取数组有一些我不想解决的问题(解析?),但已经捆绑在Ruby中的 YAML对象序列化非常适合任务

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

尚未经过全面测试,但似乎我必须首先加载Cookie所适用的网址,然后使用上述方法加载到我的Cookie jar中,并且< em>最后将该网址加载到$browser对象第二次。对于我在整个网络会话期间保持在同一个域内的情况,这只是一个小小的不便和时间成本,但我可以看到这变成了对影响几个不相关网站的cookie罐子的真正荆棘(事实上已经是期望我的旧程序使用其他语言和像Mechanize这样的库。 Curl和Wget以及我用于SOAP接口的其他工具总是让我在站点加载之前控制我的POST / session / cookie环境。只是一个想法。