Arquivo da tag: download

Selenium – Configurando download automático e caminho do arquivo

Pois é, o Selenium entrou na minha vida de uma maneira que é difícil até em pensar em fazer algo sem ele… ok, exagerei, mas vocês entenderam o que eu quis dizer.

Fazer download de um arquivo é uma tarefa até básica, mas a princípio não há controle de onde o arquivo vai parar ou qual seu nome, nem se vai aparecer aquela caixa de confirmação. Pois bem, ao menos Chrome, isso é relativamente simples de configurar isso a partir de suas preferências, que via Selenium é chamado de Capabilities ou ChromeOptions. Até onde sei o Firefox também suporta isso, mas o Chrome me pareceu mais flexível.

Para definir isso, utiliza-se o método “SetPreference” do driver, que deve ser configurado antes de iniciar a navegação, ou seja, antes de chamar o Get “http://endereco.do.seu.site”.

O trecho de código abaixo configura o Chrome para:

  1. Ativar o download automático (sem pedir confirmação)
  2. Alterar o caminho de download do arquivo para a mesma pasta do arquivo em execução
Private Sub AbreEConfiguraOChrome()
    Dim driver As New Selenium.ChromeDriver
    driver.SetPreference "download.default_directory", Replace(ThisWorkbook.FullName, ThisWorkbook.name, "")
    driver.SetPreference "download.directory_upgrade", True
    driver.SetPreference "download.prompt_for_download", False
    driver.Get "http://endereco.do.seu.site"
    'aqui começa seu código
End Sub

Simples! Ok, demorou um bocando para eu descobrir isso, mas aí está.

Bom proveito!

Selenium – Obtendo o nome do último arquivo baixado no Chrome 70+

Tem alguns dias postei um artigo muito “louco” sobre Selenium, ShadowRoot e Polymer, longo, controverso e cansativo.

Aqui, farei uso de tudo aquilo para resolver um simples problema. Obter o nome do último arquivo baixado no seu Chrome instanciado via Selenium. Sem complicações, vamos ao código:

'Estou assumindo que a variável driver é do WebDriver de está declarada globalmente
Public Function UltimoDownloadFeito() As String
    Dim shadowRoot As WebElement, _
        downloadsManager As WebElement, _
        downloadsItem As WebElement, _
        name As WebElement
 
    Set driver = New ChromeDriver
    driver.Get "chrome://downloads"
 
    Set downloadsManager = driver.FindElementByTag("downloads-manager")
    Set shadowRoot = driver.ExecuteScript("return arguments[0].shadowRoot", downloadsManager)
    Set downloadsItem = driver.ExecuteScript("return arguments[0].querySelectorAll('downloads-item')[0];", shadowRoot)
    Set shadowRoot = driver.ExecuteScript("return arguments[0].shadowRoot", downloadsItem)
    Set name = shadowRoot.FindElementById("name")
 
    UltimoDownloadFeito = name.Text
End Function

É claro, se você executar essa rotina diretamente, vai receber um erro, já que não haverão itens na lista. Fica como desafio implementar uma lógica para tratar esse erro. Para ver funcionar na íntegra, efetue um download antes. Abaixo faço isso com o Modelo de Cadastro:

Public Function UltimoDownloadFeito() As String
    Dim shadowRoot As WebElement, _
        downloadsManager As WebElement, _
        downloadsItem As WebElement, _
        name As WebElement
 
    Set driver = New ChromeDriver
    'faz o download do arquivo antes
    driver.Get "http://www.tomasvasquez.com.br/downloads/ModeloCadastrov3ListView.zip"
    driver.Get "chrome://downloads"
 
    Set downloadsManager = driver.FindElementByTag("downloads-manager")
    Set shadowRoot = driver.ExecuteScript("return arguments[0].shadowRoot", downloadsManager)
    Set downloadsItem = driver.ExecuteScript("return arguments[0].querySelectorAll('downloads-item')[0];", shadowRoot)
    Set shadowRoot = driver.ExecuteScript("return arguments[0].shadowRoot", downloadsItem)
    Set name = shadowRoot.FindElementById("name")
 
    UltimoDownloadFeito = name.Text
