2

こんにちは — Applescript のナブです。

実際に以下のスクリプトを実行しようとしているわけではありませんが、この効果を実現する AppleScript 言語構造を見つけようとしています (これは、私がよく知っている言語では問題なく機能します)。

set adoc to choose file
tell application "Finder"
    tell application "TextEdit"
        open adoc
    end tell
    tell application process "Textedit" of application "System Events"
        if (click menu item "Print…" of menu "File" of menu bar item "File" of menu bar 1 of application process "TextEdit" of application "System Events") then
            display dialog "It worked boss!"
        end if
    end tell
end tell

基本的に、私は古いアプリケーションの GUI スクリプトを作成しており、イベントが発生したかどうかをすべての段階で知る必要があります。たとえば、印刷ウィンドウが存在するかどうかを尋ねることで、イベントの成功を推測できることはわかっていますが、理由については説明しませんが、予想される結果からイベントを推測したくありません。それは起こった。AppleScript でこれを行う方法はありますか? ありがとう!


興味深いことに、私のばかげた難解な目的のために、提供された両方の回答を組み合わせることで、いくつかの非常に古いアプリのスクリプトを作成するという困難を乗り越えることができました。場合によっては、同様のボタンを持つ 2 つの可能なウィンドウのうちの 1 つが存在する可能性があります。この場合、{x,y} ソリューション (私の目的では、いくつかのケースではより効果的) は機能しません。間違ったボタンを正しくクリックできるためです。ここで、試行錯誤戦略の適用 (実際には、考慮しなかったのは一種の愚かさだと感じています) では、同じ精度が得られません。なぜなら、私が扱っている UI 要素のいくつかは奇妙であり、そうではないからです。期待どおりに動作する (または期待されるプロパティを持っている) 場合、少なくともその問題は解決されます。この悪夢から私を救ってくれてありがとう!

4

2 に答える 2

1

あなたが発見したように、AppleScript にはtruefalseの概念がありません。評価される値または適切なブール値 (値または式のいずれか) である値のみtrueですfalse。それと一致して、 0 でも空の文字列でもなく、missing valueに強制することもできませんfalse

GUI スクリプト操作の成功をテストしたい場合は、戻り値のクラスをUI 要素クラス階層内の対象オブジェクトのクラスと比較するなどして、戻り値を期待値と比較する必要があります。すなわち

if class of (click menu item "Print…" of menu "File" of menu bar item "File" of menu bar 1 of process "TextEdit" of application "System Events") is menu item then
    display dialog "It worked, Boss"
end if

try … on errorまたは、コードをブロックでラップすることにより、OSA の例外の多用を活用します。つまり、

try
    click menu item "Print…" of menu "File" of menu bar item "File" of menu bar 1 of process "TextEdit" of application "System Events"
    display dialog "It worked, Boss"
on error errorMessage
    log errorMessage
end try

あなたが実際に実行しようとしていないと言ったように、期待どおりに動作しなくなるいくつかのエラーが含まれているサンプルコードについてコメントすることは控えます...

于 2012-05-01T18:50:38.573 に答える
1

ちょうど別のアプローチ。アクションとクリックの場合、成功した場合はオブジェクトを返すか、別のオブジェクトを返します。これらのオブジェクトを照合して、ターゲット以外のオブジェクトがアクションを受けていないことを確認します。

tell application "System Events"
    tell process "Safari"
        if (count of windows) < 1 then return --there are no windows, no reason to continue
        tell window 1
            tell checkbox 1 of group 1
                if (click it) is not it then
                    --click has failed; stop 
                    return
                end if
            end tell
        end tell
    end tell
end tell

--編集: adayzdone が印刷でどのように機能するかを示すために、いくつかのサンプル コードを追加しました。

tell application "Safari" to activate --comment//uncomment this line
tell application "System Events"
    tell process "Safari"
        set theTarget to menu bar item 3 of menu bar 1
        set {xPos, yPos} to position of theTarget
        if (click at {xPos, yPos}) is not theTarget then
            return false
        end if
        set theTarget to last menu item of menu 1 of menu bar item 3 of menu bar 1
        set {xPos, yPos} to position of theTarget
        if (click at {xPos, yPos}) is not theTarget then
            return false
        end if
        return true
    end tell
end tell
于 2012-05-01T23:09:48.257 に答える