2017年7月17日月曜日

[UWSC]firefoxやchromeの読み込み完了を判定する関数

初心者のプログラミング導入のため、UWSCという開発ソフトを使って作り上げる作業を実際にやって見せるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
UWSCからfirefoxやchromeを操作するための準備をしています。今回は、URLを開いた後のブラウザが読み込み完了かどうかを調べる関数を作りました。

記事の内容

○firefoxやchromeを制御する関数群(準備三)
読込完了したかどうかを判定する関数
読込完了を制限時間付きで待つ関数

ポク太郎です。
UWSCでfirefoxやchromeの操作をしようとしています。今回、URLを開いた後のブラウザが読み込み完了かどうかを調べる関数関数を作りました。


誤解を招いてはいけないので、こちら↓。

現在のブラウザのシェアが大きいのはfirefoxやchromeですが、UWSCはCOMオブジェクト形式を採用しているブラウザ(IEやSleipnir)でないとIDやパスワードをセットする等のアクセスができません。また、取得できるデータが限定されます。
UWSCから操作しやすいのはIEやSleipnirですが、そんなの使いたくありません。UWSCでわざわざfirefoxやchromeを操作するのはよい選択肢とは思えませんが、敢えてイバラの道を進んでみます…。
【ご注意】今後、うまく行かず粉砕されるかもしれません。参考程度にどうぞ。

※1 以前からの記事の自作関数等が前提になっておりますので、意味不明な関数が出てきたらこちらを参照して下さい。


ほぼ粉砕されました

UWSCでfirefoxやchromeの操作をしようなんて…とありますが、やっぱりイバラでした。ほぼ粉砕されてしまいました。firefoxとchromeの読み込み完了タイミングが取得できません。

何度も書いているとおり、UWSCで作成するプログラムは非同期の部分が主です。“PCが指定の動作を完了した”←このタイミングを必ず掴まないといけないのですが、上述のように読み込み完了タイミングが掴めません。

そこで苦肉の策。画像検索です。

中止ボタンをスクリーンダンプ(読込中に素早く)
UWSCで画像認識、検出できない状態、ブラウザが安定して動かない状態を回避するために必要な画像の取得方法、制御方法を作ります。安定動作するスクリプトを作成する必要があります。 UWSCで画像認識、検出できない状態、ブラウザが安定して動かない状態を回避するために必要な画像の取得方法、制御方法を作ります安定動作するスクリプトを作成する必要があります。。
UWSCで画像認識、検出できない状態、ブラウザが安定して動かない状態を回避するために必要な画像の取得方法、制御方法を作ります。安定動作するスクリプトを作成する必要があります。
切り出した画像
UWSCで画像認識、検出できない状態、ブラウザが安定して動かない状態を回避するために必要な画像の取得方法、制御方法を作ります。安定動作するスクリプトを作成する必要があります。
切り出した画像

ブラウザ上部の「」となっている中止ボタンの画像(赤矢印)を取得します。読み込み中でないとリロードボタン(まるまった矢印)に替わってしまいますので、素早く採取します。必要部分を切り出し、UWSCのソースファイルのある場所に「bmp」というフォルダを作って入れます。

この方法となった瞬間、
○バックグラウンド処理は不可能(画像を画面上に表示しないと判定できない)
○各PC個別に検索用画像データを採取しなければいけない。
(各PC個別のグラフィックカードが好き勝手にγカーブをかけて表示しているので大抵は別画像と判定されてしまう。)
が確定してしまいます。また、ブラウザのバージョンアップにより中止ボタン画像が変更される可能性も大です。あーあ。

この部分だけ誰か親切な人が教えてくれることに期待して、すぐに入れ替えられるよう関数として作成しておきます。


読込完了したかどうかを判定する関数

各ブラウザの中止ボタンの画像を読み込み、ブラウザ上にあるかないかで読み込み中かどうかを判定します。
b_rcomp()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FUNCTION b_rcomp()
            bprep()
      SELECT brwz
      CASE "firefox"
            p_stop="bmp/stop_firefox.bmp"
      CASE "chrome"
            p_stop="bmp/stop_chrome.bmp"
      DEFAULT
//            とりあえず何もしない
      SELEND
         IF CHKIMG(p_stop,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR4)
            r=0
         ELSE
            r=1
         ENDIF
            RESULT=r
FEND
関数プログラム説明○⇒:成り立つ場合、×⇒:成り立たない場合)
1,17
行目
1
17
FUNCTION b_rcomp()
FEND
b_rcomp()関数宣言:ブラウザが読み込み中かどうかを判定する関数
読み込み中の場合は0を返し、読み込み完了していたら1を返す。
2
行目
2             bprep()
bprep()はこちらの記事([UWSC]firefoxやchromeを操作できるか試してみる関数)で作成した、ブラウザに準備をさせる関数。
3~10
行目
3
4
5
6
7
8
9
10
      SELECT brwz
      CASE "firefox"
            p_stop="bmp/stop_firefox.bmp"
      CASE "chrome"
            p_stop="bmp/stop_chrome.bmp"
      DEFAULT
