UWSC|firefox・chrome操作を試す自作関数

【ご注意】本ページはあまりに古い情報だったので全面書き換えし、今現状でもできそうな?問題なさそうな?内容に修正しました。

ポク太郎です。

内容デカすぎなので本ページは下記で1セットの2記事構成。両方参照下さい。

UWSCChromeFireFox操作別窓で開きます。
firefox、chromeを実際に操作

注意点・操作環境・バージョン情報・作成手順等の全体の流れ説明。
firefox、chrome操作を試す関数本ページ

操作のための関数群と解説。


本ページの関数群の説明とダウンロード

たくさんの関数を作るので最初に全体像。

UWSCFireFoxChromeを制御するための関数
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//orchrome
変数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のコマンド。
 NORMAL …対象アプリを通常の表示にする
 ACTIVATE …対象アプリをアクティブにする

戻り値として変数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行目の無限ループで起動まで待った後、立ち上げた(つもり)のアプリのステータスによる条件分岐。
STATUS(id,パラメータ)はidのアプリ状態を得るUWSCの標準関数。
 ST_PATH …対象アプリの絶対パス。
○⇒(指定のパスの実行ファイルが見つからない場合)
 12行目へ。エラー表示し、戻り値0を返す。
×⇒(見つかった場合)
 15行目へ。戻り値1を返す。(正常起動)

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+ forcerendereraccessibility processpertab newwindow 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+関数

firefoxchromeも一つしかないタブを閉じると、ブラウザ自体が終了してしまいます。なので、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。
8行目: 6行目と同じようにVK_ENTER(エンターキー)を送信します。

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

中止ボタンアイコンの画像認識で判定

最難関のfirefoxchromeの読み込み完了タイミング取得。①指定のURL読み込め→②読み込み完了→③必要情報取得せよ。③を指令するタイミングを決めるため②を検知する必要があります。

まず一つ目の策は画像検索。

中止ボタンをスクリーンダンプ(読込中に素早く)
UWSCでブラウザ操作。読み込み完了タイミングを取得するため画像認識。 UWSCでブラウザ操作。読み込み完了タイミングを取得するため画像認識。
切り出した画像
UWSCでブラウザ操作。読み込み完了タイミングを取得するため画像認識。 UWSCでブラウザ操作。読み込み完了タイミングを取得するため画像認識。
切り出した画像

ブラウザ上部の「」アイコン画像を読み込み中に素早く取得。必要部分を切り出し、UWSCソースディレクトリにフォルダ「bmp」を作って入れます。

UWSC自身に画像取得させた方がベター。UWSC画像認識|あいまい認識の前に“できない理由”

この方法の問題点は、

○バックグラウンド処理は不可(画面上に表示しとかないと判定できない)
○各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
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.3秒の休止期間(ブラウザ中止ボタンが若干遅れて表示されるので)。無駄な時間ですが仕方なし。
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()関数はこちら(吹き出し表示とクリップボードへ転送する関数)で作成した自作関数。面倒なら、9行目を「PRINT "読込待ち("+mt+"秒)"」、12行目を「PRINT "読み込み完了"」と変更して下さい。

13
行目
13             RESULT=1
関数の戻り値として1を返します。

安定した読み込み完了検出を何か考えないと

上記で一応は読み込み完了を検知できますが、画像認識はできる限り避けるのが賢明。

実例は出ませんが、ブラウザ内の文字数をカウント&監視して判定する方法なども試してみるとよいかも。それでもバックグラウンド処理は不可能ですが。

firefox・chrome内のリンク・ボタンを調べる関数~7

本項は“FireFoxChrome制御プログラム”を作るための調査ツール。本項の機能を使えば目的のページのリンク・ボタンの状況が調べられます。
⇒その調査結果を元に目的の制御プログラムを作って下さい。

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_BTNITM_LINKITM_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]を加えます。
UWSCの標準関数FORMAT(数値,N)は数値をN桁の表示にして返します。

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行目のように分岐します。
-1はクローズボックスを押されたとき、N番目のボタンが押されたときは2^(N-1)の値で指定します。

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のホントのリンクだけ記録。バージョンやブラウザ種によってこうなることを考慮して構築しないといけないみたいです。

UWSCChromeFireFox操作別窓で開きます。
firefox、chromeを実際に操作

注意点・操作環境・バージョン情報・作成手順等の全体の流れ説明。
firefox、chrome操作を試す関数本ページ

操作のための関数群と解説。
本記事の内容は以下でした。
○firefoxやchromeの操作を試す関数

コメント

タイトルとURLをコピーしました