【问题标题】:is there a better way to do this有一个更好的方法吗
【发布时间】:2011-05-31 21:18:15
【问题描述】:

所以我在 vb.net 中有一个循环加载网页,填写表格并点击提交

我目前分别用于等待网页加载、填写表单和点击提交

   Do While Not browser.ReadyState = WebBrowserReadyState.Complete

            System.Windows.Forms.Application.DoEvents()
        Loop

        browser.Document.GetElementById("text").SetAttribute("value", message)

  For Each element As HtmlElement In browser.Document.GetElementsByTagName("input")


        If element.GetAttribute("type") = "submit" Then

            element.InvokeMember("click")

        End If
    Next

但我的问题是,在循环运行大约第五次之后,它会在带有 set 属性的行上出错。而且我有一种感觉,它在尝试填写表单之前没有等待网页加载,这就是它出错的原因。

有人知道更好的方法吗?

【问题讨论】:

  • System.NullReferenceException 未处理
  • 你不能使用DocumentComplete事件吗?

标签: vb.net browser loops webforms setattribute


【解决方案1】:

您可以使用 DocumentCompleted 事件,此事件可确保您的文档准备就绪,并加载所有必需的部分

Private Sub browser_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles browser.DocumentCompleted
    ' YOUR FORM FILLING CODE HERE


End Sub

对于表单提交,您可以使用这样的表单的 submit() 方法

browser.Document.GetElementById("text").DOMElement.form.submit()

【讨论】:

  • 我能看到的唯一问题是,当我点击提交时,它会加载一个新页面,所以在它点击提交后,它不会重新运行这个子目录中的内容和错误,因为没有表格可以填写?
  • 您可以在设置值之前检查browser.Document.GetElementById("text") IsNot Nothing。但我会在 DocumentCompleted 事件中使用我的 fom 填充代码来确保页面被完全加载
【解决方案2】:

可能元素“文本”尚未加载或不在页面上?

您可以制作一些 javascript 来完成该任务,并将其注入页面。

以下是如何在 javascript 中进行“点击”: https://developer.mozilla.org/en/DOM/document.createEvent

【讨论】:

  • 我知道页面的“文本”部分没有加载,这就是给我的错误,我该如何解决这个问题。
  • 它应该注册一个负载处理程序,而不是寻找条件的无限循环,在 vb 中它看起来被称为 DocumentCompleted,请参见上面的另一个答案。
猜你喜欢
  • 2013-05-03
  • 2011-06-30
  • 2021-01-03
  • 2023-01-31
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多