• 締切済み

WSH(JScript)既に開いているIEのビジー

.run で起動させた物がIEである場合、 そのIEの .busy や .readyState を取得したいと考えています。 たとえば以下の様な感じです。 var shApp = WScript.CreateObject("Shell.Application"); var iehandle; // 起動されてなければ実行する if(launchflag == 0){ var objSh = WScript.CreateObject("WScript.Shell"); objSh.Run("実行するとIEが起動するVBS等"); } //////// Aの地点 /////////////// // 対象ウィンドウが無いか探す for(i= 0; i< shApp.Windows().Count; i++){ // ここで対象のIEが見つればTrue if(shApp.Windows().item(i).FullName.match(/iexplore.exe$/i) && shApp.Windows().item(i).document.title.match(/対象のIEタイトル/i)){ iehandle = i; break; } } while(shApp.Windows().item(iehandle).document.readyState == "complete"){WScript.Sleep(100);} // 起動したのを確認してすぐ次の処理へ この例だとAの地点(その↓のif文の判定)で原因不明のエラーがでます。 ただ、WScript.Sleep(2000);などを入れて待機すると問題無く動作するので IEが起動しきる前に参照しようとしてエラーになっているのではないかと思われます。 どの様にするべきでしょうか?

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

「VBScript」ですが、私が以前、いろいろ調べて Set i = CreateObject("InternetExplorer.Application") Set w = CreateObject("WScript.Shell") i.Visible = True i.FullScreen = True i.Navigate "https://www.google.co.jp" Do While i.Busy = True Or i.readyState <> 4 Loop w.AppActivate i.LocationName WScript.Sleep(10000) i.Document.getElementsByName("q")(0).Value = "ABC" WScript.Sleep(2000) i.Document.all("btnG").Click WScript.Sleep(10000) i.Quit w.Run "Shutdown.exe -s -t 00" Set w = Nothing Set i = Nothing というのを組みました。 自分自身、よく分かっていないのですが、 Do While i.Busy = True Or i.readyState <> 4 Loop が、「Busy」の処理だと思われます。

popepon
質問者

お礼

ご回答ありがとうございます。 回答者さんのコードはIEオブジェクトによるBusy取得になりますので 申し上げ難いですが質問には該当しません。 今回の件に関しては HTMLソースの取得が早すぎる為起きたものと思われます

