rubycdp / ferrum

Headless Chrome Ruby API
https://ferrum.rubycdp.com
MIT License
1.71k stars 123 forks source link

Improve the flow of retrieving and setting Cookies #253

Closed gbaptista closed 2 years ago

gbaptista commented 2 years ago

Today, I have to set cookies through:

browser.cookies.set(name: "stealth", value: "omg", domain: "google.com")

This is great, but if I want, for example, to use a retrieved cookie:

some_cookie = browser.cookies.all.values.first
# #<Ferrum::Cookies::Cookie:0x00007f96b038e6b0
#  @attributes=
#   {"name"=>"stealth",
#    "value"=>"omg",
#    "domain"=>"google.com"}>

browser.cookies.set(some_cookie)
# => ArgumentError: wrong number of arguments (given 1, expected 0)

To make the cookie object comply with the expected API, I need to workaround:

adapted_cookie = {}

some_cookie.instance_variable_get('@attributes').each do |key, value|
  cookie[key.to_sym] = value
end

browser.cookies.set(**adapted_cookie)

Why would that be important? For my use case, I store cookies and then retrieve them at another moment in the future:

# Save:
File.write('cookies.bin', Marshal.dump(browser.cookies.all))

# Load:
Marshal.load(File.read('cookies.bin')).values.each do |raw_cookie|
  adapted_cookie = {}
  raw_cookie.instance_variable_get('@attributes').each do |key, value|
    adapted_cookie[key.to_sym] = value
  end
  browser.cookies.set(**adapted_cookie)
end

Some ideas to improve this flow:

route commented 2 years ago

Totally agree it's definitely not thoroughly thought now and needs improvement.

gbaptista commented 2 years ago

Closed by: