使用JavaScript在UIWebView中查找和自动填充HTML登录表单

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)