2016-06-20 2 views
0

У меня есть следующий код, который открывает страницу IE, и заполняет поля значением «караван». Однако мне нужно только первое поле для заполнения «караваном». Мне нужен второй, который будет заполнен, например, «2016». У меня были проблемы с этой задачей, потому что я не могу однозначно идентифицировать каждый элемент во входном теге (к которому принадлежат все поля).Исходный код IE-кода для моего скребка VBA

Вот мой код:

Sub Quote() 



Dim ie As Object 

Set ie = CreateObject("InternetExplorer.Application") 

ie.navigate ("https://insurance.qbe.com.au/portal/caravan/form/estimate") 

ie.Visible = True 

Do 
DoEvents 
Loop Until ie.readystate = 4 



Application.Wait (Now + TimeValue("00:00:03")) 

Do 
DoEvents 
Loop Until ie.readystate = 4 


Set inputCollection = ie.document.getElementsByTagName("input") 



For Each inputElement In inputCollection 


inputElement.Value = "Caravan" 


Next inputElement 


Loop 


End Sub 

Так он принимает каждый «inputElement», который расположен в пределах «входной» метки, и, где это возможно, это делает отображаемое значение соответствующего поля в в том, что из «Каравана» ,

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

Сначала один

enter image description here

Второй один

enter image description here

Итак, у меня нет идентификатора. И оба находятся в теге «input», и оба имеют одинаковое имя класса. Поэтому я не могу получить элемент-by-id или get-elements-by-classname. Я попытался получить элементы по имени класса по-разному, и он просто ничего не делает (ошибка не возникает, и веб-страница не затрагивается).

Единственный способ, которым я смог заполнить поле, - это использовать код, который у меня выше. Но, опять же, он меняет все поля. Я полагаю, что единственное, что я действительно могу использовать, чтобы заставить мой код рассказать обо всех остальных, - это элемент-заполнитель каждого из них.

Но как достичь этого, видя, как вы не можете «получить элемент по заполнителем»

//

Я так старался, чтобы подтвердить, что нет никакого способа, чтобы использовать имя класса, со следующим изменением кода :

Set inputCollection = ie.document.getElementsByTagName("input") 

For Each inputElement In inputCollection 

If ie.document.getElementsByClassName.Value = "ui-select-search ui-select-toggle ng-pristine ng-valid ng-touched" Then inputElement.Value = "Caravan" 
+0

Я искал в Интернете, но просто не могу найти ничего, что мне нужно - любые предложения о том, что искать? Я искал такого возмутительного, как «get element by placeholder vba», чтобы «управлять веб-сайтами с помощью vba» на «vba для управления исходным кодом, который не имеет id» для «vba, когда имена классов и теги идентичны» - я нахожусь в потеря на этом – chris

ответ

0

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

Set inputCollection = ie.document.getElementsByTagName("input") 



For Each inputElement In inputCollection 

If inputElement.getAttribute("placeholder") = "Caravan type" Then 

inputElement.Value = "Caravan" 

Exit For 

End If 

Next inputElement 

Я так не знают «GetAttribute», но это делает так много смысла. Если у вас нет идентификатора, и некоторые из полей, которые вы ищете, имеют одно и то же имя класса (как это часто бывает), вам нужно полагаться на другие уникальные атрибуты и использовать этот вид кода.

Если вам интересно, где я узнал об этом, я нашел это довольно прохладный канал Youtube, а вот конкретное видео, которое помогло мне:

https://www.youtube.com/user/alexcantu3/videos

Надеется, что это помогает кто-то еще какой-то день!