Я не могу извлечь внутренний текст из атрибута «span title» (значение «17L2002131/Тип устройства для электрических интеллектуальных счетчиков/Управляемые веб-службы DCCI/ Ожидание») ссылки IE. Взяв статус, например, ОЖИДАНИЕ для извлеченного внутреннего текста, я затем хочу, чтобы он был вставлен во входную ячейку листа Excel, где остальные данные для выполнения теста заносятся в таблицу.

В настоящее время код не может найти атрибут "Title" = "Перейти к устройству" и пропускает строку: Worksheets("Sheet2").Range("D5") = " Активность не найдена2" вместо перехода к первому блоку If Else.

Ниже мой код VBA. Не могли бы вы помочь мне найти, где я ошибаюсь.

   Set objSubCollec = objCollection(0).contentWindow.document.getElementById("tabPage")
   Set objElement = objSubCollec.contentWindow.document
   Set elm = objElement.querySelectorAll("a.pseudoLink")
   Set elm = objElement.getElementsByTagName("span")

     For Each e In elm
             If e.getAttribute("title") = "Go To Device" Then
                 If e.innerText Like "*Commissioned*" Then
                 Worksheets("Sheet2").Range("D5") = "Commissioned"

                 ElseIf e.innerText Like "*Pending*" Then
                 Worksheets("Sheet2").Range("D5") = "Pending"

                 Else
                 Worksheets("Sheet2").Range("D5") = "Active"
                 End If
             Else
                 Worksheets("Sheet2").Range("D5") = "No Activity found2"
        Exit For
      End If
   Next

Фрагмент HTML страницы:

<tbody class="dataExplorerTableBody" id="dataExplorerTableBody1" style="width: 1022px; overflow: auto; display: block; position: relative; max-height: 125px;" currentsortcolumn="0" currentsortdirection="None">

<tr><td class="grid paddedCell explorerGrid gridFirstColumn nowrap cursorDefault" style="width: 45px; min-width: 45px;" scope="row" nbr="1" listProcess="N"><table role="presentation" style="padding: 0px; width: 100%; border-spacing: 0px;" summary=""><tbody><tr ignoremouse="true">

<td style="text-align: left;"></td><td class="firstCol" style="text-align: right;"><input tabindex="5" id="deOption0_zone_1" type="checkbox" value=""></td></tr></tbody></table></td><td class="grid paddedCell explorerGrid nowrap reg cursorDefault" style="width: 153px; min-width: 153px;" nbr="1" listProcess="N">
<span>00‑00-93</span>

</td><td class="grid paddedCell explorerGrid nowrap reg cursorDefault clickable" style="width: 533px; min-width: 533px;" nbr="1" listProcess="B"><img tabindex="5" title="Show Context Menu" class="imageTypeElement uiMargin oraContextMenuImg " role="button" alt="Show Context Menu" src="./images/alta/popMenuButton.png?ltr" contextmenu="D1_CONTEXT_DEVICE" decontrol="contextMenu"><a tabindex="5" class="pseudoLink" role="link" navigable="" navoptcd="d1dvcTabMenu">
<span title="Go To Device">17L2002131 / Device Type for Electric Smart Meters / DCCI Managed Web Services / Pending</span></a></td>

<td class="grid paddedCell explorerGrid nowrap reg cursorDefault" style="width: 167px; min-width: 167px;" nbr="1" listProcess="N"><span>DCCI Managed Web Services</span></td></tr></tbody>
0
Job Seeker 28 Янв 2020 в 11:31
1
В чем проблема? Обратите внимание, что "это не работает" не является описанием ошибки? Где вы берете ошибки? Где именно ты застрял? • Вам может быть полезно прочитать Почему "Кто-нибудь может мне помочь?" не актуальный вопрос?
 – 
Pᴇʜ
28 Янв 2020 в 11:48
Вы используете For Each e1 In elm1, но elm1 – это Nothing, он не определен. Убедитесь, что вы всегда используете Option Explicit, чтобы избежать опечаток в переменных. И правильно объявите все свои переменные. Изменить и включить свои объявления в свой код в вопросе. • Я настоятельно рекомендую не использовать пронумерованные имена переменных, их легко перепутать, и вы быстро столкнетесь с ошибками. Вместо этого используйте осмысленные имена.
 – 
Pᴇʜ
28 Янв 2020 в 11:50
@PEH: я отредактировал свой вопрос и обновил дополнительную информацию. Спасибо
 – 
Job Seeker
28 Янв 2020 в 14:27

1 ответ

Лучший ответ

Если вы сделаете Set elm = objElement.getElementsByTagName("span"), тогда elm будет содержать все теги span, существующие в вашем коде.

Таким образом, For Each e In elm будет проходить через них, и если он найдет один span без title="Go To Device", ваша ячейка D5 покажет No Activity found2 и немедленно выйдет из подпрограммы. Таким образом, даже если где-то раньше или позже в HTML-коде будет <span title="Go To Device">, если существует хотя бы один span без title="Go To Device", ваша ячейка всегда будет возвращать No Activity found2.

Таким образом, вы должны написать "No Activity found2" в ячейку до начала поиска title="Go To Device" (по умолчанию), если он не был найден, он останется по умолчанию "No Activity found2" иначе он будет перезаписан Commissioned, Pending или Active:

Set objSubCollec = objCollection(0).contentWindow.document.getElementById("tabPage")
Set objElement = objSubCollec.contentWindow.document
Set elm = objElement.querySelectorAll("a.pseudoLink") 'remove this it does nothing because elm gets set in the next line.
Set elm = objElement.getElementsByTagName("span") 'now elm contains ALL span tags

'set "No Activity found2" as default …
Worksheets("Sheet2").Range("D5") = "No Activity found2"

'… and overwrite it with Commissioned/Pending/Active only if that is found.
For Each e In elm
    If e.getAttribute("title") = "Go To Device" Then
        If e.innerText Like "*Commissioned*" Then
             Worksheets("Sheet2").Range("D5") = "Commissioned"
        ElseIf e.innerText Like "*Pending*" Then
             Worksheets("Sheet2").Range("D5") = "Pending"
        Else
             Worksheets("Sheet2").Range("D5") = "Active"
        End If
    End If
Next e

Обратите внимание, что если имеется более одного <span title="Go To Device">, то только последний в коде будет результатом в D5, все остальные до этого будут перезаписаны этим последним результатом.

1
Pᴇʜ 28 Янв 2020 в 15:18