简体   繁体   中英

Get Values from HTML page using SWIFT

I have to retrieve all values from the following HTML page like data0, data1, data2 etc,

</head><body onload="OnLoadEvent();">
<form name="form1" action="https://products.cs.co.in/demo/jsp/cs/HResult.jsp" method="post">
    <input type="hidden" name="data0" value="7320851">
    <input type="hidden" name="data1" value="449781">
    <input type="hidden" name="data2" value="">
    <input type="hidden" name="data3" value="ACEE6F7C7">
    <input type="hidden" name="data4" value="">
    <input type="hidden" name="ref" value="">

    <input type="hidden" name="data5">
    <input type="hidden" name="result" value="">
    <input type="hidden" name="data6" value="">
    </form>
    <div align="center" class="text12">
    <br><br>
     Please do not refresh / close the window
    <br><br>
    </div>
</body>)

I am using the below swift code to retrieve all values inside Form ,

 webView.evaluateJavaScript("document.getElementsByName('form1').value") { (result, error) in
        print(result as Any)
        print(error as Any)
    }

But i am receiving nil from result variable. Kindly help on how to retrieve all values inside form using SWIFT language.

The form has no value, you have to retrieve it from the children input elements. Also not that getElementsByName returns a NodeList and not a single element.

val values = {};
Array.from(document.getElementsByName("form1")[0].children).forEach(input => {
    values[input.getAttribute("name")] = input.value;
});

You need to add a javascript method in your HTML file that will pass form values in your swift code. You can do this with WKScriptMessageHandler.

In your HTML file, add the following code. I named it index.html and placed locally in app.

<head>
    <script type="text/javascript">
        function OnLoadEvent() {
            var test = document.getElementsByName("form1")[0].children
            var values = {};
            Array.from(test).forEach(input => {
                values[input.getAttribute("name")] = input.value;
             });
            window.webkit.messageHandlers.myApp.postMessage({values}); 
        }
    </script>
</head>

window.webkit.messageHandlers.myApp.postMessage({values}) ; will send from value from javascript to swift. Here myApp is a name of handler that i added in swift code.

Here is swift code

class ViewController: UIViewController, WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            let body = message.body
            if let dict = body as? Dictionary<String, AnyObject> {
                let formData = dict["values"] as! [String: AnyObject]
                for (fieldName, fieldValue) in formData {
                    print("fieldName: \(fieldName) fieldValue: \(fieldValue)")
                }
            }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let config = WKWebViewConfiguration()
        config.userContentController.add(self, name: "myApp")
        let wkWebView = WKWebView(frame: self.view.frame, configuration: config)
        let url = Bundle.main.url(forResource: "index", withExtension: "html")!
        wkWebView.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        wkWebView.load(request)
        self.view.addSubview(wkWebView)
    }
}

I used the following code to get all form values. It worked perfectly.

let jsCode = "" + "function parseForm(form){" +
        "var values='';" +
        "console.log('RESULT 1='+form.elements);" +
        "for(var i=0 ; i< form.elements.length; i++){" +
        "   values+=form.elements[i].name+'='+form.elements[i].value+'&'" +
        "}" +
        "return [values]" +
        "   }" +
        "for(var i=0 ; i< document.forms.length ; i++){" +
        "   parseForm(document.forms[i]);" +
    "};"


    webView.evaluateJavaScript(jsCode, completionHandler: { (result, error) in
        print(result as Any)
        print(error as Any)
        guard let resultArray = result as? [AnyObject] else { return }

    })

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM