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

我想自动进行登录,所以有没有一种方法可以自动填充用户名和密码,选中“我接受条件”标记并按“登录”按钮?

我尝试了这个Autofill Username and Password UIWebView Swift,但是它不起作用,我不是页面的创建者,所以我不完全知道它的结构。

即使iCloud钥匙串(keychain)能填满表格,这也很酷……但也许我问的太多了!

最佳答案

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

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

像这样实现webViewDidFinishLoad委托(delegate)的UIWebView方法:

objective-C :

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    //fill data
    NSString *email = @"[email protected]";
    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的调用,因此,一旦加载了其他页面(执行登录),您可能希望升起一个标志仅在登录页面上尝试)。
  • 10-08 01:05