最近Applescriptでsafariをいろいろと操作していたのですが、そこでハマったところを備忘録的に列記しておきます。
(お約束)ご利用は自己責任でお願いします
- サブルーチンは my で呼ぶ。my無しでも呼べるが二回目以降エラーになる
set answer to my hoge_Sub -- サブルーチン on hoge_Sub(a,b) ..... return hoge end hoge_Sub
- ダイアログから”text returned of”で得た数値は as number で変換しないと文字列と認識されて誤処理される可能性あり。
set num to text returned of (display dialog "何番ですか?") --ダイアログを出してnumに代入 if (num as number < 100) then --numが100より小さいときには display dialog "100以下 num = " & num else display dialog "100以上 num = " & num end if
以下のように書くとelseルートにしか通らない
set num to text returned of (display dialog "何番ですか?") --ダイアログを出してnumに代入 if (num < 100) then --numが100より小さいときには display dialog "100以下 num = " & num else display dialog "100以上 num = " & num end if
- safariでtype=”image”のボタンをクリック。
なぜこれでできるかはよく分からないが、できたのでよしとする(笑)。
参考 http://stackoverflow.com/questions/22082120/click-on-input-type-imagedo JavaScript "var elements = document.getElementsByName('image');for (i=0;i<elements.length;i++) {if(elements[i].type == 'image') {elements[i].click();}}" in document 1
- submit ボタンをクリックする。
例えばファンサカにログインするときは以下の様なかんじ。<form method="post" action="" name="login_form" id="login_form"> <div>Yahoo! JAPAN ID<input name="login" id="username" value="" class="" type="text"></div> <label for="" class="" id="">パスワード</label> <div class="">パスワード<input name="passwd" id="passwd" value="" class="" type="password"></div> <input type="submit" value="ログイン" class="" id="">
formのidは『login_form』、Yahoo! JAPAN IDのidは『username』、なので、『document.login_form.username.value』 に 『mailID』 を代入するかたちになります。
my openURL_Sub("https://login.yahoo.co.jp/config/login?.src=spt&.pd=&.v=4&.done=http%3A//fantasy.sports.yahoo.co.jp/jleague/stats/") --ファンサカ tell application "Safari" activate set mailID to "xxx@yahoo.co.jp" --ID set passWD to "pass" --パスワード do JavaScript "document.login_form.username.value='" & mailID & "'" in document 1 do JavaScript "document.login_form.passwd.value='" & passWD & "'" in document 1 do JavaScript "document.login_form.persistent.checked= true" in document 1 delay 1 do JavaScript "document.login_form.submit();" in document 1 --submitボタンを押す end tell on openURL_Sub(theURL) tell application "Safari" activate open location (theURL as string) --URLを開く end tell end openURL_Sub
- 指定IDや指定classをクリック
参考 http://cubemg.com/applescript/how-to-click-a-button-on-a-web-page-with-applescript/
ここでサブルーチン化されているものを使えばOK。サブルーチンのtoはonと同じ。例えば
『<input type=’button’ id=’CT_BUTTON_0′ onclick=’ConnentClick(0)’ value=’接続’ />』
をクリックしたいとき、指定IDなら以下のように書く。my clickID("CT_BUTTON_0")--idを指定 on clickID(theId) --creates a function that we can use over and over again instead of writing this code over and over again tell application "Safari" -- lets AppleScript know what program to controll do JavaScript "document.getElementById('" & theId & "').click();" in document 1 -- performs JavaScript code that clicks on the element of a specific id end tell -- tells Applescript you are done talking to Safari end clickID -- lets AppleScript know we are done with the function
class名やタグ名でも同様。elementnumはエレメントの順番を指定する。
そして使うときには、以下のように 「tell application “Safari”」を分けること。
tell application "Safari" set to なんちゃらかんちゃら --コードを書く end tell clickID("xxxID") tell application "Safari" set to なんちゃらかんちゃら --コードを書く end tell
- safariでいつも同じウィンドウ(タブ)でURLを開く。
以下のように書くと新しいタブでURLを開いてくれます。tell application "Safari" open location ("http://192.168.0.1/" as string) --URLを開く end tell
ただそれだと都合が悪いときがある。いつも同じウィンドウの同じタブでURLを開きたいときは
tell application "Safari" set the URL of the front document to "http://192.168.0.1/" --いつも同じウィンドウで開く end tell
参考 http://stackoverflow.com/questions/7015881/applescript-safari-open-url-in-current-window
- リンクをクリックする。
上記5をつかってクリックする。例えば以下のようなリンクの場合<p><a href="http://www.google.co.jp/" id="linkID" class="linkClass">google</a></p>
以下の様な感じでクリック可能。
サンプルには三つ書いたが、もちろん三つのいずれかを使うこと。
my clickID(“linkID”)
my clickClassName(“linkClass”, 0)
my clicktagName(“a”, 0)tell application "Safari" open location ("test.html" as string) end tell delay 1 --ページのloadを待つ my clickID("linkID") --IDでクリックする場合 my clickClassName("linkClass", 0) --class名でクリックする場合 my clicktagName("a", 0) --タグ名でクリックする場合 on clickID(theId) tell application "Safari" do JavaScript "document.getElementById('" & theId & "').click();" in document 1 end tell end clickID on clickClassName(theClassName, elementnum) tell application "Safari" do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1 end tell end clickClassName on clicktagName(thetagName, elementnum) tell application "Safari" do JavaScript "document.getElementsByTagName('" & thetagName & "')[" & elementnum & "].click();" in document 1 end tell end clicktagName
ただ my clicktagName(“a”, 0) は一番上の <a href= に反応してしまうので、以下のように二行目のyahooや三行目のamazonをクリックすることは不可能になる。
そういう場合はURL(文字列)を抽出してsafariに送るとかの工夫が必要になると思われる。<p><a href="http://www.google.co.jp/">google</a></p> <p><a href="http://www.yahoo.co.jp/" >yahoo</a></p> <p><a href="http://www.amazon.co.jp/">amazon</a></p>
- 『~』チルダが『‾』(上線、オーバーバー、オーバーライン)になってしまう。
チルダはほぼURLでしか利用されていない(と思う…)ので、URL形式で書けばよい。『~』のURL形式は『%7e』 - safariが落ちる。
こういうコードで落ちるときは、tell application "Safari" activate make new document --safariで新しいウィンドウを開く end tell
こうやって分けると落ちないことがあるので、試行錯誤してみる。
tell application "Safari" activate end tell tell application "Safari" make new document --safariで新しいウィンドウを開く end tell
- ファイルの文字コードをUTFに変換する。
Applescript内はどうやらS-JISらしい。「 write saveData to saveFileName 」などとファイルを書き出すとS-JISになる。
UTFにしたいときは、シェルのiconvでの変換が楽。set FileNameSJIS to "/SJIS.txt" --ファイル名をセット(s-jis) set FileNameUTF to "/UTF.txt" --ファイル名をセット(utf用) do shell script "iconv -f SJIS -t UTF8 " & FileNameSJIS & " > " & FileNameUTF --UTFに変換する
- Finderで選択したフォルダ内にある画像を指定した横幅でリサイズしてImageOptimで容量圧縮するApplescript
- メモ
http://cubemg.com/applescript/how-to-extract-information-from-a-website-using-applescript/
How to Get AppleScript to Wait for a Page to LoadNEW! AppleScript Maker Beta: Hey Everyone, I am working on a new AppleScript tool that is going to BLOW YOUR MIND! After...
コメント