Изменение значения текстового поля на сайте с помощью VBA - PullRequest
1 голос
/ 26 апреля 2020

Код HTML выглядит следующим образом: Узел пароля:

<input name="customerPassword" type="password" class="customer-password form-control ng-dirty ng-valid-required filled ng-valid ng-valid-minlength" ng-class="{
  'input-error': submitted &amp;&amp; securityForm.customerPassword.$invalid,
  'filled': securityForm.customerPassword.$viewValue.length>0}" ng-minlength="7" maxlength="20" ng-model="customer.password" ng-keydown="checkEnterKey(event)" required="" autocomplete="new-password" aria-autocomplete="list">

Защищенные узлы

<li class="sec-number ng-scope control-disabled" ng-repeat="n in securityCode track by $index" ng-class="{'control-disabled': securityForm.customerPassword.$invalid}">
    <!-- ngIf: n -->
    <input name="secNumber1" type="password" maxlength="1" class="input-code form-control ng-scope ng-pristine ng-valid-pattern ng-invalid ng-invalid-required" ng-class="{'filled': customer.code[$index] !== undefined}" ng-model="customer.code[$index]" ng-if="n" ng-disabled="securityForm.customerPassword.$invalid" ng-pattern="/\d{1}$/" met-only-number="" required="" focus-next="" disabled="disabled">
    <!-- end ngIf: n -->

    <!-- ngIf: n --><b class="into-input position ng-binding ng-scope" ng-if="n">
                    1
                    <span class="ordinal ng-binding">st</span>
                </b>
    <!-- end ngIf: n -->

    <!-- ngIf: !n -->
</li>

«secNumber» может быть любым от 1 до 8. Часть кода VBA выглядит следующим образом:

Set oPassword = .document.getElementsByName("customerPassword")(0)
oPassword.Focus
oPassword.Value = Password
oPassword.Focus

Dim strsecnum As String

For i = 1 To 8

    strsecnum = "secNumber" & i

    For Each ele In .document.getElementsByName(strsecnum)

        Set ele = .document.getElementsByTagName(strsecnum)(0)
        ele.Value = i

    Next

Next i

Я получаю ошибку 91, "Object Variable or With Block Variable not set" на ele.value = i. ele определяется как Object, поэтому я не уверен, в чем проблема.

1 Ответ

1 голос
/ 01 мая 2020

Ваша ошибка, вероятно, происходит, потому что вы предполагаете, что все 8 возможностей существуют в коде выше.

Вы можете изменить l oop и использовать селектор атрибута = значение css, начинающийся с оператора, для нацеливания только на существующие значения. Поскольку значения находятся в диапазоне от 1 до 8, и мы можем видеть, что ожидаемые значения действительно одинарные: di git от html (ng-pattern="/\d{1}$/"), мы можем присвоить значение справа на основе левой стороны name значение атрибута:

Dim i As Long

For i = 0 To ie.document.querySelectorAll("[name^='secNumber']").Length - 1
    ie.document.querySelectorAll("[name^='secNumber']").item(i).value  = Right$(ie.document.querySelectorAll("[name^='secNumber']").item(i).getAttribute("name") , 1)
Next 

Если вместо этого вы будете работать с переменными, вы получите небольшую эффективность:

Dim i As Long, secNumberNodeList As Object, secNumberNode as Object

Set secNumberNodeList = ie.document.querySelectorAll("[name^='secNumber']")

For i = 0 To secNumberNodeList.Length - 1
    Set secNumberNode = secNumberNodeList.item(i)
    secNumberNode.value = Right$(secNumberNode.name , 1)
Next 

Обратите внимание, что значения атрибутов чувствительны к регистру, поэтому вам нужно s в secNumber. Вы можете игнорировать регистр (для символов в диапазоне ASCII) с модификатором i .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...