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