at0*_*m87 11 html javascript textfield uiwebview ios
我有一个UIWebView,它像一个互联网浏览器,并加载它所在的网页的HTML.
在webViewController中,方法webViewDidFinishLoad,当网页在UIWebView上完成加载时,会从网页加载HTML.
从HTML我想筛选出文本字段,以便使用我的数据库中存储的值来促进该文本字段的自动填充.
有什么办法吗?该方法应该能够在所有网站上工作.
在UIWebView中为文本字段设置文本几乎可以帮助我,但我已经尝试过,文本字段永远不会被填充.
在登录页面中将有两个文本字段,所以我尝试使用
document.getElementsByTagName('INPUT')[0].value
document.getElementsByTagName('INPUT')[1].value
Run Code Online (Sandbox Code Playgroud)
输入值但没有魔法.
编辑:我已尝试在阵列中的其他位置.Facebook的用户名和密码是[3]和[4],而亚马逊则是[11]和[14].所以字段使用上述方法的位置有点随机.任何其他适用于所有网站的建议?
Edit2:我可以试试
document.getElementsById('id_name').value
Run Code Online (Sandbox Code Playgroud)
但ID方法不适用于我,因为我需要一种通用方法来识别任何网站上的文本字段(所有网站使用不同的ID名称)
在我看来,有些网站一直为用户名设置tabindex ="1",密码为tabindex ="2".
例如在Facebook这样的网页中:
<input type="text" class="inputtext" name="email" id="email" value="" tabindex="1" />
<input type="password" class="inputtext" name="pass" id="pass" tabindex="2" />
Run Code Online (Sandbox Code Playgroud)
亚马逊:
<input id="ap_email" name="email" value="" type="email" size="30" maxlength="128" tabindex="1" autocorrect="off" autocapitalize="off" />
<input id="ap_password" name="password" type="password" maxlength="1024" size="20" tabindex="2" onkeypress="displayCapsWarning(event,'ap_caps_warning', this);" class="password"/>
Run Code Online (Sandbox Code Playgroud)
dbs银行:
<input type="text" tabindex="1" maxlength="20" size="32" name="UID" id="UID">
<input type="password" onkeyup="keyUp(event)" onkeydown="return onlyNumerics(event)" tabindex="2" maxlength="9" size="32" name="PIN" id="PIN" autocomplete="off">
Run Code Online (Sandbox Code Playgroud)
但我没有在谷歌看到这个tabindex:
<input type="text" spellcheck="false" name="Email" id="Email" value="">
<input type="password" name="Passwd" id="Passwd">
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
最终目标是能够筛选出所有/任何网站的用户名和密码文本字段.=)
Joh*_*rug 17
好的,所以没有一个适合所有人.你可以非常接近,但它永远不会在每个网站上运行,因为一个网站可能有多个登录表单,或者组成用户名的多个字段(一些银行有这个).
但这会让你朝着正确的方向前进.要获取所有密码字段(大多只是一个),请使用以下命令:
document.querySelectorAll("input[type='password']")
Run Code Online (Sandbox Code Playgroud)
要获取所有文本输入字段,请使用以下命令:
document.querySelectorAll("input[type='text']")
Run Code Online (Sandbox Code Playgroud)
对于文本输入字段,您很可能会得到多个结果(可能是搜索字段和内容).因此,您必须迭代它们并查找常用ID或名称,例如"username","user","user_name","UID"等.
这是你在Objective-C中使用它的方法:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *savedUsername = @"peter";
NSString *savedPassword = @"Pan123";
if (savedUsername.length != 0 && savedPassword.length != 0) {
//create js strings
NSString *loadUsernameJS = [NSString stringWithFormat:@"var inputFields = document.querySelectorAll(\"input[type='text']\"); \
for (var i = inputFields.length >>> 0; i--;) { inputFields[i].value = '%@';}", savedUsername];
NSString *loadPasswordJS = [NSString stringWithFormat:@"document.querySelectorAll(\"input[type='password']\").value ='%@'", savedPassword];
//autofill the form
[self.webView stringByEvaluatingJavaScriptFromString: loadUsernameJS];
[self.webView stringByEvaluatingJavaScriptFromString: loadPasswordJS];
}
}
Run Code Online (Sandbox Code Playgroud)
请注意:它使用用户名填充每个文本字段,并使用密码填充第一个密码字段.
请享用.
小智 5
基于之前的答案,我创建了这3种方法.
这个方法将填充它应该在很多情况下工作的用户名/电子邮件字段:
- (void)completeUserFieldsForWebView:(UIWebView *)webView withUsername:(NSString *)username {
NSString *loadUsernameJS =
[NSString stringWithFormat:@"var inputFields = document.querySelectorAll(\"input[type='email']\"); \
for (var i = inputFields.length >>> 0; i--;) { inputFields[i].value = '%@';}", username];
NSString *loadText =
[NSString stringWithFormat:@"var inputFields = document.querySelectorAll(\"input[type='text']\"); \
for (var i = inputFields.length >>> 0; i--;) { inputFields[i].value = '%@';}", username];
[webView stringByEvaluatingJavaScriptFromString: loadUsernameJS];
[webView stringByEvaluatingJavaScriptFromString: loadText];
}
Run Code Online (Sandbox Code Playgroud)
这个将填写密码字段:
- (void)completePasswordFieldsForWebView:(UIWebView *)webView withPassword:(NSString *)password {
NSString *loadPasswordJS =
[NSString stringWithFormat:@"var passFields = document.querySelectorAll(\"input[type='password']\"); \
for (var i = passFields.length>>> 0; i--;) { passFields[i].value ='%@';}", password];
[webView stringByEvaluatingJavaScriptFromString: loadPasswordJS];
}
Run Code Online (Sandbox Code Playgroud)
并登录:
- (void)clickOnSubmitButtonForWebView:(UIWebView *)webView {
NSString *performSubmitJS = @"var passFields = document.querySelectorAll(\"input[type='submit']\"); \
passFields[0].click()";
[webView stringByEvaluatingJavaScriptFromString:performSubmitJS];
}
Run Code Online (Sandbox Code Playgroud)