Home > OS >  Excel VBA Selenium - Image Click
Excel VBA Selenium - Image Click

Time:01-09

https://www.laquintaca.gov/connect/short-term-vacation-rentals

The site above has a cluster of images. On of those images is a box with the text value "ACTIVE AND SUSPENDED PERMITS". Click on the image takes you to a PDF that is downloadable. I would like to automate that download process to my desktop. The "orange" image stays the same but the href address changes every two weeks(document serial number on the end) when they upload a new PDF.

More directly, How do i click on the orage image space to get to the underlying, but bi-weekly changing PDF?

I can not find the actionable object address to click to take me to the downloadable document. What is the VBA Selenium code line to "click"

'*****************************************************************************

Sub FindingElements()

    Set cd = New Selenium.ChromeDriver 
    cd.Start

    cd.Get "https://www.laquintaca.gov/connect/short-term-vacation-rentals"
    '"https://www.laquintaca.gov/connect/short-term-vacation-rentals"
    
'=================================================================
'Find Element By ID or Name
'=================================================================
    Dim SearchInput As Selenium.WebElement
    Dim SearchButton As Selenium.WebElement
    Dim FindBy As New Selenium.By
'
    If Not cd.IsElementPresent(FindBy.ID("OuterContainer")) Then
        MsgBox "Could not find search input box"
       Exit Sub
    End If
'
'    Set SearchInput = cd.FindElementById("OuterContainer")
'    Set SearchInput = cd.FindElement(FindBy.ID("searchInput"))
'    Set SearchInput = cd.FindElementByName("search")
'    Set SearchInput = cd.FindElementByCss("#searchInput")
'    Set SearchInput = cd.FindElementByCss("[name='search']")
'    Set SearchInput = cd.FindElementByXPath("//*[@id='searchInput']")

CodePudding user response:

You can do it with CSS or XPath. I prefer CSS because XPath is more complex and sometimes slower than CSS.

The first procedure waits until the file is downloaded.

I used a procedure by Paul_Hossler to find the ChromeDownloadFolder.

Sub DownloadFileFromLaquintaca()
    Dim cd As New Selenium.ChromeDriver
    Dim DefaultChromeDownloadFolder As String
    
    ' Get Chrome download folder
    DefaultChromeDownloadFolder = ChromeDownloadFolder
    
    ' Start Chrome
    cd.Start
    
    ' Navigate to
    cd.Get "https://www.laquintaca.gov/connect/short-term-vacation-rentals"
    
    Dim FindBy As New Selenium.By
    Dim imgElement As Selenium.WebElement
            
    ' Check if element is present with CSS
    If Not cd.IsElementPresent(FindBy.Css("img[alt='ACTIVE & SUSPENDED PERMITS BOX']")) Then
        MsgBox "Could not find image box"
       Exit Sub
    End If

    ' Click to download
    cd.FindElementByCss("img[alt='ACTIVE & SUSPENDED PERMITS BOX']").Click
    
    ' Wait until download is completed
    Do While Dir(DefaultChromeDownloadFolder & "\" & "STVRCurrentActiveSuspended.pdf") = ""
        DoEvents
    Loop
End Sub

Function ChromeDownloadFolder()
    ' By Paul_Hossler 
    Dim sPref As String
    Dim iFile As Long, iStart As Long, iEnd As Long
    Dim sBuffer As String, sSearch As String, sDownloads As String

    ' Chrome preferces file, no extension
    sPref = Environ("LOCALAPPDATA") & "\Google\Chrome\User Data\Default\Preferences"
    
    ' marker
    sSearch = """download"":{""default_directory"":"

    ' read the whole file into buffer
    iFile = FreeFile
    Open sPref For Input As #iFile
        sBuffer = Input$(LOF(iFile), iFile)
    Close #iFile

    ' find start of marker
    iStart = InStr(1, sBuffer, sSearch, vbTextCompare)
    
    ' find comma
    iEnd = InStr(iStart   Len(sSearch), sBuffer, ",", vbTextCompare)

    ' pull out path
    sDownloads = Mid(sBuffer, iStart   Len(sSearch)   1, iEnd - iStart - Len(sSearch) - 2)

    ' remove double back slashes
    ChromeDownloadFolder = Replace(sDownloads, "\\", "\")
End Function

CodePudding user response:

I solved the issue I was having with the SUB below that works perfectly. Thank you so much for you fantastic help. The code blow swithces to the Current code tab, reds the URL then downloads to a location via the WinHttpReq = CreateObject("Microsoft.XMLHTTP") process:

Sub DownloadFileFromLaquintaca2() Dim cd As New selenium.ChromeDriver Dim DefaultChromeDownloadFolder As String Dim MyURL As String

' Start Chrome
Set cd = New ChromeDriver
cd.Start

' Navigate to
cd.get "https://www.laquintaca.gov/connect/short-term-vacation-rentals"

Const URL = "https://www.laquintaca.gov/connect/short-term-vacation-rentals"

Dim FindBy As New selenium.By
Dim imgElement As selenium.WebElement
        
' Check if element is present with CSS
If Not cd.IsElementPresent(FindBy.Css("img[alt='ACTIVE & SUSPENDED PERMITS BOX']")) Then
    MsgBox "Could not find image box"
   Exit Sub
End If

cd.FindElementByCss("img[alt='ACTIVE & SUSPENDED PERMITS BOX']").Click
   
Application.Wait (Now   TimeValue("0:00:3"))

'Get URL Address in Second Chorme Tab
      With cd
        .get URL
        .SwitchToNextWindow
        MyURL = .URL
        'Debug.Print .Window.Title
        'Debug.Print myURL
        .Windows.Item(.Windows.Count - 1).Close 'close prior window
    End With

'Write PDF File into Location with file Name STVR.PDF ---D:\MyDownLoads\STVR.pdf
Dim WinHttpReq As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", MyURL, False, "username", "password"
WinHttpReq.send

If WinHttpReq.Status = 200 Then
    Set oStream = CreateObject("ADODB.Stream")
    oStream.Open
    oStream.Type = 1
    oStream.Write WinHttpReq.responseBody
    oStream.SaveToFile "D:\MyDownLoads\STVR.pdf", 2 ' 1 = no overwrite, 2 = overwrite
    oStream.Close
End If

End Sub

  •  Tags:  
  • Related