2017年9月10日日曜日

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

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

記事の内容

○firefoxやchromeを制御する関数群(準備四)
ブラウザ中の全文字を返す関数
読込完了を制限時間付きで待つ関数(再)

スマホで閲覧されている方へ
このブログは画面横幅を広くしてあります。スマホ解像度での閲覧は厳しいと思いますので、ウェブバージョンへどうぞ。

ポク太郎です。
UWSCでfirefoxやchromeの操作をしようとしています。

以前粉砕された、ブラウザが読み込み完了かどうかを調べる関数を少しだけ改良します。


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

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

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


受信した文字数で判断

UWSCでfirefoxやchromeの操作をしようとしていますが、firefoxとchromeの読み込み完了タイミングが取得できません。UWSCで作成するプログラムは非同期の部分が主。安定したシーケンシャル動作のためには“PCが指定の動作を完了した”←このタイミングをしっかり掴むのが大切。

以前行った苦肉の策は、ブラウザの中止ボタンを画像認識。でも画像認識はできる限り避けるのが賢明です。何かいい方法は?と調べているうち、Yahoo!知恵袋にヒントがありました。
   ●ブラウザ中の文字情報をコピー→クリップボードの中身を得る
これで以前の関数を作り直したいと思います。

方法は、ブラウザ中の全文字を取得しながら、文字数をカウントし、取得した文字数が変化するかどうかを監視することで実現します。

そのために、以下の二つの関数を作成します。
「ブラウザ中の全文字を返す関数」
「読込完了を制限時間付きで待つ関数(再)」

この方法でも以下は解決しませんが、画像違いによる動作不良はなくなります。
○バックグラウンド処理は不可能(画像を画面上に表示しないと判定できない)


ブラウザ中の全文字を返す関数

ブラウザ内部にあるテキスト情報をコピーし、その内容を返す関数です。

b_gettxt()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FUNCTION b_gettxt()
            id=bid(brwz)
            bprep()
      SELECT brwz
      CASE "firefox"
            SCKEY(id,VK_CTRL,VK_A,50)
            SCKEY(id,VK_CTRL,VK_C)
      CASE "chrome"
            SCKEY(id,VK_CTRL,VK_A,50)
            SCKEY(id,VK_CTRL,VK_C)
      DEFAULT
//            とりあえず何もしない
      SELEND
            RESULT=GETSTR(0)
FEND
関数プログラム説明
1,15行目1
15
FUNCTION b_gettxt()
FEND
b_gettxt()関数宣言:ブラウザ内部のテキスト情報を返す関数ブラウザに「すべてを選択」(Ctrl+A)と「コピー」(Ctrl+C)を送信し、クリップボードの内容を返すことで実現します。
2,3行目2
3
            id=bid(brwz)
            bprep()
この二つの関数は以前作成したブラウザのIDを調べる関数とブラウザに準備をさせる関数です。
4~5,8,11,13行目4
5
8
11
13
      SELECT brwz
      CASE "firefox"
      CASE "chrome"
      DEFAULT
      SELEND
ブラウザの種類によって操作を分岐するための部分。
※現状はどちらのブラウザでも同じ操作です。
6,7,9,10行目6
7
            SCKEY(id,VK_CTRL,VK_A,50)
            SCKEY(id,VK_CTRL,VK_C)
2行目で得た変数id(ブラウザのアプリID)にそれぞれ以下を送信します。

6行目:CTRLキーとAキーを送信し、50ms待ちます。
7行目:CTRLキーとCキーを送信します。
14行目14            RESULT=GETSTR(0)
関数の戻り値として、GETSTR(0)を返します。
UWSC標準関数GETSTR()
引数に0を渡すことでクリップボードの内容を返します。


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

上記の関数を利用し、制限時間付きで待つ関数です。ここをしっかり作ることで安定したシーケンシャル動作が可能になると思います。制限時間を設けているのは、ページによってすごく重い広告がずっと読み込み中になったりする場合があるから。また、文字数の制限を設け、必要な文字数まで取得したら“読込完了”とします。

