我很惊讶那里似乎没有太多讨论。
<{3>} Mechanize我可以轻松地从浏览器中读取整个cookie jar,将其存储到文件中,然后将其加载到以后的会话/运行中,然后重新加载该网站的页面。如何用 watir-webdriver 做同样的事情?
更新
现在使用0.5.2我确实看到了新方法browser.cookies.to_hash
这将把这个问题变成“如何使用例如。.clear
和.add
实现 .from_hash 或类似的加载器?”
但是,我特别热衷于使用之前版本(0.4.1)加载和保存所有cookie,我的服务器可能会暂时停留一段时间。通过Selenium司机可能吗?
答案 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环境。只是一个想法。