簡體   English   中英

更改用戶代理后,VB.NET WebBrowser控件以編程方式填寫表單(對象引用未設置為對象的實例。)

[英]VB.NET WebBrowser Control Programmatically Filling Form After Changing User-Agent (Object reference not set to an instance of an object.)

我正在一個項目中,我有一個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")

我以為問題可能是頁面未完全加載(框架問題),但是我將有問題的代碼放在計時器中進行測試,並得到相同的錯誤。 任何幫助將非常感激。

您是否意識到.All("btnK")返回一個集合? 因此,您正在對Collection :)進行.InvokeMember("click") 您不能這樣做,只能出於明顯的原因對元素執行.InvokeMember("click")

嘗試這個:

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

.Item(0)返回由.All("btnK")返回的集合中的第一個元素,並且由於可能僅返回一個項目,因為頁面上只有一個,所以您想對InvokeMember進行操作第一項是.Item(0)

請問您正在開發什么?

由於您是新用戶,因此請投票並/或接受,如果這回答了您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM