如何使用 AutoHotKey 成功填充 angular 输入字段?我可以设置值,但收到一条消息,提示未输入任何内容
How to succesfully fill an angular input field using AutoHotKey? I can set the value, but get a message implying nothing was input
我正在尝试使用 AHK 在 IE11 中自动登录我的闭路电视系统网页。我认为登录页面使用 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
username/password 视觉上如我所料填充,但是当脚本 "clicks" 登录按钮时,我收到一条错误消息,提示用户名字段为空。如果我手动输入并删除一个字母并重试,我会在密码字段中收到相同的消息。如果我在该字段中手动键入并删除单个字母,则登录按钮有效。
我从未使用过 Angular,所以我不知道当用户在字段中键入内容时幕后发生了什么魔法。我怎样才能让它相信这些领域里有东西?
这是登录页面的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"> </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"> </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>
谢谢
您不能将注意力集中或单击元素,然后使用多种发送类型之一发送数据,直到您找到合适的发送类型吗?有时发送一个字母和一个退格键然后等待发送数据然后等待 .2 秒并将制表符发送到下一个字段(或重复该过程:
...
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}
...
试试看。 . .
编辑每个 OP 成功:
....
username_input := wb.document.getElementById("username")
username_input.focus()
SendInput, myusername{tab}
SendInput, mypassword{enter}
我正在尝试使用 AHK 在 IE11 中自动登录我的闭路电视系统网页。我认为登录页面使用 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
username/password 视觉上如我所料填充,但是当脚本 "clicks" 登录按钮时,我收到一条错误消息,提示用户名字段为空。如果我手动输入并删除一个字母并重试,我会在密码字段中收到相同的消息。如果我在该字段中手动键入并删除单个字母,则登录按钮有效。
我从未使用过 Angular,所以我不知道当用户在字段中键入内容时幕后发生了什么魔法。我怎样才能让它相信这些领域里有东西?
这是登录页面的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"> </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"> </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>
谢谢
您不能将注意力集中或单击元素,然后使用多种发送类型之一发送数据,直到您找到合适的发送类型吗?有时发送一个字母和一个退格键然后等待发送数据然后等待 .2 秒并将制表符发送到下一个字段(或重复该过程:
...
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}
...
试试看。 . .
编辑每个 OP 成功:
....
username_input := wb.document.getElementById("username")
username_input.focus()
SendInput, myusername{tab}
SendInput, mypassword{enter}