testcentricity_mobile 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +105 -0
- data/LICENSE.md +27 -0
- data/README.md +1795 -0
- data/lib/testcentricity_mobile/app_core/appium_connect_helper.rb +634 -0
- data/lib/testcentricity_mobile/app_core/screen_object.rb +413 -0
- data/lib/testcentricity_mobile/app_core/screen_objects_helper.rb +183 -0
- data/lib/testcentricity_mobile/app_core/screen_section.rb +607 -0
- data/lib/testcentricity_mobile/app_elements/alert.rb +152 -0
- data/lib/testcentricity_mobile/app_elements/app_element.rb +692 -0
- data/lib/testcentricity_mobile/app_elements/button.rb +10 -0
- data/lib/testcentricity_mobile/app_elements/checkbox.rb +56 -0
- data/lib/testcentricity_mobile/app_elements/image.rb +10 -0
- data/lib/testcentricity_mobile/app_elements/label.rb +10 -0
- data/lib/testcentricity_mobile/app_elements/list.rb +175 -0
- data/lib/testcentricity_mobile/app_elements/switch.rb +66 -0
- data/lib/testcentricity_mobile/app_elements/textfield.rb +51 -0
- data/lib/testcentricity_mobile/appium_server.rb +71 -0
- data/lib/testcentricity_mobile/data_objects/data_objects_helper.rb +100 -0
- data/lib/testcentricity_mobile/data_objects/environment.rb +416 -0
- data/lib/testcentricity_mobile/exception_queue_helper.rb +160 -0
- data/lib/testcentricity_mobile/utility_helpers.rb +48 -0
- data/lib/testcentricity_mobile/version.rb +3 -0
- data/lib/testcentricity_mobile/world_extensions.rb +61 -0
- data/lib/testcentricity_mobile.rb +99 -0
- metadata +317 -0
@@ -0,0 +1,152 @@
|
|
1
|
+
module TestCentricity
|
2
|
+
module AppElements
|
3
|
+
class AppAlert < AppUIElement
|
4
|
+
def initialize(name, parent, locator, context)
|
5
|
+
super
|
6
|
+
@type = :alert
|
7
|
+
end
|
8
|
+
|
9
|
+
# Wait until the alert modal is visible, or until the specified wait time has expired. If the wait time is nil, then the
|
10
|
+
# wait time will be Environ.default_max_wait_time. Unlike wait_until_visible or wait_until_exists, this method does not
|
11
|
+
# raise an exception if the alert modal does not appear within the specified wait time.
|
12
|
+
# Returns true if the alert modal is visible.
|
13
|
+
#
|
14
|
+
# @return [Integer]
|
15
|
+
# @param seconds [Integer or Float] wait time in seconds
|
16
|
+
# @example
|
17
|
+
# permissions_modal.await(2)
|
18
|
+
#
|
19
|
+
def await(seconds)
|
20
|
+
timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
|
21
|
+
wait = Selenium::WebDriver::Wait.new(timeout: timeout)
|
22
|
+
wait.until do
|
23
|
+
reset_mru_cache
|
24
|
+
visible?
|
25
|
+
end
|
26
|
+
true
|
27
|
+
rescue
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
# Performs the action to required accept the currently visible alert modal. If the alert modal is still visible after
|
32
|
+
# 5 seconds, an exception is raised.
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# alert_modal.accept
|
36
|
+
#
|
37
|
+
def accept
|
38
|
+
reset_mru_cache
|
39
|
+
alert_accept
|
40
|
+
wait_until_gone(seconds = 5, post_exception = false)
|
41
|
+
if visible?
|
42
|
+
alert_accept
|
43
|
+
wait_until_gone(5)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Performs the action required dismiss the currently visible alert modal. If the alert modal is still visible after
|
48
|
+
# 5 seconds, an exception is raised.
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# alert_modal.dismiss
|
52
|
+
#
|
53
|
+
def dismiss
|
54
|
+
reset_mru_cache
|
55
|
+
alert_dismiss
|
56
|
+
wait_until_gone(seconds = 5, post_exception = false)
|
57
|
+
if visible?
|
58
|
+
alert_dismiss
|
59
|
+
wait_until_gone(5)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# @return [Integer]
|
65
|
+
# @param action [Symbol or String] action to perform if alert modal is visible. Acceptable values are :allow, :accept, :dont_allow, or :dismiss
|
66
|
+
# @param timeout [Integer or Float] wait time in seconds. Defaults to 2 if not specified
|
67
|
+
# @param button_name [String] optional caption of button to tap associated with the specified action
|
68
|
+
# @example
|
69
|
+
# alert_modal.await_and_respond(:dismiss)
|
70
|
+
# OR
|
71
|
+
# permissions_modal.await_and_respond(:accept, timeout = 1, button_name = 'Allow Once')
|
72
|
+
#
|
73
|
+
def await_and_respond(action, timeout = 2, button_name = nil)
|
74
|
+
reset_mru_cache
|
75
|
+
action = action.gsub(/\s+/, '_').downcase.to_sym if action.is_a?(String)
|
76
|
+
if await(timeout)
|
77
|
+
case action
|
78
|
+
when :allow, :accept
|
79
|
+
if button_name.nil?
|
80
|
+
accept
|
81
|
+
elsif Environ.is_ios?
|
82
|
+
Environ.appium_driver.execute_script('mobile: alert', { action: 'accept', buttonLabel: button_name })
|
83
|
+
else
|
84
|
+
Environ.appium_driver.execute_script('mobile: acceptAlert', { buttonLabel: button_name })
|
85
|
+
end
|
86
|
+
when :dont_allow, :dismiss
|
87
|
+
if button_name.nil?
|
88
|
+
dismiss
|
89
|
+
elsif Environ.is_ios?
|
90
|
+
Environ.appium_driver.execute_script('mobile: alert', { action: 'dismiss', buttonLabel: button_name })
|
91
|
+
else
|
92
|
+
Environ.appium_driver.execute_script('mobile: dismissAlert', { buttonLabel: button_name })
|
93
|
+
end
|
94
|
+
else
|
95
|
+
raise "#{action} is not a valid selector"
|
96
|
+
end
|
97
|
+
if Environ.is_ios? && await(1)
|
98
|
+
case action
|
99
|
+
when :allow, :accept
|
100
|
+
accept
|
101
|
+
when :dont_allow, :dismiss
|
102
|
+
dismiss
|
103
|
+
end
|
104
|
+
if await(1)
|
105
|
+
buttons = Environ.appium_driver.execute_script('mobile: alert', { action: 'getButtons' })
|
106
|
+
raise "Could not perform #{action} action on active modal. Available modal buttons are #{buttons}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
true
|
110
|
+
else
|
111
|
+
false
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def buttons
|
116
|
+
if Environ.is_ios?
|
117
|
+
Environ.appium_driver.execute_script('mobile: alert', { action: 'getButtons' })
|
118
|
+
else
|
119
|
+
obj = element
|
120
|
+
object_not_found_exception(obj)
|
121
|
+
captions = []
|
122
|
+
labels = obj.find_elements(:class, 'android.widget.Button')
|
123
|
+
labels.each do |label|
|
124
|
+
captions.push(label.text)
|
125
|
+
end
|
126
|
+
captions
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_caption
|
131
|
+
obj = element
|
132
|
+
object_not_found_exception(obj)
|
133
|
+
if Environ.is_ios?
|
134
|
+
captions = []
|
135
|
+
labels = obj.find_elements(:class, 'XCUIElementTypeStaticText')
|
136
|
+
labels.each do |label|
|
137
|
+
captions.push(label.text)
|
138
|
+
end
|
139
|
+
captions
|
140
|
+
else
|
141
|
+
title_obj = obj.find_element(:id, 'android:id/alertTitle')
|
142
|
+
msg_obj = obj.find_element(:id, 'android:id/message')
|
143
|
+
if msg_obj.nil?
|
144
|
+
[title_obj.text]
|
145
|
+
else
|
146
|
+
[title_obj.text, msg_obj.text]
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|