-
-
Notifications
You must be signed in to change notification settings - Fork 36
/
query_handler_manager.rb
65 lines (52 loc) · 1.62 KB
/
query_handler_manager.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
require 'singleton'
class Puppeteer::QueryHandlerManager
include Singleton
def query_handlers
@query_handlers ||= {
aria: Puppeteer::AriaQueryHandler.new,
}
end
private def default_handler
@default_handler ||= Puppeteer::CustomQueryHandler.new(
query_one: '(element, selector) => element.querySelector(selector)',
query_all: '(element, selector) => element.querySelectorAll(selector)',
)
end
class Result
def initialize(query_handler:, selector:)
@query_handler = query_handler
@selector = selector
end
def query_one(element_handle)
@query_handler.query_one(element_handle, @selector)
end
def wait_for(dom_world, visible:, hidden:, timeout:, root:)
@query_handler.wait_for(dom_world, @selector, visible: visible, hidden: hidden, timeout: timeout, root: root)
end
def query_all(element_handle)
@query_handler.query_all(element_handle, @selector)
end
def query_all_array(element_handle)
@query_handler.query_all_array(element_handle, @selector)
end
end
def detect_query_handler(selector)
unless /^[a-zA-Z]+\// =~ selector
return Result.new(
query_handler: default_handler,
selector: selector,
)
end
chunk = selector.split("/")
name = chunk.shift
updated_selector = chunk.join("/")
query_handler = query_handlers[name.to_sym]
unless query_handler
raise ArgumentError.new("Query set to use \"#{name}\", but no query handler of that name was found")
end
Result.new(
query_handler: query_handler,
selector: updated_selector,
)
end
end