それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyでwin32oleを使う。(基本->IEのDOMにアクセスするまで)

Rubyでwin32oleを使う。

RubyMagazineのCuzicさんの連載を読むべき。

win32ole意外に細かいところが重要だったリスるので、きっちり読むこと。

COMを使うの?VBAで良いじゃん?

違います。irbが使える。これがとんでもないアドバンテージなのじゃ。

使い方

Rubyのインストール

ActiveRubyを選んでインストール通常のrubyでいいみたい。

まずはirbを起動

  1. コマンドプロンプトを起動してirbを起動
  2. すべてのプログラムからRubyirb

Win32OLEを使う

準備する。

> require 'win32ole'
> 

これで準備完了です。

IEを起動してみる。

表示したり、消したりして遊んでみる。

> require 'win32ole'
> ie = WIN32OLE.new 'InternetExplorer.Application'
> ie.visible = true
> ie.visible = false
> ie.visible = true

IEが使えるメソッドを表示してみる。

> require 'win32ole'
> ie = WIN32OLE.new 'InternetExplorer.Application'
> ie.ole_methods
=> [QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke, GoBack, GoForward, GoHome, Go
Search, Navigate, Refresh, Refresh2, Stop, Application, Parent, Container, Document, TopLevelContainer, Type, Left, Left
, Top, Top, Width, Width, Height, Height, LocationName, LocationURL, Busy, Quit, ClientToWindow, PutProperty, GetPropert
y, Name, HWND, FullName, Path, Visible, Visible, StatusBar, StatusBar, StatusText, StatusText, ToolBar, ToolBar, MenuBar
, MenuBar, FullScreen, FullScreen, Navigate2, QueryStatusWB, ExecWB, ShowBrowserBar, ReadyState, Offline, Offline, Silen
t, Silent, RegisterAsBrowser, RegisterAsBrowser, RegisterAsDropTarget, RegisterAsDropTarget, TheaterMode, TheaterMode, A
ddressBar, AddressBar, Resizable, Resizable, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke]
irb(main):008:0> ie.ole_methods

なんかいっぱいあるし、しかも順番めちゃくちゃだし。なんか見づらいよね。method名を**Stringにしてソートしてみた。

> require 'win32ole'
> ie = WIN32OLE.new 'InternetExplorer.Application'
> ie.ole_methods.map {|m| m.to_s}.sort
=> ["AddRef", "AddressBar", "AddressBar", "Application", "Busy", "ClientToWindow", "Container", "Document", "ExecWB", "F
ullName", "FullScreen", "FullScreen", "GetIDsOfNames", "GetIDsOfNames", "GetProperty", "GetTypeInfo", "GetTypeInfo", "Ge
tTypeInfoCount", "GetTypeInfoCount", "GoBack", "GoForward", "GoHome", "GoSearch", "HWND", "Height", "Height", "Invoke",
"Invoke", "Left", "Left", "LocationName", "LocationURL", "MenuBar", "MenuBar", "Name", "Navigate", "Navigate2", "Offline
", "Offline", "Parent", "Path", "PutProperty", "QueryInterface", "QueryStatusWB", "Quit", "ReadyState", "Refresh", "Refr
esh2", "RegisterAsBrowser", "RegisterAsBrowser", "RegisterAsDropTarget", "RegisterAsDropTarget", "Release", "Resizable",
 "Resizable", "ShowBrowserBar", "Silent", "Silent", "StatusBar", "StatusBar", "StatusText", "StatusText", "Stop", "Theat
erMode", "TheaterMode", "ToolBar", "ToolBar", "Top", "Top", "TopLevelContainer", "Type", "Visible", "Visible", "Width",
"Width"]

irbがあれば、MSDN使わなくて良い

irbでmethods一覧が出てくるので、MSDNの巨大ダンジョンを走り回らなくて良い。コレで、Windows(COM)プログラミングの速度が劇的に速くなると思う。僕はコレがないと、Windowsプログラミングやりたくないです。

IEを表示する。

irb(main):001:0> require 'win32ole'
=> true
irb(main):002:0> ie = WIN32OLE.new 'InternetExplorer.Application'
=> #<WIN32OLE:0x4056f78>
irb(main):004:0> ie.Visible = true   #表示される
=> true
irb(main):005:0> ie.Visible = false #消える。
=> false

IEでサイト表示する。

IEでGoogleに行ってみる。

irb(main):001:0> require 'win32ole'
=> true
irb(main):002:0> ie = WIN32OLE.new 'InternetExplorer.Application'
=> #<WIN32OLE:0x4256f08>
irb(main):003:0> ie.Navigate2 "http://www.google.com/"
=> nil
irb(main):004:0> ie.Visible = true
=> true
irb(main):005:0> 

さて、IEの内部のDOMにアクセスする。

ココかがら本題だよ。DOMにアクセスして、あれこれやってみよう。

irb(main):001:0> require 'win32ole'
=> true
irb(main):004:0> ie = WIN32OLE.new 'InternetExplorer.Application'
=> #<WIN32OLE:0x4249e0c>
irb(main):005:0> ie.Visible = true
=> true
irb(main):006:0> ie.Navigate2 'http://www.google.com/'
=> nil
irb(main):007:0> document = ie.Document #DOMオブジェクト
=> #<WIN32OLE:0x4233634>
irb(main):008:0> window = ie.Document.ParentWindow
=> #<WIN32OLE:0x422caf0>
irb(main):009:0> window.alert('Hello from Ruby win32') #Alertでた!
=> nil
irb(main):010:0> document.forms.item(0).elements.item(2).value="this is ruby" #Formに値がでるよね。
=> "this is ruby"
irb(main):011:0> document.forms.item(0).submit #google検索結果。
=> nil

これでもテスト自動化できなる。

IEをオートパイロットで自動化できるよ。Mechanizeの自動化でテストできないサイトでも、自動化できる。Mechanizeの自動テストを信用しない上司にはこれを見せてRubyの採用を迫ると良い。

つーかこれはRubyなくてもWSH(Windows標準)でも出来るんだけどね。

Rubyじゃなくて、JScriptでやりたい人はこっち→JavaScriptを動的に書き出す