1

カスタム ユーザー エージェントを設定する必要がある WebBrowser コントロールがあるプロジェクトに取り組んでおり、Google に移動して検索ボックスに入力し、検索ボタンをクリックして、検索結果からリンクをクリックします。残念ながら、私は HTTPWebRequest を使用できません。WebBrowser コントロールで行う必要があります。

ユーザー エージェントを変更するコードを追加する前は、すべて正常に機能していました。私が持っているコードは次のとおりです。

Imports System.Runtime.InteropServices

Public Class Form1

<DllImport("urlmon.dll", CharSet:=CharSet.Ansi)> _
Private Shared Function UrlMkSetSessionOption(dwOption As Integer, pBuffer As String, dwBufferLength As Integer, dwReserved As Integer) As Integer
End Function
Const URLMON_OPTION_USERAGENT As Integer = &H10000001

Public Sub ChangeUserAgent(Agent As String)
    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, Agent, Agent.Length, 0)
End Sub

Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click
    ChangeUserAgent("Fake User-Agent")
    wb.Navigate("http://www.google.com", "_self", Nothing, "User-Agent: Fake User-Agent")
End Sub

Private Sub wb_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted
    Dim Source As String = wb.Document.Body.OuterHtml
    Dim Uri As String = wb.Document.Url.AbsoluteUri
    If Uri = "http://www.google.com/" Then

        wb.Document.GetElementById("lst-ib").SetAttribute("value", "browser info")
        wb.Document.All("btnK").InvokeMember("click")

    End If
    If Uri.Contains("http://www.google.com/search?") Then
        Dim TheDocument = wb.Document.All
        For Each curElement As HtmlElement In TheDocument
            Dim ctrlIdentity = curElement.GetAttribute("innerText").ToString
            If ctrlIdentity = "BROWSER-INFO" Then
                curElement.InvokeMember("click")
            End If
        Next
    End If

End Sub

End Class

問題は次のコードにあります。

wb.Document.GetElementById("lst-ib").SetAttribute("value", "browser info")
wb.Document.All("btnK").InvokeMember("click")

問題は、ページが完全に読み込まれていないこと (フレームの問題) かもしれないと思っていましたが、問題のあるコードをタイマーに入れてテストしたところ、同じエラーが発生しました。どんな助けでも大歓迎です。

4

1 に答える 1

0

.All("btnK")コレクションを返すことを理解していますか? だから、あなたは.InvokeMember("click")コレクションでやっています:)。それはできません.InvokeMember("click")。明らかな理由から、要素に対してのみ実行できます。

これを試して:

wb.Document.All("btnK").Item(0).InvokeMember("click")

.Item(0)は、 によって返されたコレクションの最初の要素を返します。返さ.All("btnK")れるアイテムはおそらく 1 つだけです。ページには 1 つしかないため、最初のアイテムで InvokeMember を実行する必要があります.Item(0)

何を開発しているのかお聞きしてもよろしいですか?

あなたは新しいユーザーなので、これがあなたの質問に答えた場合は、賛成票を投じるか、承認してください。

于 2013-07-28T11:37:32.227 に答える