Макрос VBA в Excel — использование getElementById при динамическом идентификаторе

#vba #dom #web-scraping #getelementbyid

#vba #dom #очистка веб-страниц #getelementbyid

Вопрос:

Я пытаюсь заполнить форму на веб-странице, используя данные из Excel и макрос VBA.

 IE.document.getElementById("elementName").Value = ThisWorkbook.Sheets("Table_1").Range("A2").Value
  

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

 <div class="username" id="newid181619129-Username" value="">
<input class="search form-control" id="newid181619129-Username_input" type="text" />
</div>
  

И затем, если я обновлю веб-страницу, я получу это.

 <div class="username" id="newid521236985-Username" value="">
<input class="search form-control" id="newid521236985-Username_input" type="text" />
</div>
  

У меня нет контроля над исходной веб-страницей. Единственное решение, которое я нашел для этого, заключалось в том, чтобы «Перечислить всех потомков <div> этого тега, проверяя их ID свойство с помощью Like «. но я не могу найти DIV тега, который использует статический идентификатор.

Есть ли какой-нибудь способ заставить getElementById работать с динамическими идентификаторами?

Комментарии:

1. Конечно, это так. Попробуйте использовать .querySelector() для использования динамических идентификаторов. Например, эта часть -Username и -Username_input остаются неизменными, которые вы можете использовать для выполнения своей работы.

2. Это выглядит многообещающе, но я не уверен, каким именно должен быть синтаксис. Я получил эту работу на тестовом сайте IE.document.querySelector("#email").Value = ThisWorkbook.Sheets("Table_1").Range("A2").Value , но когда я попытался выполнить частичное совпадение (на основе другой страницы StackOverflow, которую я нашел), это не сработало. IE.document.querySelector("id$='mail'").Value = ThisWorkbook.Sheets("Table_1").Range("A2").Value

3. Мне не хватало скобок, IE.document.querySelector("[id$='mail']").Value = ThisWorkbook.Sheets("Table_1").Range("A2").Value

4. Вы обнаружили, что он наконец работает?

5. Да, я сделал, см. Мой последний комментарий, я смог заставить его работать. Спасибо!