Safari 10.1.2 , javascript内の変数に代入した値が実行結果として戻らない。

tell application "Safari"

do JavaScript "var a = 1.0;

true" in document 1

end tell


上記applescriptをSafari10.1以前で実行した場合は、

javascript内の変数aに代入した値が実行結果として戻ってきていたのですが、

10.1.2では、ループ状態になりタイムアウトしてしまいます。


これと同様のスクリプトを業務で多用しているため大変困っています。

解決策などご存知の方がおられましたらお知らせいただければ幸いです。



* タイトルを変更しました。 Apple Inc.

投稿日 2017/08/25 20:29

返信
返信: 32

2017/08/28 02:34 ババイソン への返信

度々、失礼致します。 


JavaScriptの.toString()メソッドで、文字列としてAppleScriptに返したものを、AppleScriptのasオペレーターで数値に変換し直すということもできそうです(参照リンク:Coercion (Object Conversion))。


tell application "Safari"

(do JavaScript "a=1.0; a.toString();" in document 1) as real

end tell

2017/08/26 08:10 ババイソン への返信

ババイソンさん:


私も類似の環境です;

  1. Yosemite 10.10.5 (14F2511)
  2. Safari Version 10.1.2 (10603.3.8)
  3. Script Editor: Ver. 2.7(176)
  4. AppleScript: 2.4


そこで、ご提示のスクリプトを走らせた結果をご提示します;


ユーザがアップロードしたファイル


やはりYosemiteでのSafariから完了シグナルが戻ってこないようです。


当方はAppleScriptはよく知らないので、事例紹介まで。

2017/08/27 02:11 ババイソン への返信

度々、失礼致します。 YosemiteからJavaScript for Automationが使える様になったと思います。 Script Editor.appの言語をJavaScriptに変えて、以下のスクリプトを実行してみるとどうでしょうか(参照リンク:Calling Commands)?


var Safari = Application("Safari");

Safari.doJavaScript('a=1.0;a;', { in: Safari.documents[0]});

2017/08/25 22:07 ババイソン への返信

失礼致します。 


私の環境(macOS Sierra ver. 10.12.5, Safari.app ver. 10.1.2, AppleScript ver. 2.5, Script Editor.app ver. 2.9)では、trueが返ってきます。 ループ状態?にもならないです。 スクリプトの最後をtrueではなく、 true; a; とすると、aの値1.0が返されます。 また、Safari.appの開発メニューのAppleEventからの…をオフにすると、Script Editor.appからの実行で、エラーになってしまいます。


AppleScriptの実行は、Script Editor.appからの実行でしょうか? あるいは、Macのセーフブートなどを試されましたでしょうか?

2017/08/25 21:55 T22T への返信

T22T様 ご確認ありがとうございます。 私も質問する段階で環境の詳細を述べるべきでした。 macOS Yosemite ver. 10.10.5, Safari.app ver. 10.1.2, AppleScript ver. 2.4, Script Editor.app ver. 2.7 こちらの環境下での不具合でございます。 T22T様の環境で動いておられるのでしたらOSの問題もはらんでいるのかもしれませんね。 私は業務上OSのアップデートはできないのでなんとかYosemite環境で正常に動くようにしなければなりません。 実行は、Script Editor.appからの実行です。セーフブートは未だ試していませんので試してみようとおもいます。

2017/08/25 22:36 T22T への返信

T22T様 重ねてありがとうございます! javascriptの処理を抜ける際の値trueは申し訳ございません。私の間違いです。大変失礼いたしました。 ご推測の通り、変数aの値を戻す際に固まってしまってしまっています。 キャッシュクリアは試してみましたが解決致しませんでした。 Web Pageは特定のページで発生している様子はないのでどのURLでも同じかと思いますが、 私の環境ではAppleのトップで動作確認していました。

2017/08/25 23:17 ババイソン への返信

ご説明を頂きまして、有難うございます。 


セーフブートやSafari.appのキャッシュのクリアでも改善しないということですね。 私もAppleのトップページで試してみましたが、やはり、aの値の、1.0が返ってきます。 私にはYosemiteの環境が無いので、ちょっとこれ以上は検証できないです(すみません)。 


aを返す代わりに、alert(a); のステートメントでブラウザ上に表示することも考えましたが、aの値を他の処理へ渡すのであれば、あまり意味がなさそうです。


