Как успешно заполнить поле ввода angular, используя AutoHotKey? Я могу установить значение, но получить сообщение о том, что ничего не было введено - PullRequest
2 голосов
/ 27 марта 2020

Я пытаюсь автоматизировать вход на веб-страницу моей системы видеонаблюдения в IE11 с помощью AHK. Я думаю, что страница входа использует Angular 1.2.0.

Вот мой сценарий:

wb := ComObjCreate("InternetExplorer.Application")

wb.Visible := True

wb.Navigate("http://192.168.1.6/doc/page/login.asp")

While wb.readyState != 4 || wb.document.readyState != "complete" || wb.busy ; wait for the page to load
   Sleep, 10

Sleep, 100

username_input := wb.document.getElementById("username")
password_input := wb.document.getElementById("password")

username_input.value := "myusername"
password_input.value := "mypassword"

wb.document.querySelector(".login-btn").click()

Return

Имя пользователя / пароль визуально заполняются, как я ожидаю, но когда сценарий "щелкает" при входе в систему я получаю сообщение об ошибке, означающее, что поле имени пользователя пустое Если я вручную наберу и удалю одну букву и попробую еще раз, я получу то же сообщение для поля пароля. Если я вручную ввожу и удаляю одну букву в этом поле, то кнопка входа работает.

Я никогда не использовал Angular, поэтому я понятия не имею, что происходит за кулисами c. когда пользователь вводит в поле. Как я могу заставить его поверить, что в этих полях что-то есть?

Вот HTML страницы входа, если это поможет:

<!doctype html>
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" >
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
    <meta http-equiv="Expires" content="0" />
    <script>
        document.write("<link type='text/css' href='../ui/css/ui.css?version=" + new Date().getTime() + "' rel='stylesheet' />");
    </script>
</head>
<body ng-keypress="docPress($event)" ng-controller="loginController" ng-cloak class="ng-cloak">
<div class="login" id="login">
    <div class="top">
        <div class="logo"></div>
        <div class="language">
            <div class="language-show" ng-click="showLanguageList($event)"><span class="current-language" id="current_language"></span></div>
            <div class="language-list" id="language_list" ng-click="changeLanguage($event)"></div>
        </div>
    </div>
    <table cellspacing="0" cellpadding="0" border="0" class="middle">
        <tr>
            <td class="login-l">&nbsp;</td>
            <td class="login-m">
                <div class="login-part">
                    <div class="line"></div>
                    <div class="login-error">
                        <div class="inputValidTip" ng-show="szErrorTip!=''"><i class='error'></i><label>{{szErrorTip}}</label></div>
                    </div>
                    <div class="login-user">
                        <input type="text" class="login-input" id="username" ng-model="username"maxlength="32" autocomplete="off" placeholder="{{oLan.username}}" />
                        <i class="icon-user"></i>
                    </div>
                    <div class="login-item">
                        <input type="password" class="login-input" id="password" ng-model="password" maxlength="16" placeholder="{{oLan.password}}" />
                        <i class="icon-pass"></i>
                    </div>
                    <div class="login-item">
                        <button type="button" class="btn btn-primary login-btn" ng-click="login()"><label ng-bind="oLan.login"></label></button>
                    </div>
                    <div class="login-item anonymous" ng-show="anonymous">
                        <span ng-bind="oLan.anonymous" ng-click="login('anonymous')"></span>
                    </div>
                </div>
            </td>
            <td class="login-r">&nbsp;</td>
        </tr>
    </table>
    <div class="footer" id="footer"></div>
</div>
<div id="active" class="msg-content-wrap">
    <div class="msg-content">
        <div class="password">
            <span class="desc"><label ng-bind="oLan.username"></label></span>
            <span><label ng-bind="activeUsername"></label></span>
        </div>
        <div class="password">
            <span class="desc"><label ng-bind="oLan.password"></label></span>
            <span><input id="activePassword" type="password" ng-model="activePassword" maxlength="16" onpaste="return false;" /></span>
            <span class="inputValidTip"><i ng-class="{true:'success', false:'error'}[activePasswordStatus]"></i></span>
        </div>
        <div strength class="passwordstrength" lan="oLan" o-password="activePassword" o-username="activeUsername"></div>
        <div class="password">
            <span class="desc"><label ng-bind="oLan.confirm"></label></span>
            <span><input type="password" onpaste="return false;" ng-model="activePasswordConfirm" maxlength="16" /></span>
        </div>
    </div>
</div>
<div id="main_plugin" class="no-window"></div>
</body>
<script id="seajsnode" src="../script/lib/seajs/seajs/sea-2.1.1.min.js"></script>
<script>
    document.write("<script src='../script/lib/seajs/config/sea-config.js?version=" + new Date().getTime() + "' ></scr" + "ipt>");
</script>
</html>

Спасибо

1 Ответ

1 голос
/ 03 апреля 2020

Не могли бы вы сосредоточиться или щелкнуть по элементам, а затем отправить данные с одним из нескольких типов отправки, пока не найдете тот, который работает? Иногда полезно отправить письмо и возврат, затем подождать, чтобы отправить данные, затем подождать .2 se c и отправить вкладки в следующее поле (или повторить процесс:

...
wb.document.getElementById("username").click() ; or .focus()
SendInput, x{bs}
Sleep, 200
SendInput, myusername
Sleep, 200
SendInput, {tab} ; or {tab x} to pw field and skip next line
wb.document.getElementById("password").click()
Sleep, 200
SendInput, mypassword
Sleep, 200
SendInput, {tab}
...

Попробуйте и посмотрите. .

...