Click on Table Link - html

I am completely new to excel vba and i want to do it for a specific requirement how to click on the Unit history button in the website. Could anyone help me with a program?
I used the following working template code:
Sub ClickLink()
Dim htmlDoc As MSHTML.HTMLDocument
Dim htmlInput As MSHTML.HTMLInputElement
Dim htmlColl As MSHTML.IHTMLElementCollection
Set objIE = New SHDocVw.InternetExplorer
With objIE
.navigate "https://www.google.com"
.Visible = 1
Do While .Busy: DoEvents: Loop
Do While .readyState <> 4: DoEvents: Loop
Set htmlDoc = .document
Set htmlColl = htmlDoc.getElementsByTagName("A")
For Each htmlInput In htmlColl
If htmlInput.innerText = "Gmail" Then
htmlInput.Focus
htmlInput.Click
Do While .Busy: DoEvents: Loop
Do While .readyState <> 4: DoEvents: Loop
Exit For
End If
'Debug.Print "Frame " & x & ": " & htmlInput.innerText
Next htmlInput
Set htmlDoc = .document
Set htmlColl = htmlDoc.getElementsByTagName("A")
For Each htmlInput In htmlColl
If htmlInput.innerText = "Sign in" Then
htmlInput.Focus htmlInput.Click
Do While .Busy: DoEvents: Loop
Do While .readyState <> 4: DoEvents: Loop
Exit For
End If
'Debug.Print "Frame " & x & ": " & htmlInput.innerText
Next htmlInput
End With
End Sub
Replaced url with my url such that I had:
Sub ClickLink()
Dim htmlDoc As MSHTML.HTMLDocument
Dim htmlInput As MSHTML.HTMLInputElement
Dim htmlColl As MSHTML.IHTMLElementCollection
Set objIE = New SHDocVw.InternetExplorer
With objIE
.navigate "http://insraa01.asia.delphiauto.net/"
.Visible = 1
Do While .Busy: DoEvents: Loop
Do While .readyState <> 4: DoEvents: Loop
Set htmlDoc = .document
Set htmlColl = htmlDoc.getElementsByTagName("A")
For Each htmlInput In htmlColl
If htmlInput.innerText = "Unit History" Then
htmlInput.Focus
htmlInput.Click
Do While .Busy: DoEvents: Loop
Do While .readyState <> 4: DoEvents: Loop
Exit For
End If
'Debug.Print "Frame " & x & ": " & htmlInput.innerText
Next htmlInput
End With
End Sub
It is not working because my desired element to click is a table row and I don't know how to do this. I have gone through Clicking Table Row in HTML Table using VBA but remain confused as to taking reference to the tables and clicking on Table contents.
The element to click on is highlighted in the image.

You can try a css class selector in combination with href attribute selector and ends with operator to target the a tag of interest (the fact it is within a table is irrelevant) and it looks like you have a parent frame to negotiate as well.
ie.document.querySelector("frame").item(index of frame).contentDocument.querySelector(".nonvis[href$=unithistory]").click
This says to click the first element which has class nonvis and href attribute who's value ends with unithistory.
You need to determine at which index of frames the frame is that contains your a tag e.g. the first frame would be 0, the second would be 1 etc.
Read about css selectors here: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors

Related

Second drop down in HTML is not getting selected through VBA

My VBA code is not able to select the second drop down option once the first drop down is selected. Not sure why one dropdown is loading and second is not responding as per below code? Appreciate if you could help on fixing this. Regards
Dim IE As InternetExplorer
Dim HTMLDoc As HTMLDocument
Dim commodityStr As String
Dim commodityObj As HTMLObjectElement
Dim commodityCodes As IHTMLElementCollection
Dim codeCounter As Long
Dim EDateStr As String
Dim EDateObj As HTMLObjectElement
Dim EdateCodes As IHTMLElementCollection
Dim i As Integer
commodityStr = "MADHYA PRADESH"
EDateStr = "REWA"
Set IE = New InternetExplorer
With IE
.Visible = True
.navigate "http://hydro.imd.gov.in/hydrometweb/(S(ryta1dvaec5pg03bdnxa5545))/DistrictRaifall.aspx"
While .Busy Or .readyState <> READYSTATE_COMPLETE: Wend
Set HTMLDoc = IE.document
End With
Set commodityObj = HTMLDoc.getElementById("listItems")
For codeCounter = 0 To commodityObj.Length - 1
If commodityObj(codeCounter).innerText = commodityStr Then
commodityObj.Value = commodityObj(codeCounter).Value
commodityObj.Focus
commodityObj.FireEvent ("onchange")
While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE: Wend
Exit For
End If
Next
Set EDateObj = HTMLDoc.getElementById("DistrictDropDownList")
For codeCounter = 0 To EDateObj.Length - 1
If EDateObj(codeCounter).innerText = EDateStr Then
EDateObj.Value = EDateObj(codeCounter).Value
While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE: Wend
commodityObj.Focus
commodityObj.FireEvent ("onchange")
Exit For
End If
Next
You need a timed loop to allow for that execution of the onchange event. Also, you can make use of css attribute = value selectors to remove loops when targeting elements. It is likely the page does an XHR request so inspect via dev tools to see if that is the case.
Option Explicit
'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub MakeSelections()
Dim ie As InternetExplorer, ele As Object, t As Date
Const MAX_WAIT_SEC As Long = 5
Dim commodity As String, iDate As String
commodity = "MADHYA PRADESH"
iDate = "REWA"
Set ie = New InternetExplorer
With ie
.Visible = True
.Navigate2 "http://hydro.imd.gov.in/hydrometweb/(S(3qitcijd521egpzhwqq3jk55))/DistrictRaifall.aspx"
While .Busy Or .readyState < 4: DoEvents: Wend
.document.querySelector("[value='" & commodity & "']").Selected = True
.document.querySelector("[name=listItems]").FireEvent "onchange"
t = Timer
Do
On Error Resume Next
Set ele = .document.querySelector("[value='" & iDate & "']")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While ele Is Nothing
If Not ele Is Nothing Then
ele.Selected = True
.document.querySelector("#GoBtn").Click
Else
Exit Sub
End If
Stop
.Quit
End With
End Sub