サポートコミュニティーの皆様、何か良いアイデアがありましたら、ご教授ください。 宜しくお願い申し上げます。

2017/08/27 22:10 ババイソン への返信

Safari の do JavaScript と同様のことは、Google Chrome、Chromium、OmniWeb でできます。Safari でなくても良いならこれらのブラウザを使うのも良いでしょう。


まず、Google Chrome と Chromium。当方の環境では最新版が動かないので実際のところはわかりませんが、多分大丈夫だと思います。


なお、Google Chrome はあちらこちらにファイルをインストールするので、アンインストールの際は注意してください。まあ、その意味では Chromium の方が楽かもしれません。


Google Chrome

https://www.google.co.jp/chrome/browser/desktop/index.html


The Chromium Projects > Chromium > Getting Involved > latest trunk build of Chromium

http://www.chromium.org/getting-involved/download-chromium


次に、OmniWeb。OmniWeb 5 はかなり古いので、正常に表示されないページがあるかもしれませんし、セキュリティ上も問題があると思うので、おすすめはできませんが、do JavaScript 相当が可能ではあります。OmniWeb 6 は当方の環境 (Mac OS X 10.6.8) では動かず試すことができませんが、多分大丈夫だと思います。


OmniWeb 5: More Software - The Omni Group

https://www.omnigroup.com/more


OmniWeb 6: OmniWeb test builds

https://omnistaging.omnigroup.com/omniweb/


ちなみに AppleScript はこんな感じ。


Google Chrome

tell application "Google Chrome" tell active tab in window 1 execute javascript "(function() { var a = 1.0; return a; })();" end tell end tell


Chromium

tell application "Chromium" tell active tab in window 1 execute javascript "(function() { var a = 1.0; return a; })();" end tell end tell


OmniWeb

tell application "OmniWeb" do script "(function() { var a = 1.0; return a; })();" window front browser end tell


動作確認

・Mac OS X 10.6.8

・Google Chrome 49.0.2623.112

・Chromium 51.0.2666.0

・OmniWeb 5.11.2


あと、本題からは若干逸れますが、T22T さんがおっしゃった変数の問題はこんな感じで回避できます。do JavaScript は全てこのスタイルで書くと良いかと。


例1

tell application "Safari" do JavaScript "(function() { var a = 1.0; return a; })();" in document 1 end tell


例2

tell application "Safari" do JavaScript "(function() { var a = 1.0; var b = 2.0; var c = a + b; return c; })();" in document 1 end tell


変数汚染については、下のページが参考になります。


Bookmarklet - ブックマークレットのグローバル変数汚染デモ

http://www.teria.com/~koseki/memo/bookmarklets/blet_global.html

2017/08/27 22:21 onesize への返信

onesize様 度々ありがとうございます。 YosemiteとSafari10.1.2の組み合わせっぽいですよね。 投稿当初は自分の設定に問題があるものと思っていましたので、 他ユーザ様の意見が聞けてなんとかあきらめがついた様な心境です。 また、書き込みいただくまで改善要求の存在を知りませんでしたので 早速フィードバックを送信いたしました。 Appleに早期に対応してもらえるとありがたいです。 OSのアップデートは、他のアプリケーションが使用できなくなるためすぐには行えない状況なので、 プログラムの修正やOSの再インストールなどを行っていこうと思います。

2017/08/28 01:21 ババイソン への返信

その後調べました結果、代入した値が数値の場合、実行結果として戻らないようです。

変数を他のクラスに変更すればループにならないのを発見いたしましたのでご報告いたします。


真偽値

tell application "Safari"

do JavaScript "var a = true;

a;" indocument 1

end tell

result
:
true


文字列

tell application "Safari"

do JavaScript "var a = '1.0';

a;" indocument 1

end tell

result
:
"1.0"


数値

tell application "Safari"

do JavaScript "var a = 1.0;

a;" indocument 1

end tell

-->エラー



根本的解決にはなっておりませんが、

この変更でエラーを回避できるならば、

簡単な文字列検索置換で済みそうなので、

私としての問題は解決いたしました。


ご協力ありがとうございました。


数値の返し方などご存知の方がおられましたら、こちらにてご教授いただければと

思います。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

Safari 10.1.2 , javascript内の変数に代入した値が実行結果として戻らない。

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。