使用 VBA 提交 JavaScript 表单
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16287070/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using VBA to submit a javascript form
提问by user2333507
I am writing a program to fill in a form on a webpage and then submit it. However, I can't get the form to submit.
我正在编写一个程序来填写网页上的表格,然后提交。但是,我无法提交表单。
I have included a link to the website.
我已经包含了一个指向该网站的链接。
The button is called 'Get Instant Quotes' but I can't seem to be able to reference it at all.
该按钮称为“获取即时报价”,但我似乎根本无法引用它。
My code so far
到目前为止我的代码
Application.Calculation = xlCalculationAutomatic
'Determine Number of Quotes
If Range("Start").Offset(2, 0) = "" Then
TotalQuotes = 1
Else
TotalQuotes = Range("Start").End(xlDown).Row - 4
End If
i = 4
T = i - 3
Application.StatusBar = "Getting Quote " & T & " out of " & TotalQuotes
Do Until Worksheets("Front").Cells(i, 1) = ""
Website = Worksheets("Front").Range("A1")
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate Website
IE.Visible = True
While IE.Busy
DoEvents 'wait until IE is done loading page.
Wend
While IE.readyState <> 4
DoEvents
Wend
'Type of Product
'Life Only
Worksheets("Front").Select
If Mid(Cells(i, 2), 2, 1) = "T" Then
CIC_IND = 0
CIC_Type = "guaranteed"
Else
CIC_IND = 1
CIC_Type = Cells(i, 7)
If CIC_Type = "G" Then
CIC_Type = "guaranteed"
Else
CIC_Type = "(reviewabl"
End If
IE.Document.getElementById("IncludeCriticalIllnessPolicyYes").Click
End If
'Name
IE.Document.getElementById("strFirstName").Value = "Andy Williams"
'Address
IE.Document.getElementById("address").Value = "10 Jones Street"
'City
IE.Document.getElementById("city").Value = "leicester"
'Post Code
IE.Document.getElementById("strPostcode").Value = "LE1 2GH"
'Phone Number
IE.Document.getElementById("strPhoneNumber").Value = "01245337235"
'Email
IE.Document.getElementById("strEmail").Value = "[email protected]"
'Single or Joint
If Left(Cells(i, 3), 1) = "J" Then
IE.Document.getElementById("strData3").Value = "YOU_PARTNER"
Else
IE.Document.getElementById("strData3").Value = "YOU"
End If
'Level or Decreasing
If Left(Cells(i, 2), 1) = "D" Then
IE.Document.getElementById("strData4").Value = "MORTGAGE_PROTECTION"
Else
IE.Document.getElementById("strData4").Value = "PL_COVER"
End If
'Sum Assured
SumAssured = Worksheets("Front").Cells(i, 6)
IE.Document.getElementById("strData2").Value = SumAssured
'Policy Term
Policy_Term = Worksheets("Front").Cells(i, 5)
IE.Document.getElementById("strData5").Value = Policy_Term
'Date of Birth
DOB_Year = Right(Cells(2, 1), 4) - Cells(i, 4)
DOB_Month = Mid(Cells(2, 1), 4, 2)
DOB_Day = Left(Cells(2, 1), 2)
IE.Document.getElementById("strDOBDay").Value = DOB_Day
IE.Document.getElementById("strDOBMonth").Value = DOB_Month
IE.Document.getElementById("strDOBYear").Value = DOB_Year
'Gender
IE.Document.getElementById("strGender").Value = "MALE"
'Smoker Status
If Right(Cells(i, 3), 1) = "M" Then
IE.Document.getElementById("StrSmoker").Value = "YES"
Else
IE.Document.getElementById("StrSmoker").Value = "NO"
End If
'If Left(Cells(i, 3), 1) = "J" Then
' Joint_Ind = 1
' IE.document.GetElementById("SecondApplicantTitle").Value = "2"
' IE.document.GetElementById("SecondApplicantForename").Value = "Andrea"
'IE.document.GetElementById("secondApplicantSurname").Value = "Williams"
'Date of Birth
'DOB_Year = Right(Cells(2, 1), 4) - Cells(i, 4)
'DOB_Month = Mid(Cells(2, 1), 4, 2)
' DOB_Month = 3
' DOB_Day = Left(Cells(2, 1), 2)
' DOB = DOB_Day & "/" & DOB_Month & "/" & DOB_Year
' IE.document.GetElementById("SecondApplicantDateOfBirth").Value = DOB
'Smoker Status
'If Right(Cells(i, 3), 1) = "M" Then
' IE.document.GetElementById("SecondApplicantSmokerYes").Click
'Else
' IE.document.GetElementById("SecondApplicantSmokerNo").Click
'End If
'Else
' Joint_Ind = 0
'End If
回答by ron tornambe
Since IE supports getELementsByClassName, you can reference the anchor element (Get Instant Quotes) as follows (and should be able to click it - although I haven't tried it):
由于 IE 支持 getELementsByClassName,您可以按如下方式引用锚元素(获取即时报价)(并且应该可以单击它 - 虽然我还没有尝试过):
IE.Document.getElementsByClassName('button orange getQuotes large')[0].Click
Let me know if this works. If not, I'll setup a test site and we can take it from there.
让我知道这个是否奏效。如果没有,我将设置一个测试站点,我们可以从那里获取它。
EDIT
编辑
Here's a test I setup (using MS-Access 2007 VBA) that merely causes the form to be submitted. Since I have not filled in any fields, the site shows the required fields that are empty. Try it for yourself:
这是我设置的一个测试(使用 MS-Access 2007 VBA),它只会导致提交表单。由于我没有填写任何字段,该站点显示为空的必填字段。自己试试:
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate "https://www.yourwealth.co.uk/insurance/life-insurance-quotes#46870bb5/"
IE.Visible = True
IE.Document.getElementsByClassName("button orange getQuotes large")(0).Click
IE8 Solution
IE8解决方案
This solution uses getElementsByTagName, which is supported by IE8.
此解决方案使用 IE8 支持的 getElementsByTagName。
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate "https://www.yourwealth.co.uk/insurance/life-insurance-quotes#46870bb5/"
IE.Visible = True
Dim elems As Object
Set elems = IE.Document.getElementsByTagName("a")
Dim elem As Object
For Each elem In elems
If elem.className = "button orange getQuotes large" Then
elem.Click
Exit For
End If
Next