Получите данные из последней отфильтрованной строки в веб-таблице с помощью Selenium VBA

Я не очень разбираюсь в VBA и совершенно не знаком с Selenium для VBA. Я пытаюсь получить доступ к этому сайту https://www.tablefilter.com/0-configuration.html , на котором есть таблица с фильтрами, а затем фильтровать в соответствии с критериями конкретной страны. После этого я смогу перейти к последней строке, которая была отфильтрована для этой страны, в данном случае это «Россия», чтобы скопировать год в ячейку Excel B1. Я не знаю, как сделать это последнее и более, учитывая, что этот случай возвращает три строки для 1998, 1999 и 2000 годов, но в случае «Словацкой Республики» в результате есть только одна строка и, например, «Зимбабве "имеет семь строк. В любом случае мне нужно иметь возможность получить для любой страны год последней строки этой таблицы или единственной записи, понимая, что это динамические записи. Заранее большое спасибо.

Это мой код до сих пор

Sub Filtros()

Dim bot As New WebDriver
''Dim Sbutton As Selenium.WebElement
''Dim lista As Selenium.SelectElement
Dim Keys As New Selenium.Keys
        
bot.Start "chrome"
bot.Get "https://www.tablefilter.com/0-configuration.html"

''Application.Wait (Now + TimeValue("00:00:02"))
bot.FindElementById("flt0_demo").SendKeys "Russia"
bot.FindElementById("flt0_demo").SendKeys Keys.Enter

Stop

End Sub

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать список выбора css для фильтрации видимых строк после фильтрации таблицы. Затем вам нужно будет взять последний webElement в сопоставленной коллекции webElements, установить в переменной, используя .Count.

Dim elems As WebElements, last As WebElement

Set elems = bot.FindElementsByCss("#demo tbody > tr:not([style]) > td:nth-child(3)")

Set last = elems.item(elems.Count)

Debug.Print last.Text

Фильтрация таблицы добавляет атрибут style со значением display: none; к строкам, которые не будут отображаться в таблице. Исключение строк в теле таблицы, имеющих атрибут style, tbody > tr:not([style]), позволяет сопоставить только видимые строки. Затем выберите для 3-го столбца (год) > td:nth-child(3) и возьмите последний.


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

bot.findElementsByCss("#demo tbody > tr[style]").count > 0

Выход в зависимости от того, что наступит раньше.

Или используйте встроенный механизм тайм-аута и попытайтесь сопоставить скрытую строку (что будет означать, что фильтрация произошла по крайней мере для одной строки):

Dim hiddenRow As WebElement

Set hiddenRow = bot.FindElementByCss("#demo tbody > tr[style]", timeout:=<enter timeout>, Raise:=False)

If hiddenRow Is Nothing Then Exit Sub

Спасибо @QHarr. Это сработало!!!

Diego Solano 22.04.2022 23:35

Другие вопросы по теме