• ベストアンサー

Cygwin RubyでのIE

Cygwin上でRuby言語でInternetExplorerのプログラムを書いています 現在は 1、win32oleでIEを開く 2、プログラム内でhtmlでHPを作成し、IEで開く 3、2をプログラムを終了させるまで続ける といったものですが、2でURLを習得し、IEで開こうとすると新しい窓(ウィンドウ)が開いてしまいます。新しい窓(ウィンドウ)を開かずに、1で開いたIEを更新させたいです。 または、前に開いたページを閉じて、新たなページを開く。 win32oleやwin32APIなど、Cygwin上のRubyで使える方法ならいいので、ご存知の方いましたらお願いします。

  • Ruby
  • 回答数5
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

sleep 1 while @@ie.Busy == true のsleepが失敗するのは、どこかでsleepメソッドを定義してしまっていることが原因ではないかと思います。 おそらく、 Kernel.sleep 1 while @@ie.Busy == true を使うことで解決するのではないかと思います。 (Kernel.sleepを再定義していればどうにもなりませんが。)

その他の回答 (4)

回答No.4

#3の補足、拝見しました。 どうやら、IEインスタンスを複数生成しているようですね、#3補足のプログラムでは WIN32OLE.new("InternetExplorer.Application") が複数回実行されますよ。 initializeメソッドの中とWIN32OLE.newの後ろに puts "test xxx" 等を入れて、いつ起動するか観察してたりすると、どのようにプログラムが動くか分かるようになると思います。 さて、最初のプログラムの問題点ですが、 IEクラスのインスタンスを複数作る(IE.newを複数実行する)のであれば、 その都度、インスタンス変数である @ie_ole @on も新しく作られますので、意図しない動作となってしまいます。 詳しくは 定数と変数 http://doc.okkez.net/static/191/doc/spec=2fvariables.html クラス変数の概念 http://www.rubylife.jp/ini/class/index8.html インスタンス変数の概念 http://www.rubylife.jp/ini/class/index4.html クラス変数・クラスメソッド http://www.mapee.jp/ruby/post_14.html 等を参照してください。 @ie_ole @on 等のインスタンス変数はnewや補足プログラムのopenを実行すると、古いものとは別に新しいものが生成されます。 @ie_ole と @on をそれぞれ、 クラス変数にの@@ie_ole と @@on に変更すると、インスタンス生成(new)を何回実行しても前の物を参照可能となります。 それと、openメソッドで newを使うことも問題です。 @ie_ole = IE.new(fullscreen = false) @ie_ole.web(~~~.html) の部分で、新しくIEのインスタンスを作ってしまうと、インスタンス変数も新しく作成されてそちらを使うので、意図しない動作となってしまいます。 self.web(~~~.html) のみとするのが意図した動作ではないかと思うのですが。 もくしは、クラスメソッドとして def IE.open ie = IE.new(fullscreen = false) ie.web(~~~.html) return ie end に変更して、IE.openで実行することで意図したメソッドになるかもしれません。(上記のクラスメソッドのリンクを参照してください) 2番目のプログラムも、openは1番目と同じ問題を抱えていて、さらにwebメソッドのie変数はローカル変数(上記定数と変数のリンクを参照してください)となっていて、メソッドを実行するたびに新しく生成されてしまいます。 @on と ie を @@on と @@ie_ole に変更すれば意図した動作に近づくと思います。

rokino
質問者

補足

