5

10.7.4 OSX Lion Applescript

我正在使用一个应用程序(内置并且没有 Applescript 字典),它有一个静态文本元素,我想复制到剪贴板并发送到另一个应用程序,但我很难让它工作。

我用于定位元素的脚本如下所示:

Tell application "System Events" to set frontmost of process "*application*" to true
Tell application "System Events"
    Tell process "*application*" 
        Tell static text 1 of tab view 1 scroll area 1 of splitter group 1 of splitter group 1 of splitter group 1 of window 1
            keystroke "a" using command down
            delay 0.1
            keystroke "c" using command down
            delay 0.1
        end tell
    end tell
end tell
end tell

会发生的情况是,每次我单击应用程序上的不同位置(有许多文本字段)时,都会将来自错误元素的错误文本复制到剪贴板。

我在 UI Accessor/Accessibility Accessor 中注意到,当您将鼠标悬停在应用程序中的每个 UI 元素上时,它们都有一个唯一的 AXIdentifier 值。

有没有办法完成我想做的事情,使用 AXIdentifier 值来定位该元素并从中复制文本?

感谢所有帮助这是我的第一篇文章,我希望它是值得的!~TheLarkInn

4

3 回答 3

4

您可以通过使用 AppleScript 的过滤来做到这一点。例如,要在 Apple Mail 的邮件撰写窗口中获取 From: 弹出菜单,没有可以匹配的可访问性描述,但是有一个唯一的 AXIdentifier,您可以匹配如下:

tell application "System Events"
    tell application process "Mail"
        tell window 1
            get first pop up button whose value of attribute "AXIdentifier" is "popup_from"
        end tell
    end tell
end tell

这比在 AppleScript 中循环更有效,因为它只涉及向系统事件发送一个 Apple 事件。

于 2016-04-23T16:38:43.520 回答
3

我认为没有办法直接做你想做的事情。似乎只有通过选择器处理元素后才能访问属性。这是一个非常丑陋的解决方案,它通过迭代所有 UI 元素来满足您的要求,但是对于较大的 UI,它确实很慢,并且可能不适合任何生产级代码。

tell application "System Events"
  tell process "Some Process"
    set tElements to entire contents of window "Some Window"
    repeat with tElement in tElements
      if (exists attribute "AXIdentifier" of tElement) then
        if value of attribute "AXIdentifier" of tElement = "Some AXIdentifier" then set tText to value of tElement
      end if
    end repeat
  end tell
end tell
tText

我认为使用Xcode 中的UIElementInspector或 Accessibility Inspector 来构建选择器字符串是可行的方法!

于 2013-05-09T21:12:22.370 回答
0
Tell application "*application*" to activate

Tell application "System Events"
    Tell application process "*application*" 
        set textStaticTextValue to value of static text 1 of tab view 1 scroll area 1 of splitter group 1 of splitter group 1 of splitter group 1 of window 1
    end tell
end tell
于 2012-10-01T03:25:41.107 回答