広告

posted by fanblog

2017年01月14日

pythonで「Internet Explorer_Server」クラスの子ウインドウ内のボタンを自動クリック

前回少し書いたが
pywinautoでソフトを自動操作して
ボタンを押していく中で、
「Internet Explorer_Server」というクラスの子ウインドウ
の中にログインボタンがあるのだが、
子ウインドウに対してcontrol_identifiers
を使ってもボタンの情報が見当たらない。
どうやらHTMLのページがソフトのウインドウの中に埋め込まれているようだ。
そのHTMLの情報を取得しないと
ログインボタンは押せないと考えた。

で前回の記事では
下記の本を参考にVBAでinternet explorerの操作を勉強した。

>Excel VBAでIEを思いのままに操作できるプログラミング術 Excel



どうやらHTMLデータ全体であるHTMLドキュメントなるものを取得して
その中の色んなプロパティのうちの一つを指定することで
必要なデータを見れるようだ。
「DOM(Document Object Model)」という概念らしい。

他ソフトの中に組み込まれている「Internet Explorer_Server」クラスの子ウインドウから
HTMLドキュメントを取得し、ボタンの情報を取得しクリックするのが目標だ。

HTMLドキュメントを取得するところまでは
前回記事にも記載した下記のサイトが参考になる。

>Python : Automating Internet Explorer_Server
http://stackoverflow.com/questions/35778771/python-automating-internet-explorer-server

HTMLドキュメントにどんなプロパティがあるかは
下記のサイトを見つけて知った。
>IHTMLDocument2 Object
https://msdn.microsoft.com/ja-jp/library/office/aa219325(v=office.11).aspx

activeElement PropertyからvlinkColor Propertyまで
たくさんのプロパティがある。
取得したHTMLドキュメントを変数docに格納したとすると
print(doc.URL)でURLを確認できる。

※ちなみに全部print()で確認したが
 fileCreatedDate Property〜parentWindow Property
 はエラーで表示されなかった。

HTMLのテキストを見たかったが、
見れるプロパティは見つからなかった。おかしいなあ。

次の日、再度各プロパティ名を使ってgoogle検索してみると
下記のサイトを見つけた。

>DOM(Document Object Model)のouterTextとinnerTextの違いについて
http://www.vba-ie.net/element/outer-innertext.html

「AllプロパティはHTMLドキュメント内の全ての要素オブジェクトを返すプロパティ」
と書いてある。
この中に絶対HTMLのテキスト情報が含まれているはずだ、、、
(でもprint(doc.all)だと[object]としか表示されない、、)

と思って読み進めていくと、
「objIE.document.All(添え字).プロパティ/メソッド」とか
「objIE.document.All(添え字).innerHTML」
と書いてある。

どうやらプロパティ名だけで完結するものと、
プロパティ名だけだとまだ複数の情報をもったオブジェクト扱いになっていて、
その後ろにさらにプロパティ名みたいなものを「.」を付けて指定しないと
いけないものがあるようだ。

きっとHTMLドキュメント内に複数のinnerHTMLなるものが
入っていて、1つ目を見るなら
print(doc.all(0).innerHTML)
で見れるはずである、、、、見れた!

ついに、、ついにHTMLのテキストを
pythonで他ソフトの「Internet Explorer_Server」クラスの子ウインドウから
取得したぞーーー

そして中には「ログイン」ボタンについても書いてある。
よし。


※ちなみにこれらのプロパティ操作で思ったことがある。
 ん、、、、
 パスワードのテキストボックス内の
 ●●●●●●
 と非表示になっているパスワードまで取得できてしまうぞ。
 僕はなんて深淵まで来てしまったんだ、、、、
 (webの仕事をしている人からしたら超ド素人が表層の表層をこちょこちょ
  遊んでいるだけなのだろうが、、、、)
 少しびっくり。
 これからはできるだけログイン画面のパスワードを
 「次回から自動」とか「PCに保存」にしないようにしょう。


話をもとにもどして
たしかVBAの本にはDOMでは取得したオブジェクトは
複数のタグで構成されていて、
.タグ(タグ番号)でタグを取得し、
.タグ(タグ番号).プロパティで名前や値を取得する、、、ようなこと
があった気がする。

innerHTMLで「ログイン」ボタンは
INPUTというタグに挟まれていた。
google検索してみると下記のサイトを見つけた。

>ken3memo (三流君) Set objINPUT = objIE.Document.all.tags("INPUT") で
>タグを集めてみたものの...使いにくかった(笑)
http://d.hatena.ne.jp/ken3memo/20101003/1286108874

「Set objINPUT = objIE.Document.all.tags("INPUT")」とか
「objINPUT(0).Value = "0000"」とか書いてある。
ということは
print(doc.all.tags(u"INPUT")(0).Value)
print(doc.all.tags(u"INPUT")(1).Value)
print(doc.all.tags(u"INPUT")(2).Value)
とすればよいのではないか。

ビンゴだ!
doc.all.tags(u"INPUT")(2).Valueで「ログイン」という文字列を
取得した。

ということは最初の参考サイトに戻って
doc.all.tags(u"INPUT")(2).click()
でログインボタンを押せるのでは、、、

押せたーーーー!!(感動)


結論としては、ほんとただボタン1個押すのに
どんだけ労力かけてんだよ、、と思うが、
パズルゲームのようで嫌いじゃない。
パソコンを使ってプログラムを書くという
常に頭に負荷をかけて解けなかったものを解きたい、、
という欲求みたいなものが少しあるのだろう。
数独が趣味の人と似ているのだろう。

そして一度解いたものは関数化して忘れる。
次から何も考えなくても一瞬。
下記は今回のソースコードである。
(パスやソフト名やクラス名、タイトルなどは伏せるため
 適当な文字列にしてあるのであしからず)

海外のpythonユーザー等で「Internet Explorer_Server」クラスに
苦労している人もいるようなので参考になればいいなあ、と思います。




ちなみに次の課題としては
ログイン後のウインドウの中に
「Internet Explorer_Server」クラスの子ウインドウがあって
その中の「リスト」を操作したい。
リストにチェックを入れて、次に進むボタンを押す、
ということをやりたい。
リストのタグを探して何かするのだろう。
また時間のあるときに頭の体操として頑張ろう。



posted by iyoder at 13:45 | Comment(0) | TrackBack(0) | プログラム
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
http://fanblogs.jp/tb/5823621
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
最新記事
<< 2018年12月 >>
            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          
カテゴリーアーカイブ
ファン
プロフィール
最新コメント
×

この広告は30日以上新しい記事の更新がないブログに表示されております。