VB.NET WebBrowser控件在更改用户代理后以编程方式填充表单(对象引用未设置为对象的实例。)

VB.NET WebBrowser控件在更改用户代理后以编程方式填充表单(对象引用未设置为对象的实例。),vb.net,user-agent,Vb.net,User Agent,我正在进行一个项目,我有一个WebBrowser控件,需要设置一个自定义用户代理,然后转到Google并填写搜索框,单击搜索按钮,然后单击搜索结果中的链接。不幸的是,我不能使用HTTPWebRequest,它必须通过WebBrowser控件来完成 在我添加代码来更改用户代理之前,一切正常。以下是我的代码: 导入System.Runtime.InteropServices 公开课表格1 _ 私有共享函数UrlMkSetSessionOption(dwOption为整数,pBuffer为字符串,dw

我正在进行一个项目,我有一个WebBrowser控件,需要设置一个自定义用户代理,然后转到Google并填写搜索框,单击搜索按钮,然后单击搜索结果中的链接。不幸的是,我不能使用HTTPWebRequest,它必须通过WebBrowser控件来完成

在我添加代码来更改用户代理之前,一切正常。以下是我的代码:

导入System.Runtime.InteropServices
公开课表格1
_
私有共享函数UrlMkSetSessionOption(dwOption为整数,pBuffer为字符串,dwBufferLength为整数,dwReserved为整数)为整数
端函数
Const URLMON_OPTION_USERAGENT作为整数=&H10000001
公共子ChangeUserAgent(代理为字符串)
UrlMkSetSessionOption(URLMON_OPTION_USERAGENT,Agent,Agent.Length,0)
端接头
私有子btnGo_Click(发送者作为对象,e作为事件参数)处理btnGo。单击
ChangeUserAgent(“假用户代理”)
wb.导航(“http://www.google.com“,”“self”,无,“用户代理:假用户代理”)
端接头
私有子wb_DocumentCompleted(ByVal sender作为对象,ByVal e作为WebBrowserDocumentCompletedEventArgs)处理wb.DocumentCompleted
作为字符串的Dim源=wb.Document.Body.OuterHtml
Dim Uri作为字符串=wb.Document.Url.AbsoluteUri
如果Uri=”http://www.google.com/”“那么
wb.Document.GetElementById(“lst ib”).SetAttribute(“值”、“浏览器信息”)
wb.Document.All(“btnK”).InvokeMember(“单击”)
如果结束
如果Uri.Contains(“http://www.google.com/search?)那么
将文档变暗=wb.Document.All
作为文档中的HtmlElement的每个CUREElement
Dim ctrlIdentity=CureElement.GetAttribute(“innerText”).ToString
如果Ctlidentity=“BROWSER-INFO”,则
curElement.InvokeMember(“单击”)
如果结束
下一个
如果结束
端接头
末级
问题在于以下代码:

我认为问题可能是页面没有被完全加载(帧问题),但我将有问题的代码放入计时器中进行测试,并得到了相同的错误。任何帮助都将不胜感激。

您是否意识到
.All(“btnK”)
会返回一个集合?因此,您正在对集合执行
.InvokeMember(“单击”)
)。您不能这样做,因为显而易见的原因,您只能对元素执行
.InvokeMember(“单击”)

试试这个:

wb.Document.All("btnK").Item(0).InvokeMember("click")
.Item(0)
返回由
.All(“btnK”)
返回的集合中的第一个元素,并且由于可能只返回一个项目,因为页面上只有一个项目,所以您希望对第一个项目执行InvokeMember,即
.Item(0)

请问您正在开发什么


由于您是新用户,如果这回答了您的问题,请进行投票和/或接受。

以下哪一行产生了错误?“btnK”是元素的名称还是id?它是什么类型的元素?@AndyG两行都会产生相同的错误。正如我之前所说,在我添加代码来更改用户代理之前,他们已经工作了。第一行是用ID lst ib和文本“browser info”填充文本字段,第二行是单击名为btnK的按钮。我不知道当你说它是什么样的元素时你在问什么。按钮代码是。当你写Q的时候,你需要更清楚,否则人们不会帮助你。我们无法想象“两者都会造成错误”是什么意思,因为您永远不会同时发生两个异常。那么,你的意思是如果你交换代码行,或者如果你漏掉一行?我理解你们的意思,因为在这个例子中你们可以省略一个,但我必须去google.com检查那个些字段上的元素才能理解。我们用户需要做的调查工作越少,你得到答案的可能性就越大,明白吗?欢迎来到这个网站,UV'd!
wb.Document.All("btnK").Item(0).InvokeMember("click")