Safariで指定URLのページローディングを検出するAppleScriptです。
Safari 13で従来どおり、do javascriptコマンド経由で、
if (do JavaScript "document.readyState" in document 1) is "complete" then
などと処理させてみたら、URLが変更される前に”complete”が返ってきました。どうも、この処理が非同期実行されるのか、表示が反映される前に内部的にはページ遷移が完了しているようです。
現行のSafariにおいては、上記の処理ではページローディング完了検出が行えないことが判明。割と利用する機会が多く、重要な処理であるため、書き換えてみました。
いろいろ実験してみると、documentに新規URLを設定しても、すぐにはURLが変更されないようです。その割にAppleScriptの実行は完了したものとして次の行へと進んでしまいます。普通、こんな挙動を行うアプリケーションはないのですが(OCRで見たことがあったかも?)、ただ、逆にここで処理待ちすると問題が発生するケースもありそうです。
非同期モードと同期モードの両方が存在していて、明示的に選択できるとよいのですが、現状ではそうなっていません。
仕方がないので、旧URLから新URLへの切り替えをループで見張るという処理を書いてみたら、いい感じにローディング検出できました。
AppleScript名:SafariでURLローディング検出.scpt |
— – Created by: Takaaki Naganoya – Created on: 2020/08/09 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set aURL to "http://piyocast.com/as/" openURLWithSafari(aURL) set aText to getBodyTextFromSafariFrontWindow() of me on openURLWithSafari(aURL as string) if aURL = "" then error "URL is blank" try tell application "Safari" set d to count every window if d = 0 then make new window tell front document set URL to aURL end tell else tell front document set oldURL to URL set URL to aURL end tell end if detectPageLoaded(10, oldURL, aURL) of me end tell on error return false end try end openURLWithSafari on detectPageLoaded(timeout_value, oldURL, newURL) try repeat with i from 1 to (timeout_value * 5) tell application "Safari" tell front document set curURL to URL end tell end tell if curURL = newURL then return delay 0.2 end repeat on error return false end try return false end detectPageLoaded on getBodyTextFromSafariFrontWindow() –フレームを使っていないことが前提条件 tell application "Safari" return text of front document end tell end getBodyTextFromSafariFrontWindow |
More from my site
(Visited 285 times, 1 visits today)
SafariでURLをローディング – AppleScriptの穴 says:
[…] うになってきたため、書き直したルーチン「SafariでURLローディング完了検出」を利用してください。 […]