wait_ready_txt()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FUNCTION wait_ready_txt(limit,sec)
            st=GETTIME()
            mt=0
            n0=0
         IF LENGTH(b_gettxt())<100
            SLEEP(0.3)
         ENDIF
      WHILE (mt<sec)
            mt=GETTIME()-st
            disp("読込待ち("+mt+")","blue")

            n1=n0
            n0=LENGTH(b_gettxt())
         IF n0=n1 or n0>limit-1
            break
         ENDIF
      SLEEP(0.5)
      WEND
            disp("","blue")
            RESULT=1
FEND
関数プログラム説明
1,21行目1
21
FUNCTION wait_ready_txt(limit,sec)
FEND
wait_ready_txt(limit,sec)関数宣言:ブラウザの読み込み完了を待つ関数。(制限時間付き)
引数limit:必要な文字数。これより多く表示している場合は読込完了と判断。
引数sec:秒数を指定し、最大sec秒待つ仕様とする。
2~4行目2
3
4
            st=GETTIME()
            mt=0
            n0=0
変数の初期化。
変数st:開始した時刻を記憶
変数mt:経過時間記憶に使用
変数n0:上の関数で調べた文字数を記憶するために使用
5~7行目5
6
7
         IF LENGTH(b_gettxt())<100
            SLEEP(0.3)
         ENDIF
ブラウザが表示を始まるまでの間休止させます。
上の関数b_gettxt()を使い文字数を調べ、100文字未満の場合0.3秒の休止期間を入れる。無駄な時間ですが仕方なし。
タブを開いた際に表示される文字は以下なので100文字と設定。(環境に合わせて調整して下さい。)
FireFox:
新しいタブの設定
よく見るサイトを表示
おすすめサイトも表示
空白ページを表示
新しいタブの詳細
サムネイルを削除しました。
Chrome:
Google
日本
Google を検索または URL を入力
「OK Google」と発声
この待ち時間の後、8行目から判定を行います。
8~10,17~19行目8
9
10
17
18
19
      WHILE (mt<sec)
            mt=GETTIME()-st
            disp("読込待ち("+mt+")","blue")
      SLEEP(0.5)
      WEND
            disp("","blue")
ループ文:ループする条件は「指定された秒数が経過していない」条件が満たされる間、「読込待ち(何秒)」と吹き出しに表示されていきます。
ループを抜けたら、吹き出しを消します。

disp()関数はこちら([UWSC]情報の吹き出し表示とクリップボードへ転送する関数)で作成した自作関数。PRINT文でよければ、8行目を「PRINT "読込待ち("+mt+"秒)"」と変更してください。
12~16行目12
13
14
15
16
            n1=n0
            n0=LENGTH(b_gettxt())
         IF n0=n1 or n0>limit-1
            break
         ENDIF
ループ中、調べた文字数が変化していないか、また、引数limitを超えた文字数を受信していないかを調べる部分。
12行目:変数n1:前回調べた文字数を記憶するために使用。
13行目:LENGTH(A)は文字列Aの文字数を返すUWSCの標準関数。
14~16行目:条件に合致したら、ループを出ます。
20行目20            RESULT=1
関数の戻り値として1を返します。



記事の内容

記事の内容は伝わりましたでしょうか。
○firefoxやchromeを制御する関数群(準備四)
ブラウザ中の全文字を返す関数
読込完了を制限時間付きで待つ関数(再)


【関連記事】
人気![UWSC]firefoxやchromeを実際にUWSCで操作してみた
人気![UWSC]firefoxやchrome上のリンクやボタン等を調べる方法
人気![UWSC]firefoxやchromeでタブを作ってページを開く関数


スポンサーリンク



↓ ランキングに参加しています!(Ctrlキーを押しながら) ↓

blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 IT関連
電気回路やプログラムの記事。元々のメインコンテンツ。
UWSC奮闘記
プログラミングのできる子に
デジタルの世界って
映画・ドラマ・芸能
ハリウッドが主のエンターテイメントの記事。最近は似顔絵多し。
戦士の息抜き
ブログ運営
AnalyticsやSerchConsolなどの使い方、アクセスアップに関する話題。
アドセンス関連
他のGoogleツール
その他
アホのもくろみ
アホの雑記
取りとめもなく好き勝手に書く記事。不本意にも一番人気だったり。
役に立つかも
休むに似たり
好き勝手に書く
落書き漫画
何故人気なのか全く解らない数コマ漫画。結局最大コンテンツに。
物思いに耽る
免責事項 ホームへ戻る

スポンサーリンク





0 件のコメント:

コメントを投稿