IE.document.linksから取得できる情報、リンクの操作

IE.document.linksからリンクの情報取得、操作が行えます

リンク
リンクの数
IE.document.links.length
リンクのオブジェクト(0からの数値を指定)
ホスト名:ポート
IE.document.links[n].host
ホスト名
IE.document.links[n].hostname
リンク先アンカー
IE.document.links[n].hash
リンク先URL
IE.document.links[n].href
パス名
IE.document.links[n].pathname
ポート
IE.document.links[n].port
プロトコル
IE.document.links[n].protocol
パラメータ
IE.document.links[n].search
ターゲット
IE.document.links[n].target
アンカー
アンカーの数
IE.document.anchors.length
アンカーのオブジェクト(0からの数値を指定)
アンカー名
IE.document.anchors[n].name

というわけで、
具体的にスクリプトを実行させて、結果を見てみましょう。

IE = CreateOleObj("InternetExplorer.Application")
IE.visible = true
IE.navigate("http://canal22.org/sample0001/?hello=myFriend")
REPEAT
 SLEEP(0.1)
UNTIL !IE.busy AND IE.readyState = 4

PRINT "■リンクの数"
PRINT "IE.document.links.length=" + IE.document.links.length
  PRINT "-----"
  PRINT "  1:host=ホスト名:ポート"
  PRINT "  2:hostname=ホスト名"
  PRINT "  3:hash=リンク先アンカー"
  PRINT "  4:href=リンク先URL"
  PRINT "  5:pathname=パス名"
  PRINT "  6:port=ポート"
  PRINT "  7:protocol=プロトコル"
  PRINT "  8:search=パラメータ"
  PRINT "  9:target=ターゲット"
  FOR A = 0 TO (IE.document.links.length - 1)
    PRINT "-----"
    PRINT "  1:IE.document.links[" + A + "].host="     + IE.document.links[A].host
    PRINT "  2:IE.document.links[" + A + "].hostname=" + IE.document.links[A].hostname
    PRINT "  3:IE.document.links[" + A + "].hash="     + IE.document.links[A].hash
    PRINT "  4:IE.document.links[" + A + "].href="     + IE.document.links[A].href
    PRINT "  5:IE.document.links[" + A + "].pathname=" + IE.document.links[A].pathname
    PRINT "  6:IE.document.links[" + A + "].port="     + IE.document.links[A].port
    PRINT "  7:IE.document.links[" + A + "].protocol=" + IE.document.links[A].protocol
    PRINT "  8:IE.document.links[" + A + "].search="   + IE.document.links[A].search
    PRINT "  9:IE.document.links[" + A + "].target="   + IE.document.links[A].target
  NEXT
  PRINT "-----"


PRINT "■アンカーの数"
PRINT "IE.document.anchors.length=" + IE.document.anchors.length
  PRINT "  アンカー名"
  FOR A = 0 TO (IE.document.anchors.length - 1)
    PRINT "IE.document.anchors[" + A + "].name=" + IE.document.anchors[A].name
  NEXT 

リンクオブジェクトも上記のように取得できます。

linksオブジェクトにはclickメソッドが行えるほか、
links[n].hrefでURLが取得できるので、IE.navigateに渡して、アクセスもできます。
サンプルのスクリプトを下記に書いてみます。

この投稿の続きを読む »

タグ

2012年7月20日 | コメントは受け付けていません。 |

カテゴリー:UWSCとInternetExplorer

REPEAT-UNTIL

REPEAT-UNTIL

REPEAT-UNTILによるループ処理を行う
REPEAT
処理
UNTIL 条件

・条件・・・判定結果がFalseの場合ループが続き、Trueで終了

最低1回は実施されるループ

REPEAT-UNTILは条件がFalseの結果を返す限り処理を続けるループ文です。
なのでUNTIL FALSEとした場合は、BREAKを入れない限り、無限ループとなります。
FOR-NEXTループと異なり、カウンタは無いため、
自分で用意する必要があります。

//カウンタは自分で用意
CNT = 1
REPEAT
 PRINT "CNT:" + CNT
 CNT = CNT + 1
UNTIL CNT > 100

WHILE同様、状態が変わるまで処理を続ける場合にはREPEAT-UNTIL、但し・・・

REPEAT-UNTILは先に処理が記述され
その後でUNTILの所で、条件判定が行われています。 大事なポイントは、REPEAT-UNTILはループ終了条件だったとしても
最低1回は処理が実行されると言うことです。
WHILE-WENDは条件がTrueの限りループ
REPEAT-UNTILは条件がFalseの限りループ(Trueになったら終了)
という点もご留意下さい。

