Как использовать SeleniumBasi c (VBA) для взаимодействия с элементом Shadow- Root DOM в chrome: // downloads / - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь взаимодействовать с элементом на странице Chrome Download (chrome: // downloads /), чтобы иметь возможность узнать, когда загрузка заканчивается.

Но я не могу взаимодействовать с элементами на этой странице. Я обнаружил, что это из-за теневых элементов root DOM.

Я нашел в Google несколько примеров того, как взаимодействовать с этими элементами, используя java ou C, но никогда с VBA. Не могли бы вы помочь перевести эти команды в VBA?

https://medium.com/rate-engineering/a-guide-to-working-with-shadow-dom-using-selenium-b124992559f

https://medium.com/@alan.canlin / как найти веб-элементы в shadow-doms-using-selenium-webdriver-and- c -36978f7de9ba

Кодовая страница Google:

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Большое спасибо! Работает безупречно.

Я просто публикую здесь несколько небольших изменений, которые мне нужно было сделать:

Option Explicit

Sub Accessing_ShadowRoot_Object ()

'================================='
'Declaração Early-Binding:
'================================='
Dim Selenium As New ChromeDriver  '
'================================='

Selenium.Start "chrome", "chrome://downloads"
Selenium.get "/"

Dim Nome_Download As String
Nome_Download = getDownLoadedFileName(Selenium, 10)

Debug.Print Nome_Download

End Sub

Publi c Функция getDownLoadedFileName (Драйвер как WebDriver, maxTimeInMins как целое число)

Dim startTime As Date
startTime = Now()
Dim downloadPercentage
Do While ElapsedTime(Now(), startTime) < maxTimeInMins
    downloadPercentage = Driver.ExecuteScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#frb0').shadowRoot.querySelector('#progress').value")
    Debug.Print downloadPercentage
    If (downloadPercentage = 100) Then
        getDownLoadedFileName = Driver.ExecuteScript("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('div#content  #file-link').text")
    End If
    DoEvents
Loop

Конечная функция

Функция ElapsedTime (endTime As Date, startTime As Date)

Dim Interval As Date
' Calculate the time interval.
Interval = endTime - startTime

' Format and return the time interval in seconds.
ElapsedTime = Int(CSng(Interval * 24 * 3600))

Функция завершения

0 голосов
/ 24 марта 2020

Вот простой метод, который гарантирует, что скрипт будет ждать окончания загрузки.

Function getDownLoadedFileName(maxTimeInMins As int)
    Dim startTime As Date
    startTime = Now()
    Dim downloadPercentage As int
    Do While ElapsedTime(Now(),startTime) < maxTimeInMins 
         downloadPercentage = driver.execute_script( "return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('#progress').value")
        If (downloadPercentage = 100) Then
            getDownLoadedFileName = driver.execute_script("return document.querySelector('downloads-manager').shadowRoot.querySelector('#downloadsList downloads-item').shadowRoot.querySelector('div#content  #file-link').text")
        End If
    Loop
End Function

Function ElapsedTime(endTime As Date, startTime As Date) 
    Dim Interval As Date 
    ' Calculate the time interval. 
    Interval = endTime - startTime 

    ' Format and return the time interval in seconds. 
    ElapsedTime = Int(CSng(Interval * 24 * 3600))
End Function
...