在UIWebView中自动填充用户名和密码

我正在为我做一个非常简单的应用程序。 当我启动这个应用程序,它只是把我带到这个网页https://social.tre.it/expert 。

我想自动login,所以有办法自动填充用户名和密码,检查“我接受条件”标志,并推“login”button?

我试过这个自动填充用户名和密码UIWebView Swift,但它不起作用,我不是页面的创build者,所以我不知道它是如何构造的。

即使iCloud的钥匙链可以填写表格也会很酷……但是也许我问的太多了!

你可以使用JavaScript来做到这一点。

如果您检查页面,您可以很容易地发现文本input字段( expert_emailexpert_password )的ID,并执行一些JS代码来填充它们。

实现UIWebView委托的webViewDidFinishLoad方法,如下所示:

Objective-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();"]; }); } 

迅速:

 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代码的这种方法在处理自己的页面时更合理。

编辑:

我更新了代码,演示如何检查checkbox以及如何提交表单。

一些说明:

  • 当login失败时,页面被重新加载,所以你最终将无休止地调用webViewDidFinishLoad因为你试图一遍又一遍地提交,所以你可能想添加一些逻辑来打破这种情况。 这就是为什么我提交之前要延迟才能看到发生了什么。
  • 除了前面的信息webViewDidFinishLoad ,在login成功后(无论如何redirect到下一页),您都将调用webViewDidFinishLoad ,所以一旦加载了不同的页面,您可能需要提升一个标志(执行login尝试只有在login页面上)。