Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Cocoa
- extension AXError: Error {
- }
- func copyAttributeValue(_ element: AXUIElement, attribute: String) throws -> AnyObject? {
- var value: AnyObject?
- let error = AXUIElementCopyAttributeValue(element, attribute as CFString, &value)
- if error != .noValue && error != .success {
- print("copyAttributeValue error: \(error.rawValue), attribute: \(attribute), ")
- throw error
- }
- return value
- }
- func copyParameterizedAttributeValue(_ element: AXUIElement, attribute: String, params: Any) throws -> AnyObject? {
- var value: AnyObject?
- let error = AXUIElementCopyParameterizedAttributeValue(element, attribute as CFString, params as AnyObject, &value)
- if error != .noValue && error != .success {
- print("copyParameterizedAttributeValue error: \(error.rawValue), attribute: \(attribute), ")
- throw error
- }
- return value
- }
- func findWebArea(app: AXUIElement) -> AXUIElement? {
- var stack: [AXUIElement] = [app]
- while let element = stack.popLast() {
- let roleResult = try! copyAttributeValue(element, attribute: "AXRole")
- let role = roleResult as? String
- if role == "AXWebArea" {
- return element
- }
- let childrenResult = try! copyAttributeValue(element, attribute: "AXChildren")
- if let children = childrenResult as? [AXUIElement] {
- stack.append(contentsOf: children)
- }
- }
- return nil
- }
- guard let _app = NSWorkspace.shared.runningApplications.first(where: { $0.bundleIdentifier == "com.google.Chrome" }) else {
- fatalError()
- }
- let pid = _app.processIdentifier
- let app = AXUIElementCreateApplication(pid)
- let windowResult = try! copyAttributeValue(app, attribute: "AXFocusedWindow")
- // investigate: Conditional downcast to CoreFoundation type 'AXUIElement' will always succeed
- guard let window = windowResult as! AXUIElement? else {
- fatalError()
- }
- guard let webArea = findWebArea(app: window) else {
- fatalError()
- }
- var webAreaElementsResults: AnyObject?
- let query: [String: Any] = [
- "AXDirection": "AXDirectionNext",
- "AXImmediateDescendantsOnly": false,
- "AXResultsLimit": -1,
- "AXVisibleOnly": true,
- "AXSearchKey": [
- "AXButtonSearchKey",
- "AXCheckBoxSearchKey",
- "AXControlSearchKey",
- "AXGraphicSearchKey",
- "AXLinkSearchKey",
- "AXRadioGroupSearchKey",
- "AXTextFieldSearchKey",
- "AXStaticTextSearchKey"
- ]
- ]
- AXUIElementCopyParameterizedAttributeValue(webArea, "AXUIElementsForSearchPredicate" as CFString, query as AnyObject, &webAreaElementsResults)
- guard let webAreaElements = webAreaElementsResults as! [AXUIElement]? else {
- fatalError()
- }
- print(webAreaElements.count)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement