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? 🙂

Comentários

comentários

Deixe uma resposta