Skip to content

Commit

Permalink
Add new manager to interact with WebStorage (#29)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dakad committed May 8, 2023
1 parent 048dbf2 commit dc082a3
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 0 deletions.
67 changes: 67 additions & 0 deletions spec/features/web_storage_spec.cr
@@ -0,0 +1,67 @@
require "../spec_helper"

module Selenium::Command
describe "WebStorageManager", tags: "feature" do
it "works for localStorage" do
TestServer.route "/home", "<h1>The Title</h1>"

with_session do |session|
session.navigate_to("http://localhost:3002/home")
local_storage_manager = session.local_storage_manager

local_storage_manager.item("foo", "barr")
item = local_storage_manager.item("foo")
item.should eq("barr")

local_storage_manager.size.should eq(1)

local_storage_manager.item("fizz", "buzz")
item = local_storage_manager.item("fizz")
item.should eq("buzz")

local_storage_manager.size.should eq(2)

local_storage_manager.item("foo", "bazz")
item = local_storage_manager.item("foo")
item.should eq("bazz")

names = local_storage_manager.keys
names.should eq(["foo", "fizz"])

local_storage_manager.clear
local_storage_manager.size.should eq(0)
end
end

it "works for sessionStorage" do
TestServer.route "/home", "<h1>The Title</h1>"

with_session do |session|
session.navigate_to("http://localhost:3002/home")
session_storage_manager = session.session_storage_manager

session_storage_manager.item("foo", "barr")
item = session_storage_manager.item("foo")
item.should eq("barr")

session_storage_manager.size.should eq(1)

session_storage_manager.item("fizz", "buzz")
item = session_storage_manager.item("fizz")
item.should eq("buzz")

session_storage_manager.size.should eq(2)

session_storage_manager.item("foo", "bazz")
item = session_storage_manager.item("foo")
item.should eq("bazz")

names = session_storage_manager.keys
names.should eq(["foo", "fizz"])

session_storage_manager.clear
session_storage_manager.size.should eq(0)
end
end
end
end
8 changes: 8 additions & 0 deletions src/selenium/session.cr
Expand Up @@ -26,6 +26,14 @@ class Selenium::Session
AlertManager.new(command_handler, id)
end

def local_storage_manager
WebStorageManager.new(document_manager, WebStorageManager::StorageType::LocalStorage)
end

def session_storage_manager
WebStorageManager.new(document_manager, WebStorageManager::StorageType::SessionStorage)
end

def delete
command_handler.execute(:delete_session, path_variables)
end
Expand Down
50 changes: 50 additions & 0 deletions src/selenium/web_storage_manager.cr
@@ -0,0 +1,50 @@
class Selenium::WebStorageManager
enum StorageType
LocalStorage
SessionStorage
end

getter document_manager : DocumentManager

forward_missing_to @document_manager

def initialize(@document_manager, @storage : StorageType = StorageType::LocalStorage)
end

# Clear all items from the Storage
def clear
document_manager.execute_script("#{storage_type_in_js}.clear()")
end

# Retrieve and insert item from/into the Storage.
# If no value is given, it will return the item specified in `name`.
# For a given `value`, it will be added or updated for the item specified in `name`.
def item(name : String, value = nil) : String | Nil
if value.nil?
document_manager.execute_script("return #{storage_type_in_js}.getItem('#{name}')")
else
document_manager.execute_script("#{storage_type_in_js}.setItem('#{name}', '#{value}')")
end
end

# Retrieve the list of keys from the Storage
def keys : JSON::Any
str = document_manager.execute_script("return Object.keys(#{storage_type_in_js})")
JSON.parse(str)
end

# Remove the item specified in `name` from the Storage
def remove(name : String)
document_manager.execute_script("#{storage_type_in_js}.removeItem('#{name}')")
end

# Retrieve the number of items in the Storage
def size : Int
document_manager.execute_script("return #{storage_type_in_js}.length").to_i
end

# TODO: Add doc
private def storage_type_in_js
"window.#{@storage.to_s.camelcase(lower: true)}"
end
end

0 comments on commit dc082a3

Please sign in to comment.