Aceess VBA - Subroutine getting data from website works on debug mode but not in runtime

I would like to get customer data from VAT number (NIP number in Poland).
I cannot figure out why code indicated below works only in debug mode and when hit F5 but I set breakpoint at the line with "button.click".
When I run it without breakline it doesn't print any data.
Thank you in advance for any advice how to handle this.
Sleep method used in procedure below is as following:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub IE_GetDataFromSite()
Dim IE As SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLInput As MSHTML.IHTMLElement
Dim button As MSHTML.IHTMLElement
Dim row As MSHTML.IHTMLElement
Dim rows As MSHTML.IHTMLElementCollection
Dim cell As MSHTML.IHTMLElement
Set IE = New SHDocVw.InternetExplorer
IE.Visible = False
IE.navigate "https://wyszukiwarkaregon.stat.gov.pl/appBIR/index.aspx"
Do While IE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
Set HTMLDoc = IE.Document
Set HTMLInput = HTMLDoc.getElementById("txtNip")
HTMLInput.value = "9542583988"
Set button = HTMLDoc.getElementById("btnSzukaj")
button.Click
Do While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop
Sleep (1000)
Set HTMLDoc = IE.Document
Set rows = HTMLDoc.getElementsByClassName("tabelaZbiorczaAltRow")
For Each row In rows
Debug.Print row.innerText, row.className
If row.className = "tabelaZbiorczaAltRow" Then
For Each cell In row.Children
Debug.Print cell.innerText
Next cell
End If
Next row
IE.Quit
End Sub
Allow a short pause after entering number and also loop until table is present
Option Explicit
Public Sub GetInfo()
Dim ie As New InternetExplorer, td As Object
Dim tr As Object, table As Object, t As Date
Const MAX_WAIT_SEC As Long = 5
With ie
.Visible = True
.navigate "https://wyszukiwarkaregon.stat.gov.pl/appBIR/index.aspx"
While .Busy Or .readyState < 4: DoEvents: Wend
.document.querySelector("#txtNip").Value = "9542583988"
Application.Wait Now + TimeSerial(0, 0, 1)
.document.querySelector("#btnSzukaj").Click
While .Busy Or .readyState < 4: DoEvents: Wend
t = Timer
Do
DoEvents
On Error Resume Next
Set table = .document.querySelector("table.tabelaZbiorcza")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While table Is Nothing
If Not table Is Nothing Then
For Each tr In table.getElementsByTagName("tr")
For Each td In tr.getElementsByTagName("td")
Debug.Print td.innerText
Next
Next
End If
.Quit
End With
End Sub

Press Login Button Excel Vba

