vba selenium webautomate но график не определен

Вопрос или проблема

Я вручную зашел на веб-страницу wantrich.chinatimes.com/tw-market/listed/stock/3167, и график загружается полностью без каких-либо проблем. Однако, когда я использую Selenium для доступа к той же странице, график не виден и показывает “undefined”.

динамический график отображает undefined

обновление: На сайте есть ограничения на selenium. Как их обойти??

Dim Mychorme As Selenium.ChromeDriver

Sub Take_ScreenShot_Entirepage_Cropped()

    Dim wdh As Integer
    Dim hght As Integer
    Dim topOffset As Integer
    Dim bottomOffset As Integer
    Dim filePath As String
    
    topOffset = 500  ' 
    bottomOffset = 500  ' 
    filePath = ThisWorkbook.Path
    
    Set Mychorme = New Selenium.ChromeDriver
    
    With Mychorme    
        .Timeouts.ImplicitWait = 5000
        .Start
        .Get "https://wantrich.chinatimes.com/tw-market/listed/stock/3167"
                
        wdh = .ExecuteScript("return document.body.scrollWidth")
        hght = .ExecuteScript("return document.body.scrollHeight")  
        .Window.SetSize wdh, hght - topOffset - bottomOffset        
        .ExecuteScript "window.scrollTo(0, " & topOffset & ");"        
        Application.Wait (Now + TimeValue("0:00:03"))        
        .TakeScreenshot.SaveAs filePath & "\screenCapture_Entirepage_Cropped.png"        
        .Quit
        
    End With

End Sub

Ответ или решение

Решение проблемы с отсутствием графика в Selenium для VBA

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

1. Суть проблемы

При открытии страницы вручную график загружается корректно. Однако, при использовании Selenium для автоматизации, возникают трудности, и график не отображается должным образом. Это может быть связано с особой реализацией JavaScript на сайте, которая определяет, как и когда графики загружаются.

Общие причины:

  • Динамическая загрузка: График может подгружаться асинхронно и требует времени для инициализации, что может быть пропущено в автоматическом сценарии.
  • Блокировка Selenium: Некоторые веб-сайты имеют механизмы для детекции автоматизированных инструментов и могут блокировать их доступ или модифицировать контент.

2. Как обойти ограничения при использовании Selenium

Улучшение скрипта
  1. Увеличьте время ожидания:
    Убедитесь, что вы даете достаточно времени для полной загрузки всех компонентов страницы. Рассмотрите возможность использования Explicit Wait, чтобы ожидать появления конкретного элемента на странице.
Dim Wait As Selenium.Wait

Set Wait = Mychorme.Wait
Wait.ForElementByCss(".class_of_chart_element", 10000) ' Укажите ожидаемый селектор графика
  1. Обновите пользовательский агент:
    Замените пользовательский агент браузера на более обычный, чтобы сайт не распознал вас как бот.
Mychorme.AddArgument "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
  1. Используйте JavaScript для инициирования графика:
    Некоторые графики могут требовать вызов определенных функций для их отрисовки. Можно использовать ExecuteScript для инициализации графика, если известна функция.
Mychorme.ExecuteScript "initializeChart();" ' замените на фактическую функцию

3. Работа с динамической загрузкой

Поскольку страницы могут загружать контент с задержкой, стоит обдумать использование Sleep или ожидание загрузки определенных элементов.

Application.Wait Now + TimeValue("0:00:05") ' Задержка в 5 секунд

Также, проверьте, загружается ли график в фрейме. Если это так, необходимо сначала получить доступ к этому фрейму.

4. Пример доработанного скрипта

Ниже представлен доработанный пример вашего скрипта с учетом предложенных рекомендаций:

Dim Mychorme As Selenium.ChromeDriver
Dim Wait As Selenium.Wait

Sub Take_ScreenShot_Entirepage_Cropped()

    Dim wdh As Integer
    Dim hght As Integer
    Dim topOffset As Integer
    Dim bottomOffset As Integer
    Dim filePath As String

    topOffset = 500  
    bottomOffset = 500  
    filePath = ThisWorkbook.Path

    Set Mychorme = New Selenium.ChromeDriver

    With Mychorme    
        .Timeouts.ImplicitWait = 5000
        .AddArgument "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        .Start
        .Get "https://wantrich.chinatimes.com/tw-market/listed/stock/3167"

        ' Ожидание загрузки графика
        Set Wait = Mychorme.Wait
        Wait.ForElementByCss(".class_of_chart_element", 10000)

        wdh = .ExecuteScript("return document.body.scrollWidth")
        hght = .ExecuteScript("return document.body.scrollHeight")  
        .Window.SetSize wdh, hght - topOffset - bottomOffset        
        .ExecuteScript "window.scrollTo(0, " & topOffset & ");"        
        Application.Wait (Now + TimeValue("0:00:03"))        
        .TakeScreenshot.SaveAs filePath & "\screenCapture_Entirepage_Cropped.png"        
        .Quit

    End With

End Sub

Заключение

Использование Selenium для автоматизации браузера может быть сложным и часто требует нескольких попыток для настройки. Однако, с правильными ожиданиями, пользовательскими агентами и обработкой динамической загрузки, вы сможете успешно обойти ограничения и получить доступ к всем элементам веб-страницы, включая графики. Если вы столкнулись с дополнительными трудностями, рассмотрите возможность использования прокси-серверов или других методов обхода ограничений веб-сайтов.

Оцените материал
Добавить комментарий

Капча загружается...