我正在为我做一个非常简单的应用程序。当我启动此应用时,它只是将我带到此网页https://social.tre.it/expert。
我想自动登录,有没有办法自动填写用户名和密码,检查“我接受条件”标记并按“登录”按钮?
我试过这个Autofill Username and Password UIWebView Swift但它不起作用,我不是页面的创建者所以我不确切知道它的结构。
即使iCloud钥匙串填写表格也会很酷......但也许我的要求太多了!
答案 0 :(得分:10)
您可以使用JavaScript来执行此操作。
如果你检查页面,你可以很容易地发现文本输入字段的ID(expert_email
和expert_password
)并执行一些JS代码来填充它们。
实现webViewDidFinishLoad
委托的UIWebView
方法,如下所示:
<强> 目的-C: 强>
- (void)webViewDidFinishLoad:(UIWebView *)webView {
//fill data
NSString *email = @"myemail@email.com";
NSString *password = @"mypassword";
NSString *fillDataJsCall = [NSString stringWithFormat:@"document.getElementById('expert_email').value = '%@';document.getElementById('expert_password').value = '%@';", email, password];
[webView stringByEvaluatingJavaScriptFromString:fillDataJsCall];
//check checkboxes
[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('expert_remember_me').checked = true; document.getElementById('expert_terms_of_service').checked = true;"];
//submit form
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void)
{
[webView stringByEvaluatingJavaScriptFromString:@"document.forms[\"new_expert\"].submit();"];
});
}
<强> SWIFT: 强>
func webViewDidFinishLoad(webView: UIWebView) {
// fill data
let savedUsername = "USERNAME"
let savedPassword = "PASSWORD"
let fillForm = String(format: "document.getElementById('expert_email').value = '\(savedUsername)';document.getElementById('expert_password').value = '\(savedPassword)';")
webView.stringByEvaluatingJavaScriptFromString(fillForm)
//check checkboxes
webView.stringByEvaluatingJavaScriptFromString("document.getElementById('expert_remember_me').checked = true; document.getElementById('expert_terms_of_service').checked = true;")
//submit form
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()){
webView.stringByEvaluatingJavaScriptFromString("document.forms[\"new_expert\"].submit();")
}
}
这应该填写您的信息。但是,如果此网站将来更改其结构,则此代码很容易破解。当您处理自己的页面时,这种执行JS代码的方法更合理。
修改强>
我更新了代码以演示如何选中复选框以及如何提交表单。
一些注意事项:
webViewDidFinishLoad
,因为您尝试反复提交,因此您可能需要添加在这种情况下要打破一些逻辑。这就是我在提交之前提出延迟的原因,以便能够看到发生了什么。webViewDidFinishLoad
,这样您可能希望在不同的时候举起一个标志页面加载(仅在登录页面上执行登录尝试)。