Advertisement
Guest User

Untitled

a guest
Apr 21st, 2021
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. import Cocoa
  2.  
  3.  
  4. extension AXError: Error {
  5.  
  6. }
  7.  
  8. func copyAttributeValue(_ element: AXUIElement, attribute: String) throws -> AnyObject? {
  9. var value: AnyObject?
  10. let error = AXUIElementCopyAttributeValue(element, attribute as CFString, &value)
  11.  
  12. if error != .noValue && error != .success {
  13. print("copyAttributeValue error: \(error.rawValue), attribute: \(attribute), ")
  14. throw error
  15. }
  16.  
  17. return value
  18. }
  19.  
  20. func copyParameterizedAttributeValue(_ element: AXUIElement, attribute: String, params: Any) throws -> AnyObject? {
  21. var value: AnyObject?
  22. let error = AXUIElementCopyParameterizedAttributeValue(element, attribute as CFString, params as AnyObject, &value)
  23.  
  24. if error != .noValue && error != .success {
  25. print("copyParameterizedAttributeValue error: \(error.rawValue), attribute: \(attribute), ")
  26. throw error
  27. }
  28.  
  29. return value
  30. }
  31.  
  32. func findWebArea(app: AXUIElement) -> AXUIElement? {
  33. var stack: [AXUIElement] = [app]
  34. while let element = stack.popLast() {
  35. let roleResult = try! copyAttributeValue(element, attribute: "AXRole")
  36. let role = roleResult as? String
  37. if role == "AXWebArea" {
  38. return element
  39. }
  40.  
  41. let childrenResult = try! copyAttributeValue(element, attribute: "AXChildren")
  42. if let children = childrenResult as? [AXUIElement] {
  43. stack.append(contentsOf: children)
  44. }
  45. }
  46.  
  47. return nil
  48. }
  49.  
  50.  
  51. guard let _app = NSWorkspace.shared.runningApplications.first(where: { $0.bundleIdentifier == "com.google.Chrome" }) else {
  52. fatalError()
  53. }
  54.  
  55. let pid = _app.processIdentifier
  56. let app = AXUIElementCreateApplication(pid)
  57.  
  58. let windowResult = try! copyAttributeValue(app, attribute: "AXFocusedWindow")
  59.  
  60. // investigate: Conditional downcast to CoreFoundation type 'AXUIElement' will always succeed
  61. guard let window = windowResult as! AXUIElement? else {
  62. fatalError()
  63. }
  64.  
  65. guard let webArea = findWebArea(app: window) else {
  66. fatalError()
  67. }
  68.  
  69. var webAreaElementsResults: AnyObject?
  70. let query: [String: Any] = [
  71. "AXDirection": "AXDirectionNext",
  72. "AXImmediateDescendantsOnly": false,
  73. "AXResultsLimit": -1,
  74. "AXVisibleOnly": true,
  75. "AXSearchKey": [
  76. "AXButtonSearchKey",
  77. "AXCheckBoxSearchKey",
  78. "AXControlSearchKey",
  79. "AXGraphicSearchKey",
  80. "AXLinkSearchKey",
  81. "AXRadioGroupSearchKey",
  82. "AXTextFieldSearchKey",
  83. "AXStaticTextSearchKey"
  84. ]
  85. ]
  86. AXUIElementCopyParameterizedAttributeValue(webArea, "AXUIElementsForSearchPredicate" as CFString, query as AnyObject, &webAreaElementsResults)
  87. guard let webAreaElements = webAreaElementsResults as! [AXUIElement]? else {
  88. fatalError()
  89. }
  90.  
  91. print(webAreaElements.count)
  92.  
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement