Итак, я получил веб-страницу с тегом ввода
<div id="mainID" class="outside">
<div class="inside">
<input id="5443" name="43" type="checkbox" class="classname" />
<input id="5444" name="44" type="checkbox" class="classname" />
<input id="5445" name="45" type="checkbox" class="classname" />
<input id="5446" name="46" type="checkbox" class="classname" />
<input id="5447" name="47" type="checkbox" class="classname" />
</div>
</div>
Идентификатор и имя меняются, но имя класса всегда одно и то же - так, используя тег класса (имя класса), как я могу получить идентификационное имя, 5443 (ну все они один за другим в цикле for), используя визуальный базовый браузер? Мне не нужна информация тега имени.
EDIT: добавлен код
Селектор CSS:
Если вы используете VBA, то после того, как у вас есть HTML внутри HTMLDocument
например
IE.document
, то вы можете использовать querySelectorAll
метод document
применить селектор CSS, чтобы получить элементы, представляющие интерес.
Селектор CSS для применения: #mainID div.inside input
Это говорит о получении элементов, где внутри тега input
внутренний тег внутри класса с именем класса inside
внутри id mainID
. "#"
- это id, а "."
is className. " "
Представляет гнездование.
Запрос CSS:
Селектор вашего HTML возвращает следующие элементы:
VBA:
Вы можете использовать следующее для извлечения элементов, а затем проанализировать HTML с помощью Split
чтобы получить Ids
внутри. querySelectorAll
возвращает nodeList
какой вы цикл длины. Вы не можете использовать For Each Loop
. Это приведет к сбою Excel!
Option Explicit
Public Sub GetInfo()
Dim aNodeList As Object, i As Long
'Other code to get the HTMLDocument.......
Set aNodeList = HTMLDocument.querySelectorAll("#mainID div.inside input")
For i = 0 To aNodeList.Length - 1
Debug.Print GetId(aNodeList(i).innerHTML)
'Debug.Print GetId(aNodeList.item(i).innerHTML) '<== Sometimes the syntax is like this rather than the above
Next i
End Sub
Public Function GetId()
GetId = Replace$(Split(Split(s, "id=")(1), Chr$(32))(0), Chr$(34), vbNullString)
End Function
Я понял это после messin вокруг с оригинальным сообщением, которое я нашел на stackoverflow.com
Dim theElementCollection As HtmlElementCollection = Nothing
theElementCollection = WebBrowser1.Document.GetElementsByTagName("div")
For Each curElement As HtmlElement In theElementCollection
'If curElement.GetAttribute("classname").ToString = "example" It doesn't work.
' This should be the work around.
If InStr(curElement.GetAttribute("classname").ToString, "yourcalssname") Then
' Doesn't even fire.
' InvokeMember(test) after class is found.
MessageBox.Show(curElement.GetAttribute("InnerText"))
End If
Next
Это непростая задача в фоновом режиме. Но клиентская сторона его легко jquery.
Вот ссылка как ваш ответ на С#.
Как выбрать элемент по классу вместо ID в ASP.NET?
"Вы не можете сделать это на основе только имени класса. Имя класса и идентификатор полностью не связаны. Подумайте об этом: один и тот же класс может использоваться для разных объектов, но значения id всегда должны быть уникальными на странице. просьба просто не имеет смысла, ответ на нее очевиден ". обратитесь к ссылке.
http://www.codeproject.com/questions/720610/csharp-code-for-get-ID-of-the-control-using-its-cl
С# как получить имя (в строке) свойства класса?
Этот пример ниже для стороны clint через jquery. Это довольно легко.
На стороне браузера используйте jquery или javascript. В вашем случае используйте jquery.
Добавьте последний jquery на HTML-страницу и напишите код в теге скрипта как
<script>
$( document ).ready(function() {
$('.test').click(function() {
alert( this.id );
});
});
</script>
Ссылки: - jquery: получить идентификатор из селектора классов
вы можете выполнить поиск из условия варки