関連するQ&A

  • VBS(WSH)で開いたIEのウィンドウがアクティブにならない

    VBSでタイトルバーのみのIEウィンドウを開き、 SendKeyでtestと入力するスクリプトを作成しています。 ですが、開いたIEのウィンドウがアクティブにならず、 SendKeyがIEに送信されません。 VBSについては全くの初心者でして、ウィンドウがアクティブにならないのが 環境の問題なのか、プログラムの問題なのか判断できません。 どなたかご教授をお願いします。 IEのバージョンは8、OSはWinXPです。 以下、ソースです。 -------------------------------------------------- 'タイトルバーのみのIEを起動する Set WshShell = WScript.CreateObject("WScript.Shell") Set objIE = WScript.CreateObject("InternetExplorer.Application") objIE.Navigate("http://www.google.co.jp/") objIE.MenuBar = False objIE.StatusBar = False objIE.ToolBar = False objIE.AddressBar = False objIE.Visible = True '表示待ちループ Do While objIE.Busy WScript.Sleep 100 Loop '[test]で検索 WshShell.SendKeys("test") WScript.Sleep(100) WshShell.SendKeys("{TAB}") WScript.Sleep(100) WshShell.SendKeys("{ENTER}") --------------------------------------------------

  • WSH動作しない!!(WScript.SleepとSendKeys?)

    WSHが動作しなくて困っています。 動作するコードとしないコードは次のとおりです。 いずれも@ITに掲載されているサンプルコードをそのままです。 動作しないコードについても,notepadの起動まではできます。 どうやら,sleepとsendkeysが動いてくれないようです。 <正常に動作するコード> Set objShell = WScript.CreateObject("WScript.Shell") WScript.Echo "メモ帳を起動します。" objShell.Run "notepad.exe" http://www.atmarkit.co.jp/fwin2k/operation/wsh03/wsh03_02.html <動作しないコード> Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "notepad.exe" WScript.Sleep 1000 objShell.SendKeys "hello" http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_04.html ■動作環境 Win XP Pro IE 6.0 ちなみに,WSHファイルに対する実行権限はあります(フルコントロールです)。 以上なのですが,何か点検するべき事項などありましたらご教示ください。

  • Windows 7 でのWSH の挙動

    お世話になります。 msdnにある「電卓をアクティブにするサンプルを Vistaで実行すると、電卓がアクティブになり、 計算結果を吐き出しますが、 Windows7(Pro,SP1)で実行すると 最前面に電卓が出るものの アクティブになっていない上に、 複数の電卓がどんどん立ち上がってきます。 Vistaと7で、プロセス(?)の管理が 変わっているのだと思います。 7でも電卓をアクティブにするには、 どうすればいいのでしょうか? 以下コードです。 ================================================ set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "calc" WScript.Sleep 100 WshShell.AppActivate "Calculator" WScript.Sleep 100 WshShell.SendKeys "1{+}" WScript.Sleep 500 WshShell.SendKeys "2" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 500 WshShell.SendKeys "*3" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 2500 ================================================

  • WSH オブジェクト作成時の違い

    JScriptです。 var obj = WScript.CreateObject("WScript.Shell"); と var obj = new ActiveXObject("WScript.Shell"); 等で振る舞いが変わってくる事はあるでしょうか? またどちらを使うべきでしょうか?

  • HTMLにWSHを組み込む

    HTMLにWSHのコードを書く事は可能ですか? たとえば、ページ開くとNotePad.EXEが起動するようにしたいのですが 以下のような書き方をすると WScriptが宣言されていません。 とエラーになります。 <HTML> <HEAD> <TITLE>起動のテスト</TITLE> </HEAD> <meta http-equiv="Content-Script-Type" content="text/JavaScript"> <BODY> <SCRIPT LANGUAGE="JavaScript"> var title = "メモ帳"; var wsh = WScript.CreateObject("WScript.Shell"); wsh.Run( "NotePad.EXE" ); </SCRIPT> </BODY> </HTML> いい案がある方教えてください。

    • ベストアンサー
    • HTML
  • jscriptの質問

    拡張子が「js」のファイルでWshShell.Runでサーバにアクセスできません。 var WshShell= new ActiveXObject("WScript.Shell"); WshShell.Run("runas /user:ドメイン名\\administrator \\サーバ名\Adobe Reader9をサイレントインストールする.bat"); while(!WshShell.AppActivate("runas.exe")){ WScript.Sleep(100); } ・ ・ ・ WshShell.Run("runas /user:ドメイン名\\administrator \\サーバ名… を WshShell.Run("runas /user:ドメイン名\\administrator cmd にすると上手くいきました。 たぶん、「\\サーバ名」の「\」の部分がうまくいってないような気がします どなたかご教授お願いします。

  • WSHスクリプトでブラウザ更新

    教えてください。 WSHスクリプトでブラウザの更新をF5ではなくてControl + Rしたいのです。 Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 2000 WshShell.AppActivate "テスト" WScript.Sleep 2000 WshShell.SendKeys "^R" WScript.Sleep 2000 WScript.Echo "終了" 最初の一回目の実行時はできるのですが、それ以降更新してくれません。 よろしくお願いいたします。

  • なぜmatchメソッドがエラーになる?

    こんばんは。 下記スクリプトですが、「★★★」の個所で「オブジェクトでサポートされていないプロパティまたはメソッドです。」となってしまいます。なぜでしょうか?また、回避するにはどうしたらいいでしょうか? やりたいことは、"rd"を含むURLだけリストしないのです。 -- var IE = WScript.CreateObject("InternetExplorer.Application"); var URL = "http://www.yahoo.co.jp"; IE.Navigate(URL); WaitLoad(); var fs = WScript.CreateObject("Scripting.FileSystemObject"); var stream = fs.CreateTextFile("yahoo.txt"); var objTagsAs = IE.Document.all.tags("A"); for (i = 0; i < objTagsAs.length; i++) if (objTagsAs[i].match(/rd/i) != -1) //★★★ stream.Write(objTagsAs[i] + "," + objTagsAs[i].innerText + "\r\n"); stream.Close(); function WaitLoad() { var stat, dstart; stat = 0; while(true) if(stat == 0) { if(!IE.Busy) if(IE.Document.readyState == "complete") { dstart = (new Date()).getTime(); stat = 1; } } else { if(!IE.Busy && IE.Document.readyState == "complete") { if((new Date()).getTime() >= dstart + 3000) break; } else stat = 0; } }

  • JavaScript初心者です

    今、あるページに自動でログインした後で、特定のページまで移動する、という仕掛けを 作っています。ソースはこんなんです。 ------ここから----- main(); function main() { var ie = WScript.CreateObject("InternetExplorer.Application"); ie.visible = true; ie.navigate("URL"); while( (ie.Busy) || (ie.readystate != 4) ) { WScript.Sleep(100); } // ユーザID ie.document.getElementById("email").value = "メールアドレス"; // パスワード ie.document.getElementsByName("password").item(0).value = "パスワード"; ie.document.getElementsByName("menu_btn").value = "ログインページ"; ie.document.getElementsByTagName("form").item(0).submit(); while( (ie.Busy) || (ie.readystate != 4) ) { WScript.Sleep(100); } } var location; location.href = "移動先"; -----ここまで----- ログインは無事にできるのですが、そこのリンクを踏んで特定のページまで行くように location.hrefで指定してるのに飛ぶことができません。何がおかしいのでしょうか?

  • VBScriptで、既に開いているIEを画面の最前面に表示させる

    VBScriptで、既に開いているIEを画面の最前面に表示させる OS:WindowsXP SP3 ブラウザ:InternetExplorer6 期待している機能としましては、IEが開いていない場合は新規にIEを立ち上げ、既に開いている場合は、それを画面の最前面に表示させる(最小化されている場合はそれを解除する)といった感じです。 教えて頂きたいのは、IEを画面の最前面に表示させる方法(最小化の場合はそれを解除)です。 現状のソースを記載します。おかしな点がありましたらご指摘よろしくお願い致します。 Dim objShell Dim objWindow Dim objIE Dim ieFlag ieFlag = False '開いているウィンドウからIEを検索 Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows If TypeName(objWindow.Document) = "HTMLDocument" Then ieFlag = True Set objIE = objWindow Exit For End If Next 'IEが開いていたらそれを画面の最前面に、そうでないなら新規で開く If ieFlag = True Then 'IEを画面の最前面に又は、最小化解除 Else '新規にIEを開く Set WshShell=Wscript.CreateObject("Wscript.Shell") WshShell.Run("http://www.google.co.jp/") WScript.Sleep(4000) End If