//            とりあえず何もしない
      SELEND
条件分岐:ブラウザ種類によって読み込む画像ファイルを変更します。
このコードはソースファイルと同じ位置にある「bmp」フォルダ中に画像を入れた場合のものです。
11~16
行目
11
12
13
14
15
16
         IF CHKIMG(p_stop,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR4)
            r=0
         ELSE
            r=1
         ENDIF
            RESULT=r
条件分岐:画像が見つかったかどうかを判定。
○⇒:変数rを0とし、関数の戻り値として返す
×⇒:変数rを1とし、関数の戻り値として返す

※画像の検索範囲にSX1、SY1、SX2、SY2とあるのは、こちら([UWSC]よく使う記号をグローバル宣言) で作成した自作関数からのもの。検索範囲が画面全体でよければ、「SX1、SY1、SX2、SY2」→「0、0、G_SCREEN_W、G_SCREEN_H」に変更してください。


読込完了を制限時間付きで待つ関数

上記の関数を利用し、制限時間付きで待つ関数です。ここをしっかり作ることで安定したシーケンシャル動作が可能になると思います。制限時間を設けているのは、ページによってすごく重い広告がずっと読み込み中になったりする場合があるから。そんなもん律儀に読み込み完了まで待ってやる気は毛頭ございません。
wait_ready(sec)関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FUNCTION wait_ready(sec)
            st=GETTIME()
            mt=0
         IF b_rcomp()=1
            SLEEP(0.3)
         ENDIF
      WHILE (b_rcomp()=0 and mt<sec)
            mt=GETTIME()-st
            disp("読込待ち("+mt+")","blue")
      SLEEP(0.2)
      WEND
            disp("","blue")
            RESULT=1
FEND
関数プログラム説明○⇒:成り立つ場合、×⇒:成り立たない場合)
1,14
行目
1
14
FUNCTION wait_ready(sec)
FEND
wait_ready(sec)関数宣言:ブラウザの読み込み完了を待つ関数。(制限時間付き)
引数sec:秒数を指定し、最大sec秒待つ仕様とする。
2,3
行目
2
3
            st=GETTIME()
            mt=0
変数の初期化。
変数st:開始した時刻を記憶
変数mt:経過時間記憶に使用
4~6
行目
4
5
6
         IF b_rcomp()=1
            SLEEP(0.3)
         ENDIF
この関数が呼ばれた瞬間に、上の関数b_rcomp()=1(←0ではなく1。間違えてました。2017年7月18日修正)の場合、0.3秒の休止期間を入れる(ブラウザの中止ボタンが、読み込み開始の瞬間から若干遅れて表示されるため)。無駄な時間ですが仕方なし。この待ち時間の後、7行目から判定を行います。
7~12
行目
7
8
9
10
11
12
      WHILE (b_rcomp()=0 and mt<sec)
            mt=GETTIME()-st
            disp("読込待ち("+mt+")","blue")
      SLEEP(0.2)
      WEND
            disp("","blue")
ループ文:ループする条件は「上の関数b_rcomp()=0、かつ、指定された秒数が経過していない」
条件が満たされる間、「読込待ち(何秒)」と吹き出しに表示されていきます。
ループを抜けたら、吹き出しを消します。

disp()関数はこちら([UWSC]情報の吹き出し表示とクリップボードへ転送する関数)で作成した自作関数。PRINT文でよければ、8行目を「PRINT "読込待ち("+mt+"秒)"」と変更してください。
13
行目
13             RESULT=1
関数の戻り値として1を返します。


記事の内容

記事の内容は伝わりましたでしょうか。
○firefoxやchromeを制御する関数群(準備四)
読込完了したかどうかを判定する関数
読込完了を制限時間付きで待つ関数


関数群のダウンロードはこちら
func_poku.uwsのコメント欄に呼び出し方が書いてあります。


【関連記事】[UWSC]高圧縮jpegと劣化なしのbmp画像を取得する関数
[UWSC]情報の吹き出し表示とクリップボードへ転送する関数
[UWSC]firefoxやchromeの開かれているタブ数を得る関数
[UWSC]firefoxやchromeでタブを作ってページを開く関数


スポンサーリンク



ブログ村へ blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 コンピュータ(ハード/ソフト)
映画・ドラマ・芸能
変人のつぶやきとトラブル
ホームへ戻る


0 件のコメント:

コメントを投稿