VBA - Попытка ввода текста и нажатие кнопки «Поиск». Все в таблице, внутри формы, элемент без идентификатора, только элемент класса. - PullRequest
0 голосов
/ 31 января 2020

Попытка ввести значение в поле ввода и нажать кнопку «Поиск», чтобы получить результаты из таблицы.

Кажется, я не могу понять, как ввести значение в поле. Поле ввода и кнопка, кажется, находятся внутри формы внутри таблицы. Элемент ID отсутствует.

**> Input Box has these properties**
<td Class = "searchRow">
<input type = "text" name = "name" value onblur = "Numberfield();" style = "width: 200px;" class = "required">
This is all inside Form ID "SearchForm" > div ID "Search" > Tr > Td CLass "searchRow"

После того, как я получу правильную вкладку inte rnet explorer, мне нужно получить значение getElementByClassName и inp9ut

 IE.Document.getElementsByTagName("tr").getElementsByTagName("input").Value = "Search"
 IE.Document.getElementsByClassName("searchRow").getElementsByTagName("input").Value = "Search"

Кажется, я не могу заставить работать любую комбинацию.

Другим элементом является кнопка.

Button has these properties
<td colspan = "6" style = "align:right;" class = "searchonly">
<input type = "button" class = "actionbutton" value = "search" onclick = "submitform()">

Как мне нажать эту кнопку, которая находится в строке таблицы.

 IE.Document.getElementsByClassName("searchonly").getElementsByTagName("actionbutton").Click

Имеет ли это смысл?

Цените помощь.

Ответы [ 3 ]

0 голосов
/ 31 января 2020

Я пишу Ответ в виде комментариев и кода:

'What you want first
'**> Input Box has these properties**
'<td Class = "searchRow">
' <input type = "text" name = "name" value onblur = "Numberfield();" style = "width: 200px;" class = "required">
'This is all inside Form ID "SearchForm" > div ID "Search" > Tr > Td CLass "searchRow"

'What you try
'IE.Document.getElementsByTagName("tr").getElementsByTagName("input").Value = "Search"
'IE.Document.getElementsByClassName("searchRow").getElementsByTagName("input").Value = "Search"

'What should work
'Attention: the get methods work case sensitive. It's a difference between "Search" and "search"
'I write that because I wonder if the first letter of the ID "Search" is upper case in the original document
'
'You can seperate the div tag include all inner tags as own DOM object
Dim nodeDivSearch As Object
Set nodeDivSearch = IE.Document.getElementByID("Search")
'
'Now you can work on the new DOM object only
'Note that the getElements methods always create a NodeCollection
'All elements of the collection have an index. The first element always has
'index 0, so you can access the first input tag in the new DOM object as follows
'(getElementByID does not create a NodeCollection, because an ID should always
'be unique. So there is only one element for this criterion anyway)
nodeDivSearch.getElementsByTagName("input")(0).Value = "Search"
'
'I think your code will work with setting indexes
IE.Document.getElementsByClassName("searchRow")(0).getElementsByTagName("input")(0).Value = "Search"


'What you want second
'Button has these properties
'<td colspan = "6" style = "align:right;" class = "searchonly">
'  <input type = "button" class = "actionbutton" value = "search" onclick = "submitform()">

'What you try:
'IE.Document.getElementsByClassName("searchonly").getElementsByTagName("actionbutton").Click

'I think you know what to do here
IE.Document.getElementsByClassName("searchonly")(0).getElementsByTagName("actionbutton")(0).Click
0 голосов
/ 03 февраля 2020

getElementsByClassName возвращает массивоподобный объект всех дочерних элементов, которые имеют все заданные имена классов. Поэтому вам нужно выбрать, какой элемент вам нужен, используя индекс в возвращаемом массиве. То же самое происходит с getElementsByTagName.

Так что, если код html подобен приведенному ниже:

<form id="SearchForm">
    <div id="Search">
        <table>
            <tr>
                <td Class="searchRow">
                    <input type="text" name="name" value onblur="Numberfield();" style="width: 200px;" class="required" id="a1">
                </td>
                <td colspan="6" style="align:right;" class="searchonly">
                    <input type="button" class="actionbutton" value="search" onclick="submitform()">
                </td>
            </tr>
        </table>
    </div>
</form>

Тогда код vba для установки значения и нажатия кнопки должен быть таким, как показано ниже:

IE.Document.getElementsByClassName("searchRow")(0).getElementsByTagName("input")(0).Value = "Search"

IE.Document.getElementsByClassName("searchonly")(0).getElementsByClassName("actionbutton")(0).Click

Код выше приведен только для примера, вы должны изменить индекс в соответствии с реальной ситуацией на веб-сайте, который вы посещаете.

0 голосов
/ 31 января 2020

Лучше добавить атрибут ID, а затем использовать getElementsByID.

И если это невозможно, вы можете использовать XPATH и получить элемент с помощью следующей функции.

function getElementByXpath(path) {
  return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
console.log( getElementByXpath("VALUE OF XPATH") );

И вы можете легко получить XPATH, используя расширение в любом браузере. Как и XPath Finder, доступный в Google chrome.

...