WebBrowserでFRAME内のInputを操作するには

解決


だい2  2004-07-22 11:16:17  No: 84707  IP: [192.*.*.*]

お世話になっています。
WebBrouserでFrame分割されているページを読み込んで、
FrameB内にあるInput(例えばNAME='TEXT1')に
入力内容(例えば「1234」)をセットする方法は
あるでしょうか?
ちなみに、Frame分割されていないページ
では以下のように制御しています。

DIM OBJ AS Variant
Dim OBJDocument as HTMLDocument
Set OBJDocument = Main.WebBrowser1.Document
Set OBJ = OBJDocument.getElementsByName("TEXT1").Item
If OBJ.Name = "TEXT1" Then
   OBJ.Value = "1234"
End If

です。

上記のような制御をFRAME分割されているページ
にもできるでしょうか?

よろしくお願いいたします。

編集 削除
だい  URL  2004-07-22 13:52:48  No: 84708  IP: [192.*.*.*]

Set OBJDocument = Main.WebBrowser1.Document.frames("FrameB").Document
Set OBJ = OBJDocument.getElementsByName("TEXT1").Item
If OBJ.Name = "TEXT1" Then
   OBJ.Value = "1234"
End If
だとどうでしょうか(未確認)?

編集 削除
だい2  2004-07-22 14:44:55  No: 84709  IP: [192.*.*.*]

だいさんありがとうございます。
自分で作ったテスト用のページでは、上記ロジックで
うまいこといきました。
しかし、制御したい外部のページで、実行してみると
アクセスが拒否されました。とのエラーになりました。

これって、どうしようもないんですかね?
セキュリティが掛かっているのでしょうか。

編集 削除
魔界の仮面弁士  2004-07-22 15:33:27  No: 84710  IP: [192.*.*.*]

各フレームのドメインを確認してみてください。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200401/04010002.txt
http://support.microsoft.com/default.aspx?scid=kb;ja;167796

編集 削除
さん  2004-07-22 15:38:57  No: 84711  IP: [192.*.*.*]

アクセスが拒否されましたとなるのはまだそのフレームのドキュメントを
読み込んでいないためにおこるのだと私は考えています。
全てのドキュメントが完了したというのを知る方法があれば、その時点で
framesコレクションでフレームを参照すればうまくいくと思いますが、
全てのドキュメントが完了したというのをどうやって知るかがわかりません
ですので、あまりいい解決方法ではないですが、
私の場合、DocumentCompleteイベントで処理を書いております。
ですので、このイベントが発生してもし、エラーが発生した場合は、
このフレームが読み込まれていないということで処理を行わないように
On Error ステートメントで終了するようにしています。
On Error GOTO EXT
Set OBJDocument = Main.WebBrowser1.Document.frames("FrameB").Document

編集 削除
だい2  2004-07-23 10:52:08  No: 84712  IP: [192.*.*.*]

お世話になります。
ドメインは同じだったんですけど、
操作したいフレームのURLはhttpsでした。

これは、やはりIEの制限に引っかかるんでしょうね?

編集 削除
魔界の仮面弁士  2004-07-23 11:10:13  No: 84713  IP: [192.*.*.*]

> 操作したいフレームのURLはhttpsでした。
「フレームセット」を持つURLはhttpsで、
その中に表示されるURLについては、httpだという事ですか?
それとも、全てのURLがhttpsなのでしょうか?

編集 削除
コンボ  2004-07-23 13:39:52  No: 84714  IP: [192.*.*.*]

Dim objInput as Object

Set objInput WebBrowser.Document.frames(0).Document.getElementsByTagName("INPUT")
Text1.Text=objInput(0).Value

とすれば取得できます。

編集 削除
だい2  2004-07-23 13:47:10  No: 84715  IP: [192.*.*.*]

魔界の仮面弁士さん、
言葉が足りなくてスミマセン。
フレームセットとフレーム1、フレーム2はhttpで、
フレーム3が、httpsです。
値を入れたいInputがあるフレームはフレーム3です。

コンボさんありがとうございます。
しかし、値を取得するのではなく、セットしたいです。
上記コードでは「アクセスを拒否されました」エラーが発生してしまいます。

編集 削除
コンボ  2004-07-23 14:12:27  No: 84716  IP: [192.*.*.*]

httpsでも同様のやり方でいいのですが、まずframes.lengthでフレームの個数を確認してみてはどうですか?複数のフレームが1つのフレームの集合体であることも考えられます。その場合は、frames(1).frames(0)のような形になります。あとは、
Me.Caption=WebBrowser.Document.frames(0).Document.location.hrefとしてフレームのURLを調べてみましょう。

編集 削除
魔界の仮面弁士  2004-07-23 14:57:59  No: 84717  IP: [192.*.*.*]

> フレームセットとフレーム1、フレーム2はhttpで、
> フレーム3が、httpsです。
> 値を入れたいInputがあるフレームはフレーム3です。

それだと、別ドメインと同じ扱いになりますよ。


例えば、一番外側にあるHTMLが、

<frameset cols="50%,*">
  <frame src="http://○○○/frame1.htm" name="frame1">
  <frameset rows="50%,*">
    <frame src="http://○○○/frame1.htm" name="frame2">
    <frame src="https://○○○/frame1.htm" name="frame3">
  </frameset>
  <noframes></noframes>
</frameset>

のようになっていたとします。ドメインは全く同一です。


もし、上記フレームセットのURLが、「http://○○○/F.htm」だったとすると、
Frame1 と Frame2 は操作できますが、Frame3は操作できない事になります。


あるいは、フレームセットのURLが、「https://○○○/F.htm」だったとすると、
Frame1 と Frame2 が操作できませんが、Frame3は操作可能です。


> しかし、値を取得するのではなく、セットしたいです。
取得でも設定でも、状況は一緒です。
別ドメインの場合、殆どのプロパティやメソッドへのアクセスが禁止されます。

もし、フレームを組む必要が無ければ、フレーム3の内容だけを
WebBrowserに表示させるようにしてみては如何でしょうか?

編集 削除
だい2  2004-07-23 16:09:44  No: 84718  IP: [192.*.*.*]

そうですか。
魔界の仮面弁士さんのおっしゃるとうりのページ構成になっています。

今回はあきらめます。

魔界の仮面弁士さん、だいさん、さんさん、コンボさん、いろいろとありがとう
ございました。

また、よろしくお願いします。

編集 削除