Выбор раскрывающегося списка HTML с ReactJS в VBA - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь использовать VBA для выбора выпадающего элемента на веб-сайте HTML, который использует ReactJS.В этом примере мы можем использовать следующий веб-сайт:

https://jedwatson.github.io/react-select/

<span class="Select-value-label" role="option" aria-selected="true" id="react-select-2--value-item">New South Wales</span>

Если на странице HTML перечислены все параметры выбора в раскрывающемся списке, я могу легко установитьelementID к одному из выпадающих значений.

Set ie = CreateObject("InternetExplorer.Application") 
With ie
    .Visible = True
    .Navigate "about:blank"
    'with for page load
    ieWaitForURL

    .Navigate "https://jedwatson.github.io/react-select/"

    ie.Document.getelementbyid("react-select-2--value-item").Value = "Victoria"

Но HTML-код веб-сайта ReactJS не перечисляет все параметры раскрывающегося списка, и значение внутреннего текста изменяется, когда я делаю другой выбор.

Есть ли способ выбрать из выпадающего списка ReactJS, используя VBA, если все параметры не перечислены в HTML?

1 Ответ

0 голосов
/ 21 марта 2019

Это было намного проще, чем я думал. Следующее использует селен основной. Установите 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...