Я не очень разбираюсь в 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
Вы можете использовать список выбора 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. Это сработало!!!