ポク太郎です。
内容デカすぎなので本ページは下記で1セットの2記事構成。両方参照下さい。
firefox、chromeを実際に操作
注意点・操作環境・バージョン情報・作成手順等の全体の流れ説明。
|
firefox、chrome操作を試す関数本ページ
操作のための関数群と解説。
|
本ページの関数群の説明とダウンロード
たくさんの関数を作るので最初に全体像。
1 | ブラウザIDを調べる関数 | UWSCが指令に使うブラウザのアプリケーションIDを調べる機能。 |
2 | ブラウザを起動・準備させる関数 | ブラウザ起動、既に起動中のブラウザをアクティブに戻す機能。 |
3 | ブラウザの窓範囲を得る関数 | 恐らく使うであろう画像検索のための検索範囲を取得する機能。 |
4 | ブラウザを終了させる関数 | 非同期プログラム故の確実に終了させるための機能。 |
5 | タブ作って指定URLを開く関数 | URLを指定し、実際に読み込み命令を行う機能。 |
6 | 読み込み完了を判定する関数 | 読み込み命令~完了まで時間が掛かる非同期プログラムなので、完了判定を行う機能。 |
7 | ブラウザ中のリンクやボタンを調べる関数 | 実際のプログラム構築時に使う、ページ内に存在するアイテム調査ツール的な機能。 |
これらを記述した関数ファイルのダウンロードはこちら。
ブラウザIDを調べるbid関数~1
UWSCは制御対象となるアプリケーションIDを指定して操作の指令。なので、ブラウザIDを調べるための関数を準備。
まずグローバル変数を1つ定義。(グローバルである必要はないが頻繁に参照するので。)
PUBLIC brwz="firefox"//or"chrome"
1行目 | 1 | PUBLIC brwz=“firefox“//or“chrome“ |
変数brwz:ブラウザ名を記憶するグローバル変数。 |
FUNCTION bid(brwz) SELECT brwz CASE "firefox" RESULT=GETID("Mozilla Firefox","MozillaWindowClass") CASE "chrome" RESULT=GETID("Google Chrome","Chrome_WidgetWin_1") //RESULT=GETID("Google Chrome","Chrome_WidgetWin_1",–1) DEFAULT RESULT=–1 SELEND FEND
1,11行目 | 1 11 |
FUNCTION bid(brwz) FEND |
bid(brwz)関数宣言 ブラウザのIDを調べる関数。 |
||
2,10行目 | 2 10 |
SELECT brwz SELEND |
ブラウザの種類による分岐。 | ||
3,4行目 | 3 4 |
CASE “firefox“ RESULT=GETID(“Mozilla Firefox“,“MozillaWindowClass“) |
ブラウザが”firefox“だった場合、 4行目のようにしてIDを取得する。 |
||
5~7行目 | 5 6 7 |
CASE “chrome“ RESULT=GETID(“Google Chrome“,“Chrome_WidgetWin_1“) //RESULT=GETID(“Google Chrome“,“Chrome_WidgetWin_1“,–1) |
ブラウザが”chrome“だった場合、 6行目のようにしてIDを取得する。 ※7行目はUWSCのFAQにある記述。が、うちの環境(WinXP、Win7)では動かなかったのでコメントアウトし6行目で。 |
||
8,9行目 | 8 9 |
DEFAULT RESULT=–1 |
それ以外のときは、-1を返す。 |
ブラウザを起動・準備させる関数~2
ブラウザに準備させるbprep関数
まず、既に立ち上がってるブラウザをアクティブに戻す関数を作成。
FUNCTION bprep() id=bid(brwz) IF (id<>–1) IF STATUS(id,ST_ICON)//ウィンドウが最小化かチェック CTRLWIN(id,NORMAL)//表示を通常にする ENDIF IF !STATUS(id,ST_ACTIVE)//ウィンドウが非アクティブかチェック CTRLWIN(id,ACTIVATE)//アクティブにする ENDIF //RESULT=1 RESULT=id//Ver.20170615で修正 ELSE //RESULT=0 RESULT=–1//Ver.20170615で修正 ENDIF FEND
1,16行目 | 1 16 |
FUNCTION bprep() FEND |
bprep()関数宣言 ブラウザが非アクティブ状態、最小化状態時に、アクティブに戻す関数。 |
||
2行目 | 2 | id=bid(brwz) |
作成したbid関数を使用してブラウザのIDを変数idに代入。 | ||
3,12,15行目 | 3 12 15 |
IF (id<>–1) ELSE ENDIF |
変数idの値により条件分岐。 ○⇒(立ち上がっている場合) 4~11行目へ。 ×⇒(立ち上がっていない場合) 13、14行目へ。 |
||
4~11行目 | 4 5 6 7 8 9 10 11 |
IF STATUS(id,ST_ICON)//ウィンドウが最小化かチェック CTRLWIN(id,NORMAL)//表示を通常にする ENDIF IF !STATUS(id,ST_ACTIVE)//ウィンドウが非アクティブかチェック CTRLWIN(id,ACTIVATE)//アクティブにする ENDIF //RESULT=1 RESULT=id//Ver.20170615で修正 |
(立ち上がっている場合) 変数idのアプリ(つまりブラウザ)のステータスによる処理。 STATUS(id,パラメータ)はidのアプリの状態を得るUWSCの標準関数。 ST_ICON …対象アプリが最小化されてるならTrue !ST_ACTIVE …対象アプリが非アクティブならTrue(頭にNOTを意味する“!”) CTRLWIN(id,パラメータ)はidのアプリを操作するUWSCのコマンド。 戻り値として変数idを返す。(仕様変更いたしました。2017年6月15日) |
||
13,14行目 | 13 14 |
//RESULT=0 RESULT=–1//Ver.20170615で修正 |
(立ち上がっていない場合) 戻り値として-1を返す。(仕様変更いたしました。2017年6月15日) |
ブラウザを起動するbstart関数
EXEC(rundll32.exe url.dll,FileProtocolHandler "https://www.google.co.jp/")これで通常開くブラウザが開きます
引用:ほんじさんのコメント
FUNCTION bstart(path)//引数pathに""を渡すと通常開くブラウザ起動 if (bid(brwz)=-1)//-1:立ち上がっていない if path="" id=EXEC(rundll32.exe url.dll,FileProtocolHandler "https://www.google.com/") else id=EXEC(bpathfix(path))//exeの起動 endif while (bid(brwz)=-1)//起動するまで待ち sleep(0.5) wend if (STATUS(id,ST_PATH)="")//idの絶対パス、見つからなかった場合は空白が返ってくる模様 msgbox("無効なパスが指定されました。") RESULT=0 else RESULT=1 endif else//既に立ち上がっている bprep() RESULT=1 endif FEND
1,21 行目 |
1 21 |
FUNCTION bstart(path)//引数pathに””を渡すと通常開くブラウザ起動 FEND |
bstart(path)関数宣言: 引数path:ブラウザソフトのパス。””を渡すと通常開くブラウザ起動。 |
||
2,17,20 行目 |
2 17 20 |
if (bid(brwz)=-1)//-1:立ち上がっていない else//既に立ち上がっている endif |
先項で作成したbid関数の戻り値により条件分岐。 ○⇒(立ち上がっていない場合) 3~16行目へ。 ×⇒(立ち上がっている場合) 18、19行目へ。 |
||
3~16 行目 |
3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
if path=”” id=EXEC(rundll32.exe url.dll,FileProtocolHandler “https://www.google.com/”) else id=EXEC(bpathfix(path))//exeの起動 endif while (bid(brwz)=-1)//起動するまで待ち sleep(0.5) wend if (STATUS(id,ST_PATH)=””)//idの絶対パス、見つからなかった場合は空白が返ってくる模様 msgbox(“無効なパスが指定されました。”) RESULT=0 else RESULT=1 endif |
(立ち上がっていない場合) EXEC(p)は変数p:パスを与えると指定された実行ファイル(.exe)を起動するUWSCの標準関数。戻り値はそのアプリケーションID。 4行目のEXEC関数は通常使うブラウザを起動するコマンドプロンプトを指定。 6行目のEXEC関数の引数にあるbpathfix関数は次項の自作関数。(chromeの場合起動オプションを付ける必要があり、その関数で変数pathを修正。) 8~10行目の無限ループで起動まで待った後、立ち上げた(つもり)のアプリのステータスによる条件分岐。 |
||
18,19 行目 |
18 19 |
bprep() RESULT=1 |
(既に起動済だった場合) 先項で作成したbprep関数でアクティブ状態に戻し、戻り値1を返す。 |
Chromeの起動オプション付加するbpathfix関数
UWSCのFAQにはchrome操作には起動オプションが必要とあります。起動オプションなしだとchromeからITM_LINKが取得できません。(2017年7月22日修正)
FUNCTION bpathfix(path) SELECT brwz CASE "firefox" RESULT=path CASE "chrome" //Chromeの場合は、起動オプションを付けておかないといけない…らしい。 //必要な起動オプションaccessibilityをOnにする文字列を追加 RESULT=path+" ––force–renderer–accessibility ––process–per–tab ––new–window http://www.google.com/" //RESULT=path DEFAULT RESULT=path SELEND FEND
1,13行目 | 1 13 |
FUNCTION bpathfix(path) FEND |
bpathfix(path)関数宣言: 作成したbatart関数に渡された引数pathに起動オプションを付加するための修正用の関数。 |
||
2,12行目 | 2 12 |
SELECT brwz SELEND |
グローバル変数brwzによる条件分岐。 | ||
3,4行目 | 3 4 |
CASE “firefox“ RESULT=path |
(ブラウザが”firefox“だった場合) 与えられた引数そのままを戻り値として返す。 |
||
5~9行目 | 5 6 7 8 9 |
CASE “chrome“ //Chromeの場合は、起動オプションを付けておかないといけない…らしい。 //必要な起動オプションaccessibilityをOnにする文字列を追加 RESULT=path+“ ––force–renderer–accessibility ––process–per–tab ––new–window http://www.google.com/“ //RESULT=path |
(ブラウザが”chrome“だった場合) UWSCのFAQによると5~7行目にあるように起動オプションが必要。9行目を使用するとchromeからITM_LINKが取得できません。9行目をコメントアウトし、8行目を使用するように修正。(2017年7月22日修正) |
||
10,11行目 | 10 11 |
DEFAULT RESULT=path |
それ以外だった場合、 与えられた引数そのままを戻り値として返す。 |
ブラウザの窓範囲を得る関数~3
FUNCTION bset() bprep() sleep(0.2) DIM A[3] id=bid(brwz) if (id<>-1) A[0]=STATUS(id,ST_X)//X座標を取得 A[1]=STATUS(id,ST_Y)//Y座標を取得 A[2]=A[0]+STATUS(id,ST_WIDTH)//幅を取得し右下X座標を求める A[3]=A[1]+STATUS(id,ST_HEIGHT)//幅を取得し右下Y座標を求める else A[0]=0 A[1]=0 A[2]=G_SCREEN_W A[3]=G_SCREEN_H endif RESULT=SLICE(A,0,LENGTH(A)-1) FEND
1,18 行目 |
1 18 |
FUNCTION bset() FEND |
bset()関数宣言: ブラウザソフトのウィンドウの範囲(左上と右下座標)を得る関数。 |
||
2,3 行目 |
2 3 |
bprep() sleep(0.2) |
作成したbprep()関数で、ブラウザをアクティブにします。 瞬時に反応できないことも考慮し、0.2秒間を待ち時間とします。 |
||
4 行目 |
4 | DIM A[3] |
使用する配列変数の宣言 ウィンドウの四隅の座標を代入するために使用します。 |
||
5 行目 |
5 | id=bid(brwz) |
作成したbid関数でブラウザIDを変数idに代入します。 | ||
6,11,16 行目 |
6 11 16 |
if (id<>-1) else endif |
調べたブラウザIDにより条件分岐 ○⇒(立ち上がっている場合) 7~10行目へ。 ×⇒(立ち上がっていない場合) 12~15行目へ。 |
||
7~10 行目 |
7 8 9 10 |
A[0]=STATUS(id,ST_X)//X座標を取得 A[1]=STATUS(id,ST_Y)//Y座標を取得 A[2]=A[0]+STATUS(id,ST_WIDTH)//幅を取得し右下X座標を求める A[3]=A[1]+STATUS(id,ST_HEIGHT)//幅を取得し右下Y座標を求める |
(立ち上がっている場合) ブラウザのIDを調べ変数idへ代入。 配列A[0、1]にウィンドウ左上X、Y座標、配列A[2、3]にウィンドウ右下X、Y座標を代入。 STATUS(id,パラメータ)はidのアプリの状態を得るUWSCの標準関数。 ST_X …対象アプリの左上X座標 ST_Y …対象アプリの左上Y座標 ST_WIDTH …対象アプリのウインドウ幅 ST_HEIGHT …対象アプリのウインドウ高さ |
||
12~15 行目 |
12 13 14 15 |
A[0]=0 A[1]=0 A[2]=G_SCREEN_W A[3]=G_SCREEN_H |
(立ち上がっていない場合) ブラウザが立ち上がっていないので、画面全体の値を代入しておく。 以下はUWSCの特殊変数。 G_SCREEN_W …ディスプレイ画面の幅 G_SCREEN_H …ディスプレイ画面の高さ |
||
17 行目 |
17 | RESULT=SLICE(A,0,LENGTH(A)-1) |
配列変数A[]を関数の戻り値として返します。 |
関数の引数や戻り値に配列使用、その使い方はこちら。文句なしに便利なのでマスターするべき。
ブラウザを終了させる関数~4
ブラウザを終了させるbquit関数
非同期プログラム前提のUWSCなので、別アプリ起動前に確実に終了するなど手順が大事。なので、終了待ちルーチン含む終了関数を作成しておきます。
FUNCTION bquit() id=bprep() if (id<>-1) CTRLWIN(id,CLOSE)//CLOSE2の場合内容破棄で閉じる to.clr(99) while (bid(brwz)<>-1 and to.cnt(99,10)=0)//完全に終了するまで待ち wend RESULT=1 else RESULT=0 endif FEND
1,12 行目 |
1 12 |
FUNCTION bquit() FEND |
bquit()関数宣言: ブラウザを終了させる関数。 |
||
2 行目 |
2 | id=bprep() |
ブラウザソフトのIDを取得。 | ||
3,9,11 行目 |
3 9 11 |
if (id<>-1) else endif |
ブラウザIDにより条件分岐 ○⇒(立ち上がっている、準備ができている場合) 4~8行目へ。 ×⇒(立ち上がっていない場合) 10行目へ。 |
||
4~8 行目 |
4 5 6 7 8 |
CTRLWIN(id,CLOSE)//CLOSE2の場合内容破棄で閉じる to.clr(99) while (bid(brwz)<>-1 and to.cnt(99,10)=0)//完全に終了するまで待ち wend RESULT=1 |
(立ち上がっている、準備ができている場合) 4行目: ブラウザを終了させる。 CTRLWIN(id,CLOSE):idのアプリケーションを終了させるコマンド。 5~7行目: アプリケーションが完全に終了するまでの待ち。 ループ条件は「作成したbid関数でIDが-1でない→つまりブラウザ終了してない」または「10秒間のタイムアウト終了前」。to.cnt(99,10)はこちらタイムアウト関数(作り直し)で作成した自作関数。 8行目: 戻り値1を返す。 |
||
10 行目 |
10 | RESULT=0 |
(立ち上がっていない場合) 戻り値0を返す。 |
タブ作って指定URLを開く関数~5
新規にタブ作るtab+関数
firefoxもchromeも一つしかないタブを閉じると、ブラウザ自体が終了してしまいます。なので、UWSCからの指令はすべて新規タブを作り、それを操作する仕様にします。
新規にタブを作る関数を作成。
FUNCTION tab+() id=bid(brwz) SELECT brwz CASE "firefox" SCKEY(id,VK_CTRL,VK_T) SLEEP(0.5)//最近のFirefoxは重い CASE "chrome" SCKEY(id,VK_CTRL,VK_T) SLEEP(0.3) DEFAULT //とりあえず何もしない SELEND RESULT=1 FEND
1,14行目 | 1 14 |
FUNCTION tab+() FEND |
tab+()関数定義: ブラウザに新規タブを追加する関数。 |
||
2行目 | 2 | id=bid(brwz) |
先に作ったbid関数でアプリケーションIDを得ます。 | ||
3,12行目 | 3 12 |
SELECT brwz SELEND |
グローバル変数brwzに従い処理を選択します。 | ||
4~6行目 | 4 5 6 |
CASE “firefox“ SCKEY(id,VK_CTRL,VK_T) SLEEP(0.5)//最近のFirefoxは重い |
(変数brwzが“firefox”だった場合) FirefoxではCtrl+Tで「新しいタブを作成する」ので5行目でそのショートカットコマンドを送っています。Firefoxのホットキー説明参照。 SCKEY(id,VK_CTRL,VK_T)はUWSCの標準コマンドで、idのアプリケーションに対しショートカット命令を送るコマンドです。 VK_CTRL …Ctrlキー VK_T …Tキー 6行目: 動作完了まで若干時間がかかるので、0.5秒間のSLEEP。 |
||
7~9行目 | 7 8 9 |
CASE “chrome“ SCKEY(id,VK_CTRL,VK_T) SLEEP(0.3) |
(変数brwzが“chrome”だった場合) ChromeではCtrl+Tで「新しいタブを作成する」ので8行目でそのショートカットコマンドを送っています。Chromeのホットキー説明参照。 9行目: 動作完了まで若干時間がかかるので、0.3秒間のSLEEP。 |
||
10,11行目 | 10 11 |
DEFAULT //とりあえず何もしない |
(変数brwzがそれ以外だった場合) 現状は未定義で何もしないことにしてあります。 |
||
13行目 | 13 | RESULT=1 |
関数の戻り値として1を返します。(ダミー。現状使い道なし。) |
指定のURLを開くbopen関数
FUNCTION bopen(url) id=bid(brwz) IF (id<>–1) tab+() SENDSTR(id,url,1,True) SLEEP(0.5) SCKEY(id,VK_ENTER) RESULT=1 ELSE RESULT=0 ENDIF FEND
1,14行目 | 1 14 |
FUNCTION bopen(url) FEND |
bopen(url)関数定義: 引数urlを開く関数。 |
||
2行目 | 2 | id=bid(brwz) |
先に作ったbid関数でアプリケーションIDを得ます。 | ||
3,11,13行目 | 3 11 13 |
IF (id<>–1) ELSE ENDIF |
変数idによる条件分岐。 ○⇒:(ブラウザのIDが得られた場合) 4~10行目を実行 ×⇒:(ブラウザのIDが得られなかった場合) 12行目を実行 |
||
4行目 | 4 | tab+() |
上で作成したtab+()関数を呼び出します。(新規タブを開く) | ||
6~8行目 | 6 7 8 |
SENDSTR(id,url,1,True) SLEEP(0.5) SCKEY(id,VK_ENTER) |
6行目: SENDSTR(id,文字列,エディットフィールド番号,送信モードフラグ)はUWSCの標準コマンド。意味は、 “idのアプリへ指定の文字列を書き込め”。 ・エディトフィールド番号:左上から数えたエディトコントロールの順番 指定は1から順番 ・送信モードフラグ: FALSE: 追加 (デフォルト) TRUE: 置き換え 6行目は、“idのアプリの一番左上のエディットフィールド(アドレスバー)へ変数url(=この関数の引数url)を置き換えモードで送れ”という意味。
【注意】この例ではアドレスバーの番号は1ですが、Googleなどの検索窓を左上にカスタマイズした場合は番号2になるので適宜修正要。
7行目: 操作には若干のタイムラグがあるので、0.5秒間のSLEEP。 6~8行目の命令で“アドレスバーにURLを打ち込みENTERキーを押す”という動作になります。 |
||
10行目 | 10 | RESULT=1 |
関数の戻り値として1を返します。 | ||
12行目 | 12 | RESULT=0 |
関数の戻り値として0を返します。(エラーの意味で0を返しています。) |
ブラウザ起動→URL開く→終了までの動作確認
ここで、これまで作った関数でブラウザの起動→URL開く→終了までの動作確認を行います。
url="https://poku.blog/pc/contents-phy.html#c8" PRINT "––––––––––firefox" brwz="firefox" path="C:\Program Files\Firefox\firefox.exe" bstart(path) SLEEP(2) bopen(url) SLEEP(5) bquit() PRINT "––––––––––chrome" brwz="chrome" path="C:\Program Files\Google\Chrome\Application\chrome.exe" bstart(path) SLEEP(2) bopen(url) SLEEP(5) bquit()
1行目 | 1 | url=“http://https://poku.blog/pc/contents-phy.html#c8“ |
変数urlに開きたいページのURLを代入します。 | ||
3~5行目 | 3 4 5 |
PRINT “––––––––––firefox“ brwz=“firefox“ path=“C:\Program Files\Firefox\firefox.exe“ |
firefoxのテストを始める前の変数設定。 | ||
15~17行目 | 15 16 17 |
PRINT “––––––––––chrome“ brwz=“chrome“ path=“C:\Program Files\Google\Chrome\Application\chrome.exe“ |
chromeのテストを始める前の変数設定。 | ||
7~8,19~20行目 | 7 8 19 20 |
bstart(path) SLEEP(2) bstart(path) SLEEP(2) |
先に作ったbstart(path)関数に各ブラウザのパスを引数として与えます。 起動時間を考慮し2秒間のSLEEPを行っています。 |
||
10,22行目 | 10 22 |
bopen(url) bopen(url) |
作成したbopen()関数に1行目でセットした変数urlを渡します。 (ここでページを開く動作が始まります。) |
||
12~13,24~25行目 | 12 13 24 25 |
SLEEP(5) bquit() SLEEP(5) bquit() |
ページが表示されるまで時間が掛かるので5秒間のSLEEP。その後、先に作ったbquit()関数でブラウザを終了させます。 |
firefox起動→新規タブ作る→URL開く→firefox終了→chrome起動→新規タブ作る→URL開く→chrome終了と動きました。
※必ず新規タブを作る仕様にしたので、bquit関数は“タブ閉じる”動作に変えた方が分かりやすいかも。
ブラウザ読み込み完了を判定する関数~6
中止ボタンアイコンの画像認識で判定
最難関のfirefoxとchromeの読み込み完了タイミング取得。①指定のURL読み込め→②読み込み完了→③必要情報取得せよ。③を指令するタイミングを決めるため②を検知する必要があります。
まず一つ目の策は画像検索。
![]() |
![]() 切り出した画像 |
![]() |
![]() 切り出した画像 |
ブラウザ上部の「X」アイコン画像を読み込み中に素早く取得。必要部分を切り出し、UWSCソースディレクトリにフォルダ「bmp」を作って入れます。
この方法の問題点は、
○各PC個別に検索用画像データ採取要(各グラボは好き勝手なγカーブ→大抵は認識失敗)。
○ブラウザのバージョンアップ時に中止ボタンアイコン変更の可能性大。
改良できた場合に備え、すぐ入れ替えられるよう判定部分だけを関数として作成しておきます。
FUNCTION b_rcomp() bprep() a=bset() SX1=a[0] SY1=a[1] SX2=a[2] SY2=a[3] 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,22 行目 |
1 22 |
FUNCTION b_rcomp() FEND |
b_rcomp()関数宣言:ブラウザが読み込み中かどうかを判定する関数 読み込み中の場合:0、読み込み完了済:1を返す。 |
||
2 行目 |
2 | bprep() |
先に作成したブラウザに準備させる関数。 | ||
3~7 行目 |
3 4 5 6 7 |
a=bset() SX1=a[0] SY1=a[1] SX2=a[2] SY2=a[3] |
先に作成したブラウザの窓範囲の座標を返すbset()関数。戻り値に配列が返されるので、それぞれの変数に代入。 | ||
8~9,11,13,15 行目 |
8 9 11 13 15 |
select brwz case “firefox” case “chrome” default selend |
条件分岐:ブラウザ種類によって読み込む画像ファイルを変更。 | ||
8~15 行目 |
8 9 10 11 12 13 14 15 |
select brwz case “firefox” p_stop=”bmp/stop_firefox.bmp” case “chrome” p_stop=”bmp/stop_chrome.bmp” default // とりあえず何もしない selend |
条件分岐:ブラウザ種類によって読み込む画像ファイルを変更。 ソースと同じ位置にある「bmp」フォルダ中に画像を入れた場合のもの。 |
||
16~21 行目 |
16 17 18 19 20 21 |
if CHKIMG(p_stop,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR4) r=0 else r=1 endif RESULT=r |
条件分岐:画像が見つかったかどうかを判定。 ○⇒:(画像発見=まだ読み込み中) 変数rを0とし、関数の戻り値として返す。 ×⇒:(画像なし=読み込み完了済) 変数rを1とし、関数の戻り値として返す。 |
読込完了を制限時間付きで待つ関数
先項のb_rcomp()関数で読み込み完了したかどうかの判定はできるようになりました。
本項で待機ルーチンを作成しb_rcomp()関数を呼び出して判定させます。ここがシッカリしてるとシーケンシャル動作が安定に。制限時間を設けるのは巨大広告を無視するため。
実際のプログラムのメインルーチンからは本項の関数を呼び出すことになります。
FUNCTION wait_ready(sec) st=GETTIME() mt=0 IF b_rcomp()=1 SLEEP(0.3) ENDIF WHILE (b_rcomp()=0 and mt
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合) 1,14
行目1
14FUNCTION wait_ready(sec)
FENDwait_ready(sec)関数宣言:ブラウザの読み込み完了を待つ関数。(制限時間付き)
引数sec:秒数を指定し、最大sec秒待つ仕様とする。2,3
行目2
3st=GETTIME()
mt=0変数の初期化。
変数st:開始した時刻を記憶
変数mt:経過時間記憶に使用4~6
行目4
5
6IF b_rcomp()=1
SLEEP(0.3)
ENDIFこの関数が呼ばれた瞬間に、上の関数b_rcomp()=1の場合、0.3秒の休止期間(ブラウザ中止ボタンが若干遅れて表示されるので)。無駄な時間ですが仕方なし。 7~12
行目7
8
9
10
11
12WHILE (b_rcomp()=0 and mt<sec)
mt=GETTIME()-st
disp("読込待ち("+mt+"秒)","blue")
SLEEP(0.2)
WEND
disp("","blue")ループ文:ループする条件は「上の関数b_rcomp()=0、かつ、指定された秒数が経過していない」
条件が満たされる間、「読込待ち(何秒)」と吹き出しに表示されていきます。
ループを抜けたら、吹き出しを消します。※disp()関数はこちら(吹き出し表示とクリップボードへ転送する関数)で作成した自作関数。面倒なら、9行目を「PRINT "読込待ち("+mt+"秒)"」、12行目を「PRINT "読み込み完了"」と変更して下さい。
13
行目13 RESULT=1 関数の戻り値として1を返します。 安定した読み込み完了検出を何か考えないと
上記で一応は読み込み完了を検知できますが、画像認識はできる限り避けるのが賢明。
実例は出ませんが、ブラウザ内の文字数をカウント&監視して判定する方法なども試してみるとよいかも。それでもバックグラウンド処理は不可能ですが。
firefox・chrome内のリンク・ボタンを調べる関数~7
⇒その調査結果を元に目的の制御プログラムを作って下さい。
ID渡してALL_ITEM_LIST[]を得る関数
ブラウザ内のアイテムリストを得るため、引数アプリIDを渡し配列ALL_ITEM_LIST[]を得る関数を作成します。
FUNCTION item(id,kind) IF (id<>–1) GETITEM(id,kind) RESULT=SLICE(ALL_ITEM_LIST,0,length(ALL_ITEM_LIST)–1) ELSE DIM x[0]="" RESULT=SLICE(x,0,length(x)–1) ENDIF FEND
1,9行目 | 1 9 |
FUNCTION item(id,kind) FEND |
item(id,kind)関数宣言: 引数idのアプリの引数kindであるアイテムリスト(配列)を得る関数。 引数kindは、ITM_BTN、ITM_LINK、ITM_TABなどGETITEM関数で指定するアイテムの種別。 |
||
2,5,8行目 | 2 5 8 |
IF (id<>-1) ELSE ENDIF |
アプリIDによる条件分岐 アプリが見つかった(id<>-1)⇒ 3、4行目を実行。 アプリが見つからなかった⇒ 6、7行目を実行。 |
||
3,4行目 | 3 4 |
GETITEM(id,kind) RESULT=SLICE(ALL_ITEM_LIST,0,length(ALL_ITEM_LIST)-1) |
UWSC標準関数GETITEM(アプリID,種別)を実行することで特殊変数ALL_ITEM_LIST[]にアイテム名が代入される。 4行目で、ALL_ITEM_LIST[]を関数の戻り値として返します。(関数の引数・戻値に配列【使い方まとめ】参照。) |
||
6,7行目 | 6 7 |
DIM x[0]="" RESULT=SLICE(x,0,length(x)-1) |
こちらはアプリが見つからなかった場合。 ダミーの配列を準備し、それを関数の戻り値として返します。 |
配列を見やすい文字列に直す関数
ブラウザから取得したリンク・ボタンのアイテムリスト配列を見やすい文字列に変える関数を作成。そのままファイルに保存するため。
FUNCTION listup_item(item[]) r="要素番号:アイテム名" FOR i=0 TO LENGTH(item)-1 r=r+chr(13)+FORMAT(i,5)+":"+item[i] NEXT r=r+chr(13)+"======================== ↑"+t_stamp(2)+"に調査↑ ========================" RESULT=r FEND
1,8行目 | 1 8 |
FUNCTION listup_item(item[]) FEND |
listup_item(item[])関数宣言: 引数item[](配列)を受け取り、見やすく表示するための文字列に作り変える関数。「要素番号:アイテム名」という各行の文字列が全要素繋がった文字列を作って返します。ファイルに見やすく保存するための関数です。 |
||
2行目 | 2 | r="要素番号:アイテム名" |
変数rの初期化。 関数の戻り値になる文字列を変数rとして作っていきます。 |
||
3~5行目 | 3 4 5 |
FOR i=0 TO LENGTH(item)-1(item) r=r+chr(13)+FORMAT(i,5)+":"+item[i] NEXT |
3、5行を0~引数item[]の最大要素番号までループします。
4行目で、変数rに元々の変数rの内容にchr(13)(改行)を付け加え、FORMAT(i,5)(ループ変数iを5桁で表したもの)と":"の後、引数item[i]を加えます。 |
||
6行目 | 6 | r=r+chr(13)+"======================== ↑"+t_stamp(2)+"に調査↑ ========================" |
3~5行目のループが終わったら、データの最後であるということをわかりやすくするための印として、ソースのような棒線とタイムスタンプを付け加えておきます。 ※t_stamp(2)はこちら(現在のタイムスタンプを返す関数)で作成した自作関数。タイムスタンプが不要ならこの行を棒線だけにして下さい。 |
||
7行目 | 7 | RESULT=r |
出来上がった文字列変数rを関数の引数として返します。 |
ブラウザ内のアイテムを調べる関数
指定されたIDのアプリ内のアイテム調査用関数。ユーザ選択ダイアログを出し、選択された“アイテムの種別”を調べファイルに追記保存します。
関数の形にしましたが、3~76行目だけ使用した独立のソフトにしておくと便利。(ただし、アプリIDの指定は忘れずに。)
FUNCTION inv_item(id) r=1 WHILE (0=0) select slctbox(slct_btn,0,10,50,"アイテムを取得します。","ITM_ACCCLK","ITM_LINK","ITM_BTN","ITM_TAB","ITM_EDIT","ITM_LIST","ITM_MENU","ITM_TREEVIEW","ITM_LSTVIEW","ITM_STATIC","ITM_STATUSBAR","ITM_TOOLBAR","ITM_ACCTXT","全部") CASE –1 r=0 break CASE 1//"ITM_ACCCLK" list=item(id,ITM_ACCCLK) file_save("inv_ITM_ACCCLK.txt",listup_item(list),1) CASE 2//"ITM_LINK" list=item(id,ITM_LINK) file_save("inv_ITM_LINK.txt",listup_item(list),1) CASE 4//"ITM_BTN" list=item(id,ITM_BTN) file_save("inv_ITM_BTN.txt",listup_item(list),1) CASE 8//"ITM_TAB" list=item(id,ITM_TAB) file_save("inv_ITM_TAB.txt",listup_item(list),1) CASE 16//"ITM_EDIT" list=item(id,ITM_EDIT) file_save("inv_ITM_EDIT.txt",listup_item(list),1) CASE 32//"ITM_LIST" list=item(id,ITM_LIST) file_save("inv_ITM_LIST.txt",listup_item(list),1) CASE 64//"ITM_MENU" list=item(id,ITM_MENU) file_save("inv_ITM_MENU.txt",listup_item(list),1) CASE 128//"ITM_TREEVIEW" list=item(id,ITM_TREEVEW) file_save("inv_ITM_TREEVEW.txt",listup_item(list),1) CASE 256//"ITM_LSTVEW" list=item(id,ITM_LSTVEW) file_save("inv_ITM_LSTVEW.txt",listup_item(list),1) CASE 512//"ITM_STATIC" list=item(id,ITM_STATIC) file_save("inv_ITM_STATIC.txt",listup_item(list),1) CASE 1024//"ITM_STATUSBAR" list=item(id,ITM_STATUSBAR) file_save("inv_ITM_STATUSBAR.txt",listup_item(list),1) CASE 2048//"ITM_TOOLBAR" list=item(id,ITM_TOOLBAR) file_save("inv_ITM_TOOLBAR.txt",listup_item(list),1) CASE 4096//"ITM_ACCTXT" list=item(id,ITM_ACCTXT) file_save("inv_ITM_ACCTXT.txt",listup_item(list),1) CASE 8192//"全部" list=item(id,ITM_ACCCLK) file_save("inv_ITM_ACCCLK.txt",listup_item(list),1) list=item(id,ITM_LINK) file_save("inv_ITM_LINK.txt",listup_item(list),1) list=item(id,ITM_BTN) file_save("inv_ITM_BTN.txt",listup_item(list),1) list=item(id,ITM_TAB) file_save("inv_ITM_TAB.txt",listup_item(list),1) list=item(id,ITM_EDIT) file_save("inv_ITM_EDIT.txt",listup_item(list),1) list=item(id,ITM_LIST) file_save("inv_ITM_LIST.txt",listup_item(list),1) list=item(id,ITM_MENU) file_save("inv_ITM_MENU.txt",listup_item(list),1) list=item(id,ITM_TREEVEW) file_save("inv_ITM_TREEVIEW.txt",listup_item(list),1) list=item(id,ITM_LSTVEW) file_save("inv_ITM_LSTVIEW.txt",listup_item(list),1) list=item(id,ITM_STATIC) file_save("inv_ITM_STATIC.txt",listup_item(list),1) list=item(id,ITM_STATUSBAR) file_save("inv_ITM_STATUSBAR.txt",listup_item(list),1) list=item(id,ITM_TOOLBAR) file_save("inv_ITM_TOOLBAR.txt",listup_item(list),1) list=item(id,ITM_ACCTXT) file_save("inv_ITM_ACCTXT.txt",listup_item(list),1) SELEND SLEEP(0.01) WEND RESULT=r FEND
1,78行目 | 1 78 |
FUNCTION inv_item(id) FEND |
inv_item(id)関数宣言: 調べる“アイテムの種別”をユーザに選択させるダイアログを出し、引数idのアプリの指定されたもの全てを列挙してファイルに保存する関数。 |
||
2行目 | 2 | r=1 |
関数の戻り値を記憶するための変数rの初期化。 | ||
3,75~76行目 | 3 75 76 |
WHILE (0=0) SLEEP(0.01) WEND |
無限ループです。休止期間0.01秒入れてあります。 | ||
4~5,8, 11,14,17, 20,23,26, 29,32,35, 38,41,44, 47,74行目 |
4 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 74 |
※長過ぎて表示できないので4行目は下の説明枠で CASE -1 CASE 1//"ITM_ACCCLK" CASE 2//"ITM_LINK" CASE 4//"ITM_BTN" CASE 8//"ITM_TAB" CASE 16//"ITM_EDIT" CASE 32//"ITM_LIST" CASE 64//"ITM_MENU" CASE 128//"ITM_TREEVIEW" CASE 256//"ITM_LSTVEW" CASE 512//"ITM_STATIC" CASE 1024//"ITM_STATUSBAR" CASE 2048//"ITM_TOOLBAR" CASE 4096//"ITM_ACCTXT" CASE 8192//"全部" SELEND |
4行目は、 select slctbox(slct_btn,0,10,50,"アイテムを取得します。", "ITM_ACCCLK","ITM_LINK","ITM_BTN","ITM_TAB","ITM_EDIT", "ITM_LIST","ITM_MENU","ITM_TREEVIEW","ITM_LSTVIEW", "ITM_STATIC","ITM_STATUSBAR","ITM_TOOLBAR", "ITM_ACCTXT","全部") UWSCの標準関数SELECTBOX(SLCT_BTN,,,,)はボタンが並んだダイアログを表示する関数です。第6変数以降は、ボタンに表示する文字列を列挙します。 ここではアイテムの種別をユーザに選ばせるダイアログボックスを表示しています。 押されたボタンによって5~47行目のように分岐します。 |
||
6~7行目 | 6 7 |
r=0 break |
クローズボックスが押されたときの分岐先。 関数の戻り値として使用する変数rに0を代入してループを出ます。 UWSCの標準命令BREAK:ループを抜ける |
||
9,10行目 | 9 10 |
list=item(id,ITM_ACCCLK) file_save("inv_ITM_ACCCLK.txt",listup_item(list),1) |
例として、9、10行目のみ説明します。(その他は同じなので) 上で作成したitem関数に引数idと“アイテムの種別”を渡し、ALL_ITEM_LIST[]を取得、配列listに代入します。 10行目のfile_save()関数は、こちら(ファイル操作の関数(存在確認、書込、読込))で作成した自作関数。 file_save()関数にファイル名と上で作成したlistup_item(配列)関数の戻り値を追記モード(第3引数に“1”)を与えると、カレントディレクトリに追記モードで保存します。 |
||
77行目 | 77 | RESULT=r |
関数の戻り値として変数rを返します。(←全く意味のない戻り値だったw) |
リンク調査関数の呼び出しと動作確認
今回はchromeで確認。GoogleのTOPページのITM_LINKを調べました。
brwz="chrome" path="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" bstart(path) id=bid(brwz) bprep() inv_item(id)
1,2行目 | 1 2 |
brwz="chrome" path="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" |
Cromeを立ち上げて使用するために変数brwz、変数pathをセットしています。 | ||
4~6行目 | 4 5 6 |
bstart(path) id=bid(brwz) bprep() |
Cromeを起動し、そのIDを取得、Cromeのウィンドウをアクティブにしています。 | ||
7行目 | 7 | inv_item(id) |
今回作成したinv_item(id)関数を呼び出します。 |
出てきたダイアログの「ITM_LINK」を押し、ソースと同じ場所にできた「inv_ITM_LINK.txt」てファイルを開くと…、
要素番号:アイテム名 0:スクリーン リーダーをお使いの場合は、ここをクリックして Google インスタント検索をオフにしてください。 1:Gmail 2:画像 3:ログイン 4:音声で検索 5:プライバシー 6:規約 7:広告 8:ビジネス 9:Googleについて 10:スクリーン リーダーをお使いの場合は、ここをクリックして Google インスタント検索をオフにしてください。 11:Gmail 12:画像 13:ログイン 14:音声で検索 15:プライバシー 16:規約 17:広告 18:ビジネス 19:Googleについて ======================== ↑20170723_195748に調査↑ ========================
一応取得できましたが、0~9がホントのリンク、10~19は二重に取得してるみたい。これは現状のUWSCの限界でしょうか。
Firefoxで試したところ0~9のホントのリンクだけ記録。バージョンやブラウザ種によってこうなることを考慮して構築しないといけないみたいです。
firefox、chromeを実際に操作
注意点・操作環境・バージョン情報・作成手順等の全体の流れ説明。
|
firefox、chrome操作を試す関数本ページ
操作のための関数群と解説。
|
○firefoxやchromeの操作を試す関数
コメント