Skip to content

Commit d2b92ce

Browse files
committed
force enable accessibility engine
1 parent 194deeb commit d2b92ce

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Foundation
2+
3+
extension EventGenerator {
4+
/// Shared setting values for all event generators
5+
public static var settings = Settings()
6+
7+
/// Shared setting values for all event generators
8+
public struct Settings {
9+
/// The delay to wait after activating the accessibility engine.
10+
public var accessibilityActivateDelay: TimeInterval = 0.02
11+
12+
/// The delay to wait after activating the accessibility engine for the first time in a simulator.
13+
public var accessibilityActivateFirstTimeDelay: TimeInterval = 5.0
14+
}
15+
}

Sources/Hammer/EventGenerator/EventGenerator.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public final class EventGenerator {
114114
public func waitUntilWindowIsReady(timeout: TimeInterval = 3) throws {
115115
do {
116116
try self.waitUntil(self.isWindowReady, timeout: timeout)
117+
try self.waitUntilAccessibilityActivate()
117118
try self.waitUntilRunloopIsFlushed(timeout: timeout)
118119
} catch {
119120
throw HammerError.windowIsNotReadyForInteraction
@@ -181,6 +182,38 @@ public final class EventGenerator {
181182
try self.sendMarkerEvent { try? waiter.complete() }
182183
try waiter.start()
183184
}
185+
186+
// MARK: - Accessibility initialization
187+
188+
private var isAccessibilityActivated = false
189+
190+
private func waitUntilAccessibilityActivate() throws {
191+
UIApplication.shared.accessibilityActivate()
192+
if self.isAccessibilityActivated {
193+
return
194+
}
195+
196+
// The first time the accessibility engine is activated in a simulator it needs more time to warm up
197+
// and start producing consistent results, after that only a short delay per test case is enough
198+
let simAccessibilityActivatedKey = "accessibility_activated"
199+
let simAccessibilityActivated = UserDefaults.standard.bool(forKey: simAccessibilityActivatedKey)
200+
if !simAccessibilityActivated {
201+
print("Activating accessibility engine for the first time in this simulator and waiting 5s")
202+
} else {
203+
print("Activating accessibility engine and waiting 0.1s")
204+
}
205+
206+
try self.wait(
207+
simAccessibilityActivated
208+
? EventGenerator.settings.accessibilityActivateDelay // Default: 0.02s
209+
: EventGenerator.settings.accessibilityActivateFirstTimeDelay // Default: 5.0s
210+
)
211+
212+
self.isAccessibilityActivated = true
213+
if !simAccessibilityActivated {
214+
UserDefaults.standard.set(true, forKey: simAccessibilityActivatedKey)
215+
}
216+
}
184217
}
185218

186219
// Bypasses deprecation warning for `isIgnoringInteractionEvents`

0 commit comments

Comments
 (0)