Это было намного проще, чем я думал. Следующее использует селен основной. Установите selenium basic , убедитесь, что последний файл chromedriver.exe находится в папке selenium, vbe> tools> reference> добавьте ссылку на библиотеку типов selenium
Я показываю захват всех значений параметров в словарь. Также, выбирая предмет из выпадающего списка.
Ключевым моментом здесь является то, что меню параметров не является традиционным элементом select
с дочерними option
с, но использует React Select . Диапазон возможных значений извлекается через Ajax из этого скрипта .
Я покажу, как вы могли бы также получить возможные значения из этого скрипта напрямую, в конце, используя python, но я рад перевести на vba, если вы действительно заинтересованы. После нажатия на выпадающий список можно получить список доступных значений.
Если вы хотите пойти по маршруту IE, вы можете использовать тот же подход, но нужно вызвать события, которые откроют раскрывающийся список. Это также подробно описано в JS
сценарий, я думаю.
Option Explicit
Public Sub MakeSelection()
Dim d As WebDriver, i As Long, dropDownOptions As Object
Const URL = "https://jedwatson.github.io/react-select/"
Set d = New ChromeDriver
Set dropDownOptions = CreateObject("Scripting.Dictionary")
With d
.Start "Chrome"
.get URL
.FindElementByCss("button:nth-of-type(2)").Click
.FindElementByCss(".Select-arrow-zone").ClickAndHold
Dim item As Object
For Each item In .FindElementsByCss(".Select-menu div") 'put list of options in dictionary
dropDownOptions(item.Text) = i
i = i + 1
Next
For Each item In .FindElementsByCss(".Select-menu div") 'loop to select an option
If item.Text = "Victoria" Then 'If item.Text = dropDownOptions.item(3) etc....
item.Click
Exit For
End If
Next
Stop
.Quit
End With
End Sub
Скрипт Python для анализа возможных выпадающих значений из json:
Здесь показаны 3 различных элемента, которые обновляются через выпадающий список (метки, классы и значения)
import requests
import re
import json
r = requests.get('https://jedwatson.github.io/react-select/app.js')
s = str(r.content)
p1 = re.compile('t\.AU=(.*)')
p2 = re.compile('.+?(?=,\[\d+\])')
data1 = re.findall(p1, s)[0]
data2 = re.findall(p2, data1)[0].replace(',disabled:!0','')
replacements = ['value:','label:','className:']
for item in replacements:
data2 = re.sub(item, '"' + item[:-1] + '":' , data2)
finals = data2.split(',t.US=')
finalAus = json.loads(finals[0])
# finalUs = json.loads(finals[1])
d = {}
i = 0
for item in finalAus:
d[item['label']] = i
# item['label']
# item['value']
# item['className']
i+=1
print(d)