End Function

Bom proveito!

PS: Testei esse código na versão 70 do Chrome. Pode ser que ele funcione em algumas versões anteriores e/ou posteriores, mas não garanto. Teste antes de usar, ok? 🙂

Excel – Listar arquivos em diretório num ListBox

Acho que desenterrei essa. Mas o que seria da vida sem um pouco de saudosismo? Como idade não define utilidade, aí vai mais um código que pode servir de ajudar para aquele seu aplicativo bacana em Excel VBA. A ideia é ter acesso fácil a lista de arquivos de um determinado diretório. De aí em diante, as possibilidades são inúmeras. O form não poderia ser mais simples:

For Lista Arquivos Diretório
For Lista Arquivos Diretório

O código do botão ListarArquivos:

Private Sub cmdListaArquivos_Click()
    lstArquivos.Clear
    Dim arquivos() As String
    Dim lCtr As Long
    arquivos = ListaArquivos(txtCaminho.Text)
    For lCtr = 0 To UBound(arquivos)
      lstArquivos.AddItem arquivos(lCtr)
    Next
End Sub

E por fim, o código que faz o trabalho:

Option Explicit
 
Public Function ListaArquivos(ByVal Caminho As String) As String()
 
'Atenção: Faça referência à biblioteca Micrsoft Scripting Runtime
Dim FSO As New FileSystemObject
Dim result() As String
Dim Pasta As Folder
Dim Arquivo As File
Dim Indice As Long
 
ReDim result(0) As String
If FSO.FolderExists(Caminho) Then
    Set Pasta = FSO.GetFolder(Caminho)
 
    For Each Arquivo In Pasta.Files
      Indice = IIf(result(0) = "", 0, Indice + 1)
      ReDim Preserve result(Indice) As String
      result(Indice) = Arquivo.Name
    Next
End If
 
ListaArquivos = result
ErrHandler:
    Set FSO = Nothing
    Set Pasta = Nothing
    Set Arquivo = Nothing
End Function
 
Public Sub AbreForm()
    UserForm1.Show
End Sub
 
Public Sub VerCodigo()
    Application.Goto Reference:="AbreForm"
End Sub

Pressionado o botão Listar Arquivos em uma pasta do seu computador, temos algo parecido com isso:

For Lista Arquivos Diretório Preenchido
For Lista Arquivos Diretório Preenchido

Download do arquivo:

ListaArquivosDiretorio.zip
(10.67 KiB)

Bom proveito!

VBA – Fazendo o download de um arquivo

A pergunta veio do fórum, mas decidi colocar aqui para compartilhar com todos, até porque, esse código estava perdido em algum canto do meu HD faz muito tempo.
😀

O código abaixo realiza o download de um arquivo de uma URL informada em uma pasta também informada:

Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
    (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
 
Public Sub Download()
    On Error GoTo Err
    Dim Auxiliar As Long
    Dim URL As String, CaminhoLocal As String
    URL = "http://www.tomasvasquez.com.br/downloads/modelocadastro.zip"
    CaminhoLocal = "C:\modelocadastro.zip"
    Auxiliar = URLDownloadToFile(0, URL, CaminhoLocal, 0, 0)
    MsgBox "Download efetuado com sucesso!"
    Exit Sub
Err:
    MsgBox "Erro no download do arquivo"
End Sub

No caso, estou usando como exemplo o link do Modelo de Cadastro deste site. Basta colar o código em um novo módulo e executar, para em seguida ver que o Modelo de Cadastro é salvo no caminho “C:\modelocadastro.zip”.

Obviamente, a macro é adaptável a outras necessidades, URLs e tipos de arquivos.

Bom proveito!