blob: fa7a3760057ddaf2d9c8b466ddac4cc0927f74c9 (
plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
require 'capybara/dsl'
module QA
module Page
class Base
include Capybara::DSL
include Scenario::Actable
extend SingleForwardable
def_delegators :evaluator, :view, :views
def refresh
visit current_url
end
def wait(max: 60, time: 1, reload: true)
start = Time.now
while Time.now - start < max
return true if yield
sleep(time)
refresh if reload
end
false
end
def scroll_to(selector, text: nil)
page.execute_script <<~JS
var elements = Array.from(document.querySelectorAll('#{selector}'));
var text = '#{text}';
if (text.length > 0) {
elements.find(e => e.textContent === text).scrollIntoView();
} else {
elements[0].scrollIntoView();
}
JS
page.within(selector) { yield } if block_given?
end
def click_element(name)
find_element(name).click
end
def find_element(name)
find(element_selector_css(name))
end
def within_element(name)
page.within(element_selector_css(name)) do
yield
end
end
def element_selector_css(name)
Page::Element.new(name).selector_css
end
def self.path
raise NotImplementedError
end
def self.evaluator
@evaluator ||= Page::Base::DSL.new
end
def self.errors
if views.empty?
return ["Page class does not have views / elements defined!"]
end
views.map(&:errors).flatten
end
class DSL
attr_reader :views
def initialize
@views = []
end
def view(path, &block)
Page::View.evaluate(&block).tap do |view|
@views.push(Page::View.new(path, view.elements))
end
end
end
end
end
end
|