「なんかリンクがクリックできないよ・・・」を解決します。
UWSCでIE操作を行う場合、「リンクのクリック」をしたいことはよくあります。
特にポイントサイトの場合、画面の遷移だけでなく、クリックポイントや検索ポイントを取得する際にも必要ですしねー。(*^-^*)
でも、結構ありますよね。
「なんかリンクがクリックできないよ・・・(´・ω・`)」
ってことが。
リンクといっても、単純なaタグだけとは限らず、様々な実装が行われています。
単純にクリックできないことも多々あるんです(;´・ω・)。
そんなときはこちらのパターンを参考にしてみてください。(ソースのところをコピーできます)
aタグの単純な単一リンクをクリックする場合はIELink
最もシンプルなパターンです。
普通のIEのリンクなら、これで十分です。
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
IELink(IE,<span class="hljs-string">"リンクの表示名"</span>)
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
IE.Visible = True
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
BUSYWAIT(IE)
IELink(IE,<span class="hljs-string">"リンクの表示名"</span>)
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://XXXXXXXXXXXXXXX/")
BUSYWAIT(IE)
IELink(IE,"リンクの表示名")
複数のリンクを一括取得したいときはIE.Document.links
ページ内にある複数のリンクを条件に応じて抽出して、まとめて処理したい場合などに使います。
例えば、ポイントサイトのあるページにある、クリックポイントをまとめてクリックしちゃいたい時とか。
以下の例では、ページ内のリンクを全て取得した後、「clickpoint.php」をアドレスに含むリンクを全てクリック(.Click())するスクリプトになります。
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
LINK_AMOUNT = IE.Document.links.length
FOR a = 0 TO (LINK_AMOUNT - 1)
IFB POS(<span class="hljs-string">"clickpoint.php"</span>, IE.Document.links[a].href) > 0
IE.Document.links[a].Click()
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
IE.Visible = True
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
BUSYWAIT(IE)
LINK_AMOUNT = IE.Document.links.length
FOR a = 0 TO (LINK_AMOUNT - 1)
IFB POS(<span class="hljs-string">"clickpoint.php"</span>, IE.Document.links[a].href) > 0
IE.Document.links[a].Click()
ENDIF
NEXT
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://XXXXXXXXXXXXXXX/")
BUSYWAIT(IE)
LINK_AMOUNT = IE.Document.links.length
FOR a = 0 TO (LINK_AMOUNT - 1)
IFB POS("clickpoint.php", IE.Document.links[a].href) > 0
IE.Document.links[a].Click()
ENDIF
NEXT
画像リンクをクリックしたいときはIE.Document.Images
リンクに文字ではなく、画像が設定されているリンクもあります。
htmlタグとしては、以下のような感じです。
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"XXXXXXX"</span>></span><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"YYYY.gif"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"リンクの画像だよ"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"200"</span> /></span><span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"XXXXXXX"</span>></span><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"YYYY.gif"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"リンクの画像だよ"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"200"</span> /></span><span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<a href="XXXXXXX"><img src="YYYY.gif" alt="リンクの画像だよ" width="200" /></a>
こういう場合は、IE.Document.Imagesで画像を探してあげて、クリックしてする感じになります。
以下の例では画像を探した上で、alt属性の値をキーに対象箇所を特定して、画像自体をクリックしています。
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
IMG_LST = IE.Document.Images
FOR I = 0 TO IMG_LST.length - 1
IFB IMG_LST.Item(I).Alt = <span class="hljs-string">"リンクの画像だよ"</span> THEN
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
IE.Visible = True
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
BUSYWAIT(IE)
IMG_LST = IE.Document.Images
FOR I = 0 TO IMG_LST.length - 1
IFB IMG_LST.Item(I).Alt = <span class="hljs-string">"リンクの画像だよ"</span> THEN
IMG_LST.Item(I).Click()
ENDIF
NEXT
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://XXXXXXXXXXXXXXX/")
BUSYWAIT(IE)
IMG_LST = IE.Document.Images
FOR I = 0 TO IMG_LST.length - 1
IFB IMG_LST.Item(I).Alt = "リンクの画像だよ" THEN
IMG_LST.Item(I).Click()
ENDIF
NEXT
特定できる属性が無い画像リンクをクリックしたいときはIESETDATA
上記ではalt属性がありましたが、画像のsrcのみの場合もあります。
このような場合。
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"XXXXXXX"</span>></span><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"YYYY.gif"</span>/></span><span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"XXXXXXX"</span>></span><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"YYYY.gif"</span>/></span><span class="hljs-tag"></<span class="hljs-name">a</span>></span>
<a href="XXXXXXX"><img src="YYYY.gif"/></a>
この場合は、IESETDATAのタグ指定(TAG=IMG)でクリックします。
「IESETDATA」はかなり万能です。
リンクだけでなく、ボタンやその他のコントロールなど、いろいろなクリックを行うことができます。
注意すべき点は、画像のURLは絶対指定(http:~から)という点です。
相対指定されているケースが多いので、サイトのURLを付けてやる必要があります。
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
IE.Visible = <span class="hljs-keyword">True</span>
IE.Navigate(<span class="hljs-string">"http://XXXXXXXXXXXXXXX/"</span>)
IESETDATA(IE,<span class="hljs-keyword">TRUE</span>,<span class="hljs-string">"TAG=IMG"</span>,<span class="hljs-string">"http://XXXXXXXXXXXXXXX/YYYY.gif"</span>)
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
IE.Visible = <span class="hljs-keyword">True</span>
IE.Navigate(<span class="hljs-string">"http://XXXXXXXXXXXXXXX/"</span>)
BUSYWAIT(IE)
IESETDATA(IE,<span class="hljs-keyword">TRUE</span>,<span class="hljs-string">"TAG=IMG"</span>,<span class="hljs-string">"http://XXXXXXXXXXXXXXX/YYYY.gif"</span>)
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://XXXXXXXXXXXXXXX/")
BUSYWAIT(IE)
IESETDATA(IE,TRUE,"TAG=IMG","http://XXXXXXXXXXXXXXX/YYYY.gif")
スクリプト等で画面移動している場合はIEGETSRC
一番やっかいなケースですね。
通常のリンクではなく、スクリプト等で画面制御しているケースです。
最近はjavascriptのリッチなUI/UXが盛んですので、最近出来たサイトなどでは結構あります。
例えば、最近流行ってる「1円アンケート」などは、UWSCで比較的簡単に自動化できるのですが、URLアドレスが取得できずに困るケースがあります。
例えば、infoQでは、アンケートへのリンクが以下のようになっていて、スクリプトで処理されています。
<a <span class="hljs-class"><span class="hljs-keyword">class</span>="<span class="hljs-title">c_pointer</span>" <span class="hljs-title">onclick</span>="<span class="hljs-title">openEnqWindow</span></span>(<span class="hljs-string">'https://infopanel.jp/lpark/enqRedirect.do?qid=XXXXXXXXX'</span>,YYYYYY);<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<span class="hljs-string">">ZZZに関するアンケート(マンガ)</a></span>
<a <span class="hljs-class"><span class="hljs-keyword">class</span>="<span class="hljs-title">c_pointer</span>" <span class="hljs-title">onclick</span>="<span class="hljs-title">openEnqWindow</span></span>(<span class="hljs-string">'https://infopanel.jp/lpark/enqRedirect.do?qid=XXXXXXXXX'</span>,YYYYYY);<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;<span class="hljs-string">">ZZZに関するアンケート(マンガ)</a></span>
<a class="c_pointer" onclick="openEnqWindow('https://infopanel.jp/lpark/enqRedirect.do?qid=XXXXXXXXX',YYYYYY);return false;">ZZZに関するアンケート(マンガ)</a>
onclickの部分のスクリプトのパラメータ
「https://infopanel.jp/lpark/enqRedirect.do?qid=XXXXXXXXX」
の部分が1円アンケートのURLアドレスです。
このような場合は、IEGETSRCでソース全体を抽出し、URLアドレス部分を(正規表現等で)自分で抽出します。
この手法はかなり応用が利くので、いろいろできるのですが、正規表現を自在に操れないと厳しいので、初心者の方には少し難易度が高いですね(;^ω^)
下記の例では、抽出したhtmlから、正規表現「”https?://[\w/:%#\$&\?\(\)~\.=\+\-]+”」で全URLアドレスを抜き出し、さらに「infopanel.jp/lpark/enqRedirect.do?」を含むURLを呼び出しています。
これで抽出したURLアドレスを使えば、1円アンケートの自動化などに使えるわけですね!
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
mainbody = IEGetSrc(IE, <span class="hljs-string">"BODY"</span>)
re=CreateOleObj(<span class="hljs-string">"VBScript.RegExp"</span>)
re.pattern = <span class="hljs-string">"https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"</span>
match = re.Execute(mainbody)
for i = 0 To match.Count - 1
IFb pos(<span class="hljs-string">"infopanel.jp/lpark/enqRedirect.do?"</span>, match.Item(i).Value) > 0 then
IE.Navigate(match.Item(i).Value)
<span class="hljs-keyword">endif</span>
IE = CreateOLEObj(<span class="hljs-string">"InternetExplorer.Application"</span>)
IE.Visible = True
<span class="hljs-section">IE.Navigate("http://XXXXXXXXXXXXXXX/")</span>
BUSYWAIT(IE)
mainbody = IEGetSrc(IE, <span class="hljs-string">"BODY"</span>)
re=CreateOleObj(<span class="hljs-string">"VBScript.RegExp"</span>)
re.pattern = <span class="hljs-string">"https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"</span>
re.Global = True
re.IgnoreCase = True
match = re.Execute(mainbody)
//マッチしたものに処理をかける
for i = 0 To match.Count - 1
IFb pos(<span class="hljs-string">"infopanel.jp/lpark/enqRedirect.do?"</span>, match.Item(i).Value) > 0 then
IE.Navigate(match.Item(i).Value)
・
・
・
<span class="hljs-keyword">endif</span>
next
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://XXXXXXXXXXXXXXX/")
BUSYWAIT(IE)
mainbody = IEGetSrc(IE, "BODY")
re=CreateOleObj("VBScript.RegExp")
re.pattern = "https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"
re.Global = True
re.IgnoreCase = True
match = re.Execute(mainbody)
//マッチしたものに処理をかける
for i = 0 To match.Count - 1
IFb pos("infopanel.jp/lpark/enqRedirect.do?", match.Item(i).Value) > 0 then
IE.Navigate(match.Item(i).Value)
・
・
・
endif
next
いかがでしょうか?
これでどんなリンクでもクリックできるはず!(*´з`)
え?リンクだけでなくてボタンもクリックしたい?こちらをどうぞ。

UWSCでログイン・ボタンクリック操作に迷ったら読む。5つのパターン別テクニック
ボタンも画像もOK。UWSCでWEBサイトのクリック操作やログイン処理に悩んだら読んで!HTMLタグ別攻略法。UWSCでWEBサイトのボタンクリック操作(IEのDOM操作)の処理を書くときに、サイトごとにログインページ等のHTMLが違うので...
クリックについて、もっと具体的なイメージを掴みたい人はこちらの記事も参考にしてみてください。

CMくじ自動巡回ツール修正&UWSC画像クリックのサンプルと解説。
dreevee.comのサイト変更で動かなくなってたので修正しました。うちで作って公開している「CMくじ自動巡回ツール」ですが、いつの間にか、うまく動かなくなってましたね・・・(;^ω^)。まあ、サイト側は変更されるんで、仕方ないんですけど...