マウスが移動したら処理を止める

マウスの起動時の位置を記憶しておき、
吹き出し表示という処理を行い続けます。
もし、マウスの位置が移動したら、
処理を終了するというスクリプトを書いてみましょう。
以下のようになります。

この投稿の続きを読む »

タグ

2012年7月19日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

WHILE-WEND

WHILE-WEND

WHILE-WENDによるループ処理を行う
WHILE 条件
処理
WEND

・条件・・・判定結果がTrueの場合ループが続き、Falseで終了

基本のループ

WHILE-WENDは条件がTrueの結果を返す限り処理を続けるループ文です。
なのでWHILE TRUEとした場合は、BREAKを入れない限り、無限ループとなります。
FOR-NEXTループと異なり、カウンタは無いため、
自分で用意する必要があります。

//カウンタは自分で用意
CNT = 1
WHILE CNT < 100
 PRINT "CNT:" + CNT
 CNT = CNT + 1
WEND

状態が変わるまで処理を続ける場合にはWHILE-WEND

他にもFOR-NEXTやREPEAT-UNTILといったループがあるため
最初はその使い分けが分からないかもしれません。
FOR-NEXTは回数や個数が分かる場合にループに使うケースが多いのに比べ
WHILE-WENDやREPEAT-UNTILは
状態の変化を判別するループに使われることが多いです。
なお、WHILE-WENDは条件判定が処理の前にくるため
判定結果によっては、1度も処理が実施されない場合もあります。

スクリプト起動から5秒経過するまで処理を続ける

スクリプトを起動してから5秒を判定するといっても、いつ起動されるかわからないので
5秒後の時間を指定することもできません。
ここでWHILE-WENDの出番です。
スクリプト起動時の時間を取得し、5秒以上経過するまでを条件に
スクリプトを書いてみましょう。以下のようになります。

この投稿の続きを読む »

タグ

2012年7月18日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

IEGETDATA

IEGETDATA関数
Web上(IE)より値取得
戻値 = IEGETDATA( IE, Name, [Value, 番号] )
引数
IE
IEオブジェクト
Name
値取得するエレメントのName,もしくはタグ名を記述:”TAG=タグ名”
Value
Nameが共通の場合に Valueを指定する
Nameにてタグ名が指定された場合は、そのタグにての順番を指定
番号: Name, Value が同じ場合に順番指定
戻値
取得の値 (取得できなかった場合はEMPTYを返す)

サンプルページからH3タグを取得してみる

cnt	= 1
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://canal22.org/sample0001/")
WHILE IEGETDATA(IE,"TAG=H3",cnt ) <> EMPTY
	PRINT IEGETDATA( IE,"TAG=H3",cnt)
	cnt	= cnt + 1
WEND

解説

WHILE IEGETDATA(IE,”TAG=H3″,cnt ) <> EMPTY
は、返り値が取得できなくなるまで繰り返すことを命令しています。

そしてcntをインクリメントすることで、
IEGETDATA( IE,”TAG=H3″,1)
IEGETDATA( IE,”TAG=H3″,2)
IEGETDATA( IE,”TAG=H3″,3)
・・・

といった具合に、複数のH3タグがあっても順番に表示をするようになっています。

※注意点は、
IEGETSRCはソースの取得、IEGETDATAは値の取得であるということです。
以下のサンプルを実行すると、言わんとすることが明確になります。

この投稿の続きを読む »

タグ

2012年7月17日 | コメントは受け付けていません。 |

カテゴリー:関数一覧

FOR-NEXT

FOR-NEXT

FOR-NEXTによるループ処理を行う
FOR 変数 = 初期値 TO 終了値 [ STEP 刻み値]
処理
NEXT

・変数・・・カウンタ変数
・初期値・・・開始値
・終了値・・・最終値
・刻み値・・・カウンタ変数の1ループあたりの増加数、STEP省略時は1

パラメーターは多いけど使いやすいループ

FOR-NEXTはある処理を繰り返す(ループ処理)場合に便利です。
最初に登場するパラメーターが最低でも3つもあるのが少し戸惑いますが、
慣れてしまえば簡単です。

FOR A = 1 TO 10
 PRINT "A:" + A
 PRINT "->Hello For Next"
NEXT

上記はFOR-NEXTの簡単なサンプルです。
カウンタ変数として「A」に初期値1を設定。
その後、Aが1ループごとに1増加しています。