I have the code below to login into the website in the code. However, the login button is not being clicked. I am new to Excel VBA, what do you suggest, please?
Dim HTMLDoc As HTMLDocument
Dim MyBrowser As InternetExplorer
Sub Myenter()
Dim MyHTML_Element As IHTMLElement
Dim MyURL As String
On Error GoTo Err_Clear
MyURL = "https://willemendrees.nl/fn/login/"
Set MyBrowser = New InternetExplorer
MyBrowser.Silent = True
MyBrowser.navigate MyURL
MyBrowser.Visible = True
Do
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE
Set HTMLDoc = MyBrowser.document
HTMLDoc.all.id_username.Value = "amsterdam#willemendrees.nl"
HTMLDoc.all.id_password.Value = "*****"
For Each MyHTML_Element In HTMLDoc.getElementsByTagName("input")
If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
Next
End With
Err_Clear:
If Err <> 0 Then
Err.Clear
Resume Next
End If
End Sub
You can use a CSS attribute = value selector of [tabindex='3']. This targets the login button by its tabindex attribute whose value is 3.
HTMLDoc.querySelector("[tabindex='3']").Click
Whole thing:
Option Explicit
Public Sub AttemptLogin()
Dim IE As New InternetExplorer
With IE
.Visible = True
.Navigate2 "https://willemendrees.nl/fn/login/"
While .Busy Or .readyState < 4: DoEvents: Wend
With .document
With .querySelector("#id_username")
.Focus
.Value = "amsterdam#willemendrees.nl"
End With
With .querySelector("#id_password")
.Focus
.Value = "***"
End With
.querySelector("[tabindex='3']").Click
End With
While .Busy Or .readyState < 4: DoEvents: Wend
Stop '<== Delete me later
.Quit
End With
End Sub
It seems there are two form elements on that html page and the login is the second. Identify, then submit the form.
HTMLDoc.all.id_username.Value = "amsterdam#willemendrees.nl"
HTMLDoc.all.id_password.Value = "*****"
HTMLDoc.getelementsbytagname("form")(1).submit
The index number of a collection of elements is zero-based.

VBA Web Automation on a dynamic site

I am trying to scrap barcode owners from this site : http://gepir.gs1.org/index.php/search-by-gtin
I am receiving "Object doesnt support this property or method" error msg because of the final line. I tried to extract it with class and tag but failed.
I am trying to extract the company name from the dynamic table.
Sub aa()
Dim ie As New SHDocVw.InternetExplorer
Dim doc As HTMLDocument
Dim aaa As Object
Dim objIE As InternetExplorer
Set objIE = New InternetExplorer
ie.Visible = True
ie.navigate "gepir.gs1.org/index.php/search-by-gtin"
Do While ie.readyState <> READYSTATE_COMPLETE
Loop
Debug.Print ie.LocationName, ie.LocationURL
Set doc = ie.document
ie.document.forms("searchbygtin").elements("keyValue").Value = "685387379712"
ie.document.forms("searchbygtin").elements("method").Click
Debug.Print ie.document.getElementsBytag("tr")(7).innerText
End Sub
Any help would be great,
Thanks
You need TagName
Debug.Print ie.document.getElementsByTagName("tr")(7).innerText
I get a captcha though so I doubt you can complete this task in this way. Selenium and IE both seem to trigger the captcha, at least for me.
If not for the captcha I would re-write your script as follows (perhaps with a loop to make sure tr element is present):
Option Explicit
Public Sub GetLastChangeDate()
Dim ie As New SHDocVw.InternetExplorer, doc As HTMLDocument
Const URL = "gepir.gs1.org/index.php/search-by-gtin"
With ie
.Visible = True
.navigate URL
While .Busy Or .readyState < 4: DoEvents: Wend
Set doc = .document
Debug.Print .LocationName, .LocationURL
doc.getElementById("keyValue").Value = "685387379712"
doc.getElementById("submit-button").Click
While .Busy Or .readyState < 4: DoEvents: Wend
Debug.Print .document.getElementsByTagName("tr")(7).innerText
End With
End Sub

scrape info from nested div excel vba

I'm trying to extract the start date from the following, but my code cant seem to see the 'nested" div "daysTips" any help would be great. Thank you.
HTML Screen Shot:
Sub warranty2()
Dim elements As IHTMLElementCollection
Dim IE As New InternetExplorer
Dim Doc As HTMLDocument
IE.Visible = True
IE.navigate "https://pcsupport.lenovo.com/gb/en/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x280-type-20kf-20ke/20ke/20kes5sd09/pc0x5yhz/warranty"
Do
DoEvents
Loop Until IE.readyState = READYSTATE_COMPLETE
Set Doc = IE.document
Set elements = Doc.getElementsByClassName("daysTips")
For i = 0 To elements.Length - 1
Sheet1.Range("G" & (i + 1)) = elements(i).innerText
Next i
IE.Quit
End Sub
You need to do the click first on the down chevron
HTML:
Option Explicit
Public Sub GetInfo()
Dim IE As New InternetExplorer
With IE
.Visible = True
.navigate "https://pcsupport.lenovo.com/gb/en/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x280-type-20kf-20ke/20ke/20kes5sd09/pc0x5yhz/warranty"
While .Busy Or .readyState < 4: DoEvents: Wend
IE.document.querySelector(".icon.icon-s-down").Click
While .Busy Or .readyState < 4: DoEvents: Wend
Debug.Print IE.document.querySelector(".daysTips span").innerText
.Quit
End With
End Sub