SWIFT:填写HTML输入[type =“text”]

时间:2018-06-01 22:38:26

标签: ios swift xcode login uiwebview

如何填写当前在Web视图中显示的HTML表单上的字段? 此应用程序的目的是自动登录到网站。 根据不同的教程,我主要是复制粘贴一个快速的代码,但我的不起作用。能够暗示错误是什么,甚至完全不同的方法是非常值得赞赏的。

我要登录的website的重要部分是这样构建的:

text-field 用户名:

<input type="text" class="form-control" name="username" id="username" placeholder="Username:">

text-field 密码:

<input type="password" class="form-control" name="password" id="password" maxlength="20" placeholder="Passwort:">

LogIn-Button (提交登录信息):

<input type="submit" value="login" class="btn btn-default">

ViewController.swift 快速代码

它只是加载网站,但没有填写用户名或密码而没有提交。

@IBOutlet weak var MyWebView: UIWebView!

func webViewDidFinishLoad(MyWebView: UIWebView) {

    // fill data
    let savedUsername = "USERNAME"
    let savedPassword = "PASSWORD"

    let fillForm = String(format: "document.getElementById('username').value = '\(savedUsername)';document.getElementById('password').value = '\(savedPassword)';")
    MyWebView.stringByEvaluatingJavaScript(from: fillForm)

    //submit form
    let deadlineTime = DispatchTime.now() + .seconds(1)
    DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
        MyWebView.stringByEvaluatingJavaScript(from: "document.value[\"login\"].submit();")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL (string: "https://www.austrocontrol.at/flugwetter/")
    MyWebView.loadRequest(URLRequest(url: url!))
    webViewDidFinishLoad(MyWebView: MyWebView)
}

我不知道如何处理我从Xcode模拟器获得的输出,但它可能在某种程度上有所帮助:

[...] Starting WebFilter logging for process AustroControl Viewer
[...] _userSettingsForUser : (null)
[...] _WebFilterIsActive returning: NO
[...] [MediaRemote] [AVOutputContext] WARNING: AVF context unavailable for +[MRAVOutputContext sharedAudioPresentationContext]_block_invoke
[...] [MediaRemote] [AVOutputContext] WARNING: AVF context unavailable for +[MRAVOutputContext createOutputContextWithUniqueIdentifier:]

1 个答案:

答案 0 :(得分:2)

首先:最好使用WKWebView

您可以制作一个函数,在您的WebView中运行JavaScript,并在提交表单之前填写HTML表单。

private func setWebViewValue(name: String, data: String) {
    let jsFunc = "document.getElementById(\"\(name)\").value = \"\(data)\""
    webView.evaluateJavaScript(jsFunc, completionHandler: nil)
}