InternetExplorer.new(fullscreen = false) と sleep 1 while @@ie.Busy == true この2行をなくすことで意図した動作になりました。 sleepの行をなくさないと `sleep': wrong number of arguments (1 for 0) (ArgumentError) とでてしまいました。

回答No.3

#1のプログラムが動くなら、プログラムを修正すれば大丈夫ですね。 説明があいまいだったせいかうまく伝わらなかったようなので、詳細にOLEコマンドの説明をします。 ie変数は、IEクラスのインスタンスと勘違いしないように、ole_ie変数に変更しています。 ole_ie = WIN32OLE.new("InternetExplorer.Application") # ・・・(1) の部分は、IEの新規ウィンドウを作成するコマンドなので、プログラムを通じて1回だけ実行するようにしましょう。 何度も実行すると、複数のウィンドウが起動します。 ole_ie.visible = true # ・・・(2) の部分は、(2)で作成したウィンドウを画面に表示するためのものです。これを実行せずにプログラムを終了させると、非表示のIEプロセスが残ることになるので、注意しましょう。(タスクマネージャなどで終了可能です。) ole_ie.navigate2(url) # ・・・(3) の部分は、navigate2 メソッドを第2引数を省略して実行すると、(1)で作成したIEウィンドウの既存のタブでブラウズします。 sleep 1 whlle ole_ie.Busy == true # ・・・(4) の部分は、ブラウザが全てを更新するまで1秒間隔で監視して待機します。 ですので#1 の補足のプログラムで、webメソッドを何回も実行すると、(1)が複数回実行され、navigateメソッド、navigate2メソッドどちらを使用しても、新しいウィンドウで表示してしまいます。 #1補足のIEクラスは別のクラスを継承しているとのことなので、IEインスタンスを複数作ることもあるかもしれないので、(1)(2)の部分を分離して、 補足プログラムIEクラスのwebメソッドを下記のようにしてしまいましょう。 def web(url, ole_ie) ole_ie.navigate(url) sleep 1 while ole_ie.Busy == true end その上で、プログラムで1回だけ(1)(2)を実行して、ole_ie変数をwebメソッドに渡すようにすればよいのではないかと思います。 付録として、win32oleを使わない方法も紹介 (1) IEの設定でインターネットオプション→タブの設定→他のプログラムからリンクを開く方法を「現在のタブまたはウィンドウ」に設定 (2) 標準のインターネットブラウザをIEに設定 (3) system("explorer ~~.html")  システムコマンドを使って、IEを呼び出す。 この方法で、IEのタブ設定を変えてしまうとIEの使い勝手が悪くなりますけどね。

rokino
質問者

補足

class IE def initialize(start,fullscreen = false) end def IEnew if @on == nil then @ole_ie = WIN32OLE.new("InternetExplorer.Application") @on = 1 end end def open @ole_ie = InternetExplorer.new(fullscreen = false) @ole_ie.web(~~~.html) end def web(url) self.IEnew @ole_ie.navigate2(url) @ole_ie.Visible = true sleep 1 while @ole_ie.Busy == true return @ole_ie end という感じでやりましたが複数のブラウザが開いてしまいました。 @onはinitializeやその他では定義していない。 また class IE   def initialize(start, fullscreen = false)    ~~    ~~   end   def open     ie = IE.new(fullscreen = false)     ie.web(~~~.html)          end def web(url)     if @on == nil then ie = WIN32OLE.new("InternetExplorer.Application") @on = 1     end     ie.navigate2(url)     ie.visible     sleep 1 while ole_ie.Busy == true     return ie   end end とやっても結果は同じでした WIN32OLE.newを1回だけ実行する部分がうまくできてないようです initializeで@onを定義すると毎回その値が入ってifなどできないし・・・

回答No.2

補足のプログラム拝見しました。 メインのプログラムがどのようにループしているか分からないので、的外れかもしれませんが、 毎回web("~.html") を実行すると、その都度新しいIEウィンドウが作成されますので、最初に開いたものにnavigate2を実行する必要があります。 2回目以降は web(~)の戻したオブジェクトに対して、navigate2を実行してみてください。 #質問と関係ないですしおせっかいかも知れませんが、補足のIEクラスはWIN32OLEクラスを継承したほうが綺麗になると思いますよ。 class IE < WIN32OLE def initialize(start, fullscreen = false) ~~ ~~ super("InternetExplorer.Application") self.visible=true end def web(url) self.navigate2(url) sleep 1 while self.Busy end end 的外れなら、#1で私が書いたサンプルを実行してyahoo!がどう開くか、お手持ちのIE8+cygwinで動作するか、教えてもらえませんか? 新しいウィンドウで開くか、既存のウィンドウ(googleが表示)の新しいタブで開くか、既存のウィンドウの既存のタブで開くか?どれでしょうかね?

rokino
質問者

補足

#1とは一番最初の回答に記載されていたプログラムでしょうか? 実行した結果正常に新しいタブ・ウィンドウを開くことなくgoogleとyahooを開き閉じることが出来ました。 メインプログラムでは<<EOS <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">~~EOS を使ってhtml言語でページを作成し、2回目以降の新しいページは同じファイル名で上書きされて作成されます。 またWin32OLEクラスを継承とありますがIEクラスはすでに他のクラスを継承しているので・・・

回答No.1

win32oleでnavigate2を使えば実現可能ではないでしょうか。 参考URL IEオブジェクトを操作する(VBScript) http://www.happy2-island.com/vbs/cafe02/capter00711.shtml rubyからIEを制御する http://www.tech-notes.dyndns.org/win32ole/ie_ctrl.html リファレンス(英語) http://nerds-central.blogspot.com/2007/02/internet-explorer-ole-com-interface-api.html ↓goolgleを開いて、5秒後にyahooに切り替え、更に5秒後に終了。 require 'win32ole' urls = ["http://www.google.co.jp/","http://www.yahoo.co.jp/"] ie = WIN32OLE.new("InternetExplorer.Application") ie.visible = true urls.each { |url| ie.navigate2(url) sleep 5 } ie.quit

rokino
質問者

補足

現在のプログラムとしては class IE def initialize(start, fullscreen = false) ~~ ~~ end def open ie = IE.new(fullscreen = false) ie.web(~~~.html)        ←ほかのプログラムでhtmlの中身を書き換えてる end def web(url) ie = WIN32OLE.new("InternetExplorer.Application") ie.navigate(url) ie.visible while ie.Busy == true sleep 1 end return ie end end となっています。 kanemoto_sさんの答えのように navigateをnavigate2にしたりと自分なりにいろいろ試しましたがやり方が悪いのかできませんでした IEのVersionは8 initializeで private,new,framemergingをtrueにしています(他はデフォルト?)

関連するQ&A

  • rubyのWatirでIEが起動しない。

    rubyのWatirでIEが起動しない。 こんにちは rubyをはじめて使ってみたものです。 自動化のためにWatirを使用したいです。 インストールは無事終わっていますが、サンプルプログラムを叩くと以下の様なエラーが出てしまいにっちもさっちも行きません。 IEも起動できません。 どなたか助けていただけると本当にうれしいです。 サンプルプログラム require 'watir' agent = Watir::IE.start "http://www.google.co.jp/" ruby.exe -コンポーネントが見つかりません msvcrt-ruby18.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールしなおすとこの問題は解決される場合があります。 C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-api-0.4.0/lib/windows/api.rb:1:in `r equire': 126: 指定されたモジュールが見つかりません。 - C:/Ruby191/lib/ruby/gem s/1.9.1/gems/win32-api-1.4.6-x86-mingw32/lib/win32/api.so (LoadError) from C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-api-0.4.0/lib/windows/a pi.rb:1:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-pr-1.0.9/lib/windows/er ror.rb:12:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/windows-pr-1.0.9/lib/windows/er ror.rb:12:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/win32-process-0.6.2/lib/win32/p rocess.rb:1:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/win32-process-0.6.2/lib/win32/p rocess.rb:1:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie-proces s.rb:1:in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie-proces s.rb:1:in `<top (required)>' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie.rb:45: in `require' from C:/Ruby191/lib/ruby/gems/1.9.1/gems/watir-1.6.5/lib/watir/ie.rb:45: in `<top (required)>' from gui.rb:2:in `<main>' rubyのバージョンは C:\ruby>ruby -v ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32] です。 One-Click Ruby Installer for Windowsを使用してインストールしました。 watirは以下のURL通りにインストールしました。 gem update --system gem install watir http://www.sixapart.jp/techtalk/2008/06/watir_1.html OSはwindowsXP SP2です。 どなたか本当に助けていただけると感謝でいっぱいの気持ちになります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • rubyでプログラムを作っていますがうまくいきません。

    rubyでプログラムを作っています。 予想通りの動きができないです。 常駐ソフトを起動したり終了したりするプログラムをrubyで作りたいと思っています。 バッチファイルで作れば問題ないのですが、今回のプログラムを他で作っているrubyのプログラムに使いたいからrubyで作りたいんです。 そこでとりあえずrubyでソフトを起動したり終了したりする小さいプログラムを作って試しています。 ですが全然ひらめかないのでぜひご教授をお願いします。 利用環境 Windows XP Home Edition Cygwinをインストールしrubyを実行しています。

  • RubyでWin32APIのCreateWindow

    RubyでWin32APIのCreateWindow 初めまして。RubyでWin32APIを使ってプログラミングをしようとしています。 RubyもWin32APIも勉強を始めて間もないのですが、RubyリファレンスマニュアルのWin32APIのページやグーグル検索などを利用し一通り調べて (test.rb) require 'Win32API' createwindow = Win32API.new('user32', 'CreateWindow', %w(l p l i i i i l l l p), 'l') createwindow.call(0, "HELLO", 0xc00000, 100, 100, 100, 100, 0, 0, 0, nil) としてみました。しかしエラーで、 test.rb:2:in `initialize': GetProcAddress: CreateWindow or CreateWindo wA (RuntimeError) となりました。 rubyのバージョンは ruby 1.8.6 です。 コードのどこが間違っているのか、エラーの意味、参考になるwebサイト(rubyでWin32APIのCGIを扱っているサイト)を教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • XPの頃のWin32APIの本などはまだ役に立つ?

    1999年頃学生でC言語を勉強し平行してC言語だとWindowプログラムが 作るのが大変だったことからVBも少しやりました。 頭が悪かったもので、その後、VC++6.0を使いWindowsプログラミングを 作る以前の段階で挫折し勉強の難しさに悶絶し病んで廃人となりニートをやっていました。 その後、なんとなくプログラミングに未練があり、Windows APIの本を買ったり JAVAの本を読んだりHTMLやVBS、CSSなどを勉強してみたりしましたが 途中でいつも投げ出して中途半端でした。 そして再び、最近、プログラミングの本を読む機会があり、 知り合いの友人に感化されたこともあり、 Rubyを勉強し始めたのですが、 Win32 API? RubyでWindowsプログラミングを作ることに特化した本が200円で売っていたので 2007年の本でしたが購入してみました。 Win32OLEについて解説してありました。 Rubyに関する知識がまだあやふやな部分があり、またCOMやAPIに関する知識も ???なのであまり理解できませんでしたが、 なんとなく雰囲気のさわりのさわりぐらい分かりました。 とりあえず、昔は頭が悪く非常に精神的にも混乱していて よくわからずなんでも取り組もうとしてしまいました。 WEBページなどの処理をするにはHTMLのほかにDOM、CSSなどの知識 Java scriptなどの知識であっているでしょうか? ruby php phython perl などいろいろあるがこれは特性をみて自分がやりたい言葉のようなものなので 母国語を一つマスターすべきということは理解しました。 また、Windowsプログラミングを作るのであれば、 APIやCOMなどの知識があればいいのでしょうか? FLASHやActiveXのように現在お目にかからない仕様もあるのですが、 これらも内包していまでも学ぶ価値はあるのでしょうか? 出来ればでいいのですが、 安く仕入れられるプログラミング書籍でも活用が可能な技術を 教えてください。 教えてくださいと言ってもC言語を覚えればOSだって作れるよとか アセンブラ覚えれば完璧ですとかそういうのは無しで 一般的なバカなおじさんがなんとなプログラミングを作るうえで知っていた方がいい 知識や導入方法、パーツなどを教えてくださいよろしくお願いします。 一応、今、RubyとVBS、CSS,HTMLを勉強しています。 DOMの知識はあまりないです?説明してみろといわれてもあやふやな答えしかできません よろしくお願いします。

  • cygwinでのフャイルやり取り

    学校でcygwinを使ってるんですが、分からないことが多すぎて勉強に追いつけません。C言語は出来るのですが、cygwinの操作に慣れなくて苦戦しています。 そこで質問なんですが、cygwin(vi)でプログラム(C/C++)を作るのがめんどくさいので、先ず最初にwindowsのメモ帳を使ってプログラムを書いた後、cygwin(gcc)でコンパイラさせたいんでけど、テキストファイルが何処にも見当たりません。 というかコマンドラインでのファイル操作が出来ません。 どうやったらwindowsとcygwinでのフャイルのやり取りが出来るのでしょうか? もし誰か知っていたら教えてください お願いします

  • VB.NETでIEを起動してそのIEが後から見ても分かるようにしたい

    VB.NETで IE = CreateObject("InternetExplorer.Application") IE.Navigate("http://www.yahoo.co.jp") のようにしてIEを起動して、 その後通常のように手動でページを移動したり 複数のIEを手動で起動したりした場合に どれがこのプログラムで起動したIEかを ウインドウを見ただけで分かるようにしたいのですが、 何か方法はあるでしょうか? ウィンドウタイトルの文字で HTMLのページタイトルの横のMicrosoft Internet Explorerなどを 自分の自由に設定できればと思うのですが、 そういうことができたら教えて頂きたいです。 よろしくおねがいします。

  • Perl・Python・Rubyのどれがおすすめ?

    小さいプログラムであればコンパイラ言語より簡単に作成できると聞いたので、インタプリタ言語を一つ習得しようと思っているのですが、Perl・Python・Rubyのうちどれを選ぼうか悩んでいます。 私は現在、情報系学科の大学生で、今までにPascal、CASLII、C、Perl、Javaを習いました。どれも課題をこなすために使った程度で、どれも1年以上継続して利用していません。 以下が、それぞれの言語に対する認識です。初心者の意見なので間違っていることが多いかもしれません。 [Perl] -長所 ・一度勉強しているため、勉強し始めやすい。 ・習い始めるにあたり、一番初めに読もうと考えている「初めてのPerl 第5版」の評価が高い。 ・参考となるものが多い。 -短所 ・ソースが見にくいと聞いたことがある。 [Python] -長所 ・Perlより後にできた言語なので、Perlより洗練されてて高機能? ・Perlとは違い、同じことをするプログラムのソースは似ると聞いたことがあり、こっちの方が使い易い? -短所 ・Perl同様、Pythonを始めるなら一番最初に読もうと思う「初めてのPython 第3版」の訳が悪いという噂がある。また、「初めてのPerl」に比べると、ページ数が異常に多い。 Rubyについては聞いたことがある程度でほとんど知りません。 また、コンパイラ言語としてはC#を習得しようかと考えています。 以上から、Perl・Python・Rubyのうちどの言語を習得するのがいいと思いますか?個人的な意見でも構いません。理由を詳しく書いていただけると、選択の参考になるのでありがたいです。 できるだけたくさんの意見が聞きたいので、様々な回答をお願いします。

  • windowsとcygwinのフャイル共用について

    学校でcygwinを使ってるんですが、分からないことが多すぎて勉強に追いつけません。C言語は出来るのですが、cygwinの操作に慣れなくて苦戦しています。 そこで質問なんですが、cygwin(vi)でプログラム(C/C++)を作るのがめんどくさいので、先ず最初にwindowsのメモ帳を使ってプログラムを書いた後、cygwin(gcc)でコンパイラさせたいんでけど、テキストファイルが何処にも見当たりません。 というかコマンドラインでのファイル操作が出来ません。 どうやったらwindowsとcygwinでのフャイルのやり取りが出来るのでしょうか? もし誰か知っていたら教えてください お願いします

  • PHPとかperlとかrubyとか

    質問させていただきます。 プログラミング言語を学ぼうと思っています。 ありがちな質問ですが、言語の特徴などを伺いたいと思います。 PHPはWEBに特化した言語だと聞きました。 あとperlはテキスト処理だけでどうも、、、って話も。 rubyはまだプログラムの話で出てこないことも多い。 やりたいことがあっての言語なのは承知しています。 WEBやデータベース、スタンドアロン?の簡単なソフト開発とか、いろいろやりたいことは多いです。 最初に目をつけた敷居が低いとされるWEBに特化したPHPはソフト開発には向かないらしいし、偏ったものもどうかと思ってます。 でも次の言語にJAVAを考えていて(JAVAは習得が難しいと聞きましたので)、PHPはJAVAに多少似ているってどっかのサイトで見ました。たぶん賛否両論はあるでしょうが。 別にWEBプログラムだからってperlでもrubyでもできるんですよね?だったら偏ったPHPよりperl、rubyの方が書いていて楽しいような気がします。rubyの需要はまだ少なそうですし、perlのテキスト処理だけってのもどうなんだろうと思いますが。そこらへんも聞きたいです。 簡単なゲームとか、顧客管理ソフトとか、WEBとかデータベースとか、できれば敷居が低く楽しめる言語があればと思ってます。

  • bashスクリプトの中の rubyプログラムでシェル変数を参照したい

    Windows XP で Cygwin, ruby を使っています。 bashスクリプトの中の ruby プログラムで シェル変数を参照したいのですが どうしたらよいでしょうか? 例: abc = "qwerty" ruby -e ' #ここでシェル変数 abc を参照したい '