Как найти таблицу с использованием селена и VBA на веб-странице, которая использует фреймы? - PullRequest
1 голос
/ 12 апреля 2019

Приведенный ниже код работал до нескольких дней назад, чтобы перейти к URL-адресу, найти таблицу и импортировать содержимое таблицы в Excel. Затем я сделал другое форматирование, чтобы получить таблицу в соответствующие строки и столбцы. Но теперь этот код не может найти таблицу. Я не полностью понимаю "Set a = .FindElementsByTag (" iframe ") (2)" и ".SwitchToFrame 1". Но я понимаю, что эта часть кода переключается на другой фрейм, который затем извлекает внутренний URL-адрес, который затем используется для получения данных из таблицы.

Мне нужна помощь в определении того, что нужно изменить, чтобы получить предполагаемый "url2", то есть "https://docs.google.com/spreadsheets/d/e/2PACX-1vT__QigQ9cJV03ohUkeK5dgQjfAbJqxrc68bXh9Is1WFST8wjxMxDy7hYUCFHynqRvInsANUI22GdIM/pubhtml?gid=817544912&single=true&chrome=false&widget=false&headers=false" url. * Примечание: я не использую этот docs.google URL, потому что я не знаю, если это URL-адрес будет периодически меняться. Я знаю, что адрес rosterresource.com/mlb-roster-grid останется неизменным.

Я пытался изменить некоторые целые числа для "Set a = .FindElementsByTag (" iframe ") (2)" и ".SwitchToFrame 1", но я делаю это вслепую, так как я не знаком с этим искусством код.

Sub GetRRgrid()
    '"Selenium type library" is a reference used
    Dim d As WebDriver, a As Object
    Set d = New ChromeDriver
    Const url = "https://www.rosterresource.com/mlb-roster-grid/"

    With d
        .Start "Chrome"
        .Get url

        Set a = .FindElementsByTag("iframe")(2)

        .SwitchToFrame 1

        url2 = .FindElementByCss("iframe").Attribute("src")
        .Get url2
        ele = .FindElementByTag("tbody").Attribute("innerText")
        d.Close
    End With
    ' other processes t format the data after it is imported
end sub
````

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Вот что я в итоге сделал для этого вопроса. Спасибо QHarr за руководство.

Public Sub GetRRrostergrid()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Dim URL2 As String
    Set d = New ChromeDriver
    Sheet20.Activate

    With d
        .Start "Chrome"
        .Get URL
        URL2 = .FindElementByClass("post_content").FindElementByTag("iframe").Attribute("src")
        .Get URL2
        .FindElementByCss(".waffle").AsTable.ToExcel ThisWorkbook.Worksheets("RRchart").Range("b1")
        .Quit
    End With
End Sub
0 голосов
/ 12 апреля 2019

Получение фрейма и переключение на него:

Вам нужно передать элемент iframe ( идентификатор аргумент) в SwitchToFrame, тогда вы находитесь внутри этого документа и можете взаимодействовать с его содержимым. Нет необходимости .get на этом с Selenium. Вы должны переключиться на .SwitchToDefaultContent, чтобы вернуться к родительскому документу.

Вы можете идентифицировать данный iframe несколькими способами. Современные браузеры оптимизированы для селекторов CSS, поэтому я обычно использую их. CSS эквивалент

.FindElementByTag("iframe")

- это

.FindElementByCss("iframe")

Ваш iframe является первым (и единственным), поэтому я не стал бы собирать набор веб-элементов и индексировать их. Кроме того, вы хотите по возможности использовать короткий селектор одного элемента, чтобы повысить его эффективность.


VBA:

Option Explicit
Public Sub Example()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Set d = New ChromeDriver

    With d
        .Start "Chrome"
        .get URL

        .SwitchToFrame .FindElementByCss("iframe")

        Stop

        .Quit
    End With
End Sub

Запись в Excel (.AsTable.ToExcel):

Что-то, что я только что обнаружил, нигде не видел документированно и восхищен тем, что существует метод записи таблицы непосредственно в Excel:

Option Explicit
Public Sub Example()
    Dim d As WebDriver
    Const URL As String = "https://www.rosterresource.com/mlb-roster-grid/"
    Set d = New ChromeDriver

    With d
        .Start "Chrome"
        .get URL

        .SwitchToFrame .FindElementByTag("iframe")
        .FindElementByCss(".waffle").AsTable.ToExcel ThisWorkbook.Worksheets("Sheet1").Range("A1")
        Stop

        .Quit
    End With
End Sub
...