回数や個数が決まっている場合に便利なループ

他にもWHILE-WENDやREPEAT-UNTILといったループがあるため
最初はその使い分けが分からないかもしれません。
FOR-NEXTはループ回数が決まっている場合や
対象の個数が決まっている場合に使うケースが多いです。
100回実行する(FOR A = 1 TO 100)、
配列や文字数だけ実行する(FOR A = 1 TO LENGTH(TEXT)、FOR A = 0 TO (RESIZE(ARRAY) – 1))、
こう言った場合はFOR-NEXTの出番です。
逆に、状態が変化するまで、処理を続けると言った場合には
WHILE-WENDやREPEAT-UNTILを使います。

STEPの刻み値を利用し、カウンタが減少していくループ

さて、ちょっとだけ応用。
STEPの後に数値を指定することで、カウンタの増加数を自由に決めることができます。
この機能を利用して、カウンタが減少していくスクリプトを作りましょう。
このようになります。

この投稿の続きを読む »

タグ

2012年7月16日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

IFB

IFB

条件分岐を行う
IF 式 [THEN] (もしくはIFB)
真1
[ELSEIF 式 [THEN] ]
真2
[ELSE]

ENDIF

・式・・・判定条件を入れます
・真1,2・・・判定条件がTrueの時に実施する処理を入れます
・偽・・・判定条件がFalseの時に実施する処理を入れます

条件に一致したらある処理をする

IFB-ELSEIF-ELSE-ENDIFはブロック文の条件分岐を行う場合に使用します。
IFはIFB(ブロックのB)とも表記できます。
IFB、ELSEIFの後のTHENは省略可能です。
THENの後に処理を書くとエラーとなるので、条件判定の文のあとは
改行して下さい。

//TEST変数=1として、その値に応じた処理を実施する
TEST = 1
IFB TEST =2 THEN
PRINT 1
ELSEIF TEST = 3 THEN
PRINT 2
ELSE
PRINT 4
ENDIF

IFBの中にIFBと入れ子にすることも可能ですが、
上記スクリプトのようにインデントされていないのは
可読性の良くないスクリプトです。
キチンとインデントした、スクリプトは以下のようになります。
入れ子のIFBがあってもまぁスッキリですね。

この投稿の続きを読む »

タグ

2012年7月15日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

IF

IF

1行での条件分岐を行う
IF 式 THEN 真 [ELSE 偽]

・式・・・判定条件を入れます
・真・・・判定条件がTrueの時に実施する処理を入れます
・偽・・・判定条件がFalseの時に実施する処理を入れます

条件に一致したらある処理をする

IF-THEN-ELSEは1行で条件分岐を行う場合に使用します。
IFの後に判定条件を入力します。
その後のTHEN以降に、判定条件が真の時に行う処理を、
ELSE以降に、偽の時に行う処理を入力します。

//変数TESTに100を代入
TEST = 100
IF TEST > 50 THEN MSGBOX("50より大きい") ELSE MSGBOX("50以下")

上のスクリプトで変数TESTの値を判定条件としています。
TESTが50以上の場合は「50より大きい」というメッセージが出ます。
通常、IF-THEN-ELSEでは真偽それぞれ、1つずつ処理をします。
それ以外はIFB-ELSEIF-ELSEを使います。
どうしてもIF-THEN-ELSEで複数の処理を実行させたい場合は
下記のようにFUNCTIONPROCEDUREでも使いましょう。

この投稿の続きを読む »

タグ

2012年7月15日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

FUNCTION

FUNCTION

戻り値のある自作関数を定義する
FUNCTION 関数名( 引数 [,....] )
RESULT = 戻り値 処理
FEND

引数
・引数・・・定義した関数の呼び出し時に渡す変数を定義
・Var 引数・・・Varをつけると引数は参照引数となり、値が変更される
・引数[]・・・配列も利用可能。次元数分の[]を付ける。二次元配列は引数[][]
・引数=定数・・・値を代入する記述で定数にできる 戻り値
・RESULT・・・関数終了時の戻り値

自作関数を作成し、呼び出す

パラメーターの値を加算する自作関数を定義します。計算結果を戻り値として返します。

TOTAL = MYCALC(300,400)
//計算結果を出力
PRINT TOTAL
FUNCTION MYPROC(VAL1, VAL2)
 ADD = VAL1 + VAL2
 RESULT = ADD
FEND

