2017年7月23日日曜日

[UWSC]firefoxやchromeに表示されるリンクやボタン等を調べる方法

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
UWSCからfirefoxやchromeを操作するための準備をしています。今回は、ブラウザ内にどのようなアイテムがあるのかを簡単に調べるためのデバッグ用の機能を作りました。

記事の内容

○firefoxやchromeを制御する関数群(準備五)
ブラウザ内に表示されるリンクやボタン等を調べる方法

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

ポク太郎です。
UWSCでfirefoxやchromeの操作をしようとしています。今回はデバッグ、というか作成段階でアプリ内にどのようなアイテムがあるのかを素早く調べるための機能を作成しました。関数の形にしてありますが、独立したソフトウェアにしておくとよいと思います。

ブラウザを操作しようとしている方の目的は、メニューなどではなく、おそらく各ページ内部が操作対象だと思います。制御プログラムを作る際、“どのようなアイテムがあるのか”を知るのが第一歩になりますが、今回作成するのは、素早く簡単にアイテムのリストをファイルに保存する機能です。(アプリIDで指定する仕様にしたので、ブラウザ以外のアプリも同じように調べられます。)



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

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

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



IDを渡してALL_ITEM_LIST[]を得る関数

以前、ALL_ITEM_LIST[]を得るブラウザ専用の関数を作成したのですが、アプリIDは引数として渡す仕様の方が汎用性があるので作り直し。今回はこれを使用してアイテムリストを取得します。
item()関数
1
2
3
4
5
6
7
8
9
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[]を関数の戻り値として返します。[UWSC]配列変数と関数[使い方まとめ]参照。)
6,7行目6
7
            DIM x[0]=""
            RESULT=SLICE(x,0,length(x)-1)
こちらはアプリが見つからなかった場合。
ダミーの配列を準備し、それを関数の戻り値として返します。



配列を見やすい文字列に直す関数

アプリケーション(ブラウザ)から取得したリンクやボタン等のアイテムリスト(配列)を見やすい形でファイルに保存するため、アイテムリストから見やすい文字列に変える関数を準備しておきます。
listup_item()関数
1
2
3
4
5
6
7
8
FUNCTION listup_item(item[])
            r="要素番号:アイテム名"
         FOR i=0 TO ubound(item)
            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 ubound(item)
            r=r+chr(13)+FORMAT(i,5)+""+item[i]
         NEXT
3、5行を0~引数item[]の最大要素番号までループします。※ubound()はこちらの記事[UWSC]配列の最大要素を返す関数で作成した自作関数。

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)はこちらの記事[UWSC]日付時刻を文字列で返す関数で作成した自作関数。タイムスタンプが不要ならこの行を棒線だけにして下さい。
7行目7            RESULT=r
出来上がった文字列変数rを関数の引数として返します。



アプリ内にあるアイテムを調べる関数

アプリIDで指定されたアプリ内のアイテムを調べるため、ユーザが選択できるダイアログを出し、選択された“アイテムの種別”のデータを調べファイルに追記保存してくれる関数です。
関数の形にしてありますが、3~76行目だけを使用した独立のソフトにしてもいいと思います。(ただし、アプリIDの指定は忘れずに。)
inv_item()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
FUNCTION inv_item(id)
            r=1
   WHILE (0=0)
※長過ぎて表示できないので4行目は↓の説明枠で
      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()関数は、こちらの記事[UWSC]ファイル操作の関数で作成した自作関数。(文字化けするので最近修正しましたが。)
file_save()関数にファイル名と上で作成したlistup_item(配列)関数の戻り値を追記モード(第3引数に“1”)を与えると、カレントディレクトリに追記モードで保存します。
77行目77            RESULT=r
関数の戻り値として変数rを返します。(←全く意味のない戻り値だったw)



動作確認

今回はchromeで確認してみます。GoogleのTOPページを開き、そのページのITM_LINKを調べてみました。
動作確認
1
2
3
4
5
6
7
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のウィンドウをアクティブにしています。※これらの関数はこちらの記事([UWSC]firefoxやchromeを操作できるか試してみる関数)で作成した自作関数です。(Cromeの起動の方法について最近記事を修正しているので注意。)
7行目7inv_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を制御する関数群(準備五)
ブラウザ内に表示されるリンクやボタン等を調べる方法


【関連記事】
[UWSC]firefoxやchromeの読み込み完了を判定する関数(再)
人気![UWSC]firefoxやchromeを実際にUWSCで操作してみた
[UWSC]firefoxやchromeの開かれているタブ数を得る関数


スポンサーリンク



↓ Ctrlキーを押しながら ↓

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

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 IT関連
映画・ドラマ・芸能
ブログ運営
アホの雑記
ホームへ戻る

スポンサーリンク





2 件のコメント :

  1. 初めまして。
    大変勉強になりました!
    ありがとうございました。
    PC版のLINEのメッセージを新しく来たメッセージを取り出したいと考え、何か方法はないかと探し回っていてこちらにたどり着きました。
    GETITEM(id,ITM_LIST)でメッセージの数だけは正確に取り出すことができるのですが、なぜか、中身のテキストが取り出せません。
    何かお知恵を拝借できないかとご連絡させていただきました。
    ご教授いただけましたら幸いです。

    返信削除
    返信
    1. >Yoshihisa Anoさん
      コメントありがとうございます。

      UWSCの操作対象はPC版のLINEということですね。

      UWSCが取得できるのはあくまで“コントロール”なんです。アプリ中の“データ”を取得するのは期待薄かもしれません。とはいえ、可能か不可能かを判断したいですね。以下を試してみてはいかがでしょう?
      -------------------------------------------------------------------------------
      記事中にある「アプリ内にあるアイテムを調べる関数」を起動。
      (この関数は、欲しいアイテムが出てくる条件をひたすら探す際に、1ボタンで簡単に調べられるようにするためのものです。)
      inv_item(id)  ←変数idにLINEのアプリIDを渡す。
      起動するとダイアログが出てくるので、「全部」というボタンを押すと取得可能な全てのアイテムをテキストファイル(12個)に書き出してくれます。その中に目的の「メッセージ」が見つかるならそれを取得、無い場合はUWSCでは取得不可能ですので、↓をがんばります。

      LINE対して何か操作をすることで「メッセージ」が取得できる条件がないかを探す。

      削除