【问题标题】:vb.net click a javascript buttonvb.net 点击一个 javascript 按钮
【发布时间】:2015-05-12 16:14:40
【问题描述】:

我有一个 vb.net Windows 窗体。在表单中,我正在运行 Web 浏览器控件。我正在尝试使用 vb 代码单击按钮。我发现了这个直接调用 js 函数的例子,但我没有运气。 How can I click a js button on VB

按钮的html是-

<input class="boldbutton" type="button" value="Verify"
   onclick="this.form.knob.value='ReqVerify';this.form.verify.value=1;this.form.submit()">

我的vb代码是-

WebBrowser1.Document.InvokeScript(
    "this.form.knob.value='ReqVerify';this.form.verify.value=1;this.form.submit()"
)

我不确定我哪里出错了。按下提交按钮后,网页上会显示一个日志,显示该活动。运行我的脚本时,我没有看到任何活动,只有当我从另一个浏览器(不是 Windows 窗体中的那个)手动按下按钮时。

【问题讨论】:

  • 为什么要从 Windows 窗体 应用程序调用 Web 浏览器控件?两者都是不同的平台。
  • 我的表单对访问数据库执行查询。它提取结果并将它们存储为变量。它使用变量打开正确的网页。打开网页后,应单击验证按钮。

标签: javascript html vb.net forms


【解决方案1】:

进口系统 导入 System.Data 导入 System.Data.OleDb

公开课表1 Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\VulnScanData.accdb;Persist Security Info=True;Jet OLEDB:Database Password=************ **")

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'opens connection to database
    con.Open()
    WebBrowser1.Navigate("https://fs-enterprise.my.private.url/")
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BtnLogin.Click
    WebBrowser1.Document.GetElementById("name").SetAttribute("value", TextBox1.Text)
    WebBrowser1.Document.GetElementById("password").SetAttribute("value", TextBox2.Text)
    WebBrowser1.Document.GetElementById("Logon").InvokeMember("click")
End Sub

Private Sub BtnQuery_Click(sender As Object, e As EventArgs) Handles BtnQuery.Click
    'open transaction object
    Dim trans As OleDb.OleDbTransaction
    trans = con.BeginTransaction
    'define the command which allows you to read, write or update the db
    Dim cmd As New OleDb.OleDbCommand
    'define the query        
    cmd.CommandText = "SELECT [Ticket ID] AS Ticket_ID FROM [Table_Main] WHERE ([Ticket Days OverDue] >= 1)"
    'assign the connection
    cmd.Connection = con
    'assign the transaction
    cmd.Transaction = trans
    'execte the command
    Dim myreader As OleDb.OleDbDataReader
    myreader = cmd.ExecuteReader
    Do While myreader.Read
        MsgBox(myreader.Item("Ticket_ID"))
        Dim result As String = myreader.Item("Ticket_ID")
        WebBrowser1.Navigate("https://fs-enterprise.my.private.url/remediation/ticket.exp?ticket=" & result)
        Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
            Application.DoEvents()
        Loop
        '<input class="boldbutton" type="button" value="Verify" onclick="this.form.knob.value='ReqVerify';this.form.verify.value=1;this.form.submit()"></td>
        'WebBrowser1.Document.InvokeScript("document.forms(0).knob.value='ReqVerify';document.forms(0).verify.value=1;document.forms(0).submit()")
        WebBrowser1.Document.InvokeScript("this.form.knob.value='ReqVerify';this.form.verify.value=1;this.form.submit()")
        MessageBox.Show("Submitting Ticket")
    Loop
    myreader.Close()
    con.Close()
End Sub

结束类

【讨论】:

    【解决方案2】:

    您的问题是您的 vb.net 的 javascript 调用没有 this 的参考点。当您在 Web 浏览器中单击按钮时,this 指的是该按钮。

    当你调用WebBrowser1.Document.InvokeScript this 指的是全局的东西,也许是窗口?

    无论哪种方式,您都可以调用按钮单击。通过向按钮添加 id(例如 btnSubmit)来执行此操作。然后做:

    Dim search As HtmlElement = webBrowser1.Document.GetElementById("btnSubmit")     
    If search IsNot Nothing Then        
          For Each ele as HtmlElement in search.Parent.Children
              If ele.TagName.ToLower() = "input" AndAlso ele.Id.ToLower() = "btnSubmit" Then                
                  ele.InvokeMember("click")
                  Exit For
              End If
          Next
      End If
    

    取自(c#):https://stackoverflow.com/a/5227644/1160796

    另一种选择是修复您的 javascript 代码。通过将this.form 更改为表单的ID 来做到这一点。同样,如果没有 id 则设置一个,例如 frmMain。然后做:

    WebBrowser1.Document.InvokeScript("frmMain.knob.value='ReqVerify';frmMain.verify.value=1;frmMain.submit()")
    

    如果您无法更改网站来源,请使用document.forms。假设它是唯一的形式:

    WebBrowser1.Document.InvokeScript("document.forms(0).knob.value='ReqVerify';document.forms(0).verify.value=1;document.forms(0).submit()")
    

    【讨论】:

    • 通过 id 获取元素不需要查看 id 标签吗?我没有在页面上看到该元素。我看到 type="" 和 value="" 但没有看到 id。我是不是误会了什么?
    • @JeremyTourville 我的印象是您创建了与之交互的网站。我的错。
    • @JeremyTourville 有 3 种方法。你试过document.forms(0)...的方式吗?
    • 我尝试了 document.forms(0) 和 frmMain 方法。当我尝试通过 id 方法获取元素时,出现错误 - “表达式预期”在行 -If ele.TagName.ToLower() == "input" AndAlso ele.Id.ToLower() == "btnSubmit" 然后我确实将我的代码作为答案发布在上面,以便您可以看到它。一切正常,但单击按钮。
    • 是的,这是将 c# 转换为 vb 代码时的拼写错误。 == 在 vb.net 中无效。必须是=
    【解决方案3】:

    我能够让它工作。这是我的代码

    For Each el As HtmlElement In WebBrowser1.Document.GetElementsByTagName("INPUT")
                If (el.GetAttribute("value").Equals("Verify")) Then
                    el.InvokeMember("click")
                End If
            Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多