PROCEDUREと同じく自作関数が定義でき、
なおかつ、戻り値を返すことができます。
同じ処理をするときも定義した関数を呼び出せばよく、
処理を修正する場合も自作関数内のみとなります。
とても便利で、プログラムの再利用性が高くなるので、
積極的に活用しましょう。

引数の意味は?

さて、PROCEDUREと同じようにFUNCTIONで自作関数を定義できますが、
その際に渡す定義に色々な種類があることが分かりました。
「引数」は分かるかもしれませんが、その他の
Var 引数
引数[]
引数=定数
という種類は初見の方には分かりづらいかもしれません。
が、このあたりはPROCEDUREで解説していますので、ご参照下さい。

長い処理も自作関数ですっきり

同じ処理も、その都度スクリプトに書くのではなく、自作関数を使うことで
コードの再利用が可能になります。
またWHILE-WENDなどのループ処理中の動作も自作関数で1つにまとめると、
コードの可読性も高まります。
簡単な例を以下にお見せしましょう。

この投稿の続きを読む »

タグ

2012年7月7日 | コメントは受け付けていません。 |

カテゴリー:関数一覧

画像リンクをクリックしたい!

画像リンクのクリックでハマりました。解決方法はありませんか?
ちなみにボタンのクリックはできています。
せっかくイイ感じでスクリプトを生成していても、
画像リンクのクリック部分だけ、対話式にしないといけなくて、
結局自動化できない。。。なんてことありますね。

かくいう私もその1人でした。
しかし、COMコンポーネントの利用で以下のように、
解決します。

IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IE.navigate("http://canal22.org/sample0006/")
REPEAT
    SLEEP(0.1)
UNTIL (!IE.Busy) AND (IE.ReadyState = 4)

// 画像一覧を取得
IMG_LST = IE.Document.Images

// 画像一覧の中からalt属性が一致する画像をクリックする
FOR I = 0 TO IMG_LST.length - 1
    IMG_ALT = "2012年9月1日(土)UWSCセミナー勉強会@東京 のお知らせ"

    // 画像一覧からalt属性でヒットする
    IFB IMG_LST.Item(I).Alt = IMG_ALT THEN
        // 次ページに遷移する。
        MSGBOX("ページ遷移します。")
        IMG_LST.Item(I).Click()
    ENDIF
NEXT

解説

ヘルプなどに出ていないので、IMG_ALTIE.Document.Imagesといった部分に面食らったかもしれません。

これはCOM(IE)コンポーネントという機能を利用していて、
UWSCからCOMを利用できるが、COMがUWSCの機能ではないので、
ヘルプなどには、ほとんど載りません。

しかし、UWSC コバヤシ式では、UWSC 上級ページにて、
こういったCOMコンポーネントの利用方法を解説しているので、
よろしければ、ご参照ください。

今回のサンプルはconfrageさんのサイトを参考にさせてもらいました。

参考ページ
http://www.confrage.com/uwsc/ie/imglink/imglink.html

タグ

2012年7月5日 | コメントは受け付けていません。 |

カテゴリー:Q&A

PROCEDURE

PROCEDURE

戻り値の無い自作関数を定義する
PROCEDURE 関数名( 引数 [,....] )
処理
FEND

引数
・引数・・・定義した関数の呼び出し時に渡す変数を定義
・Var 引数・・・Varをつけると引数は参照引数となり、値が変更される
・引数[]・・・配列も利用可能。次元数分の[]を付ける。二次元配列は引数[][]
・引数=定数・・・値を代入する記述で定数にできる

自作関数を作成し、呼び出す

引数の値をログ出力、メッセージボックス出力をする自作関数を定義し、呼び出します。

MYPROC("これが出力される")

PROCEDURE MYPROC(myTEXT)
 PRINT myTEXT
 MSGBOX(myTEXT)
FEND

PROCEDUREで手続きを一まとめにしておけば、
呼び出しが簡単になります。
また、同じ処理をするときも定義した関数を呼び出せばよく、
処理を修正する場合も自作関数内のみとなります。
とても便利で、プログラムの再利用性が高くなるので、
積極的に活用しましょう。

引数の意味は?

さて、PROCEDUREで自作関数を定義できますが、
その際に渡す定義に色々な種類があることが分かりました。
「引数」は分かるかもしれませんが、その他の
Var 引数
引数[]
引数=定数
という種類は初見の方には分かりづらいかもしれません。
以下のスクリプトでサンプルを作りながら、その違いを見てみましょう。

この投稿の続きを読む »

タグ

2012年7月4日 | コメントは受け付けていません。 |

カテゴリー:関数一覧

このページの先頭へ