Получить значения со страницы HTML с помощью SWIFT - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно получить все значения со следующей HTML-страницы, такие как data0, data1, data2 и т. Д.,

</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>)

Я использую приведенный ниже код swift для получения всех значений внутри формы,

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

Но я получаю ноль из переменной результата.Пожалуйста, помогите, как получить все значения внутри формы, используя язык SWIFT.

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Вам необходимо добавить метод javascript в ваш HTML-файл, который будет передавать значения форм в вашем быстром коде. Вы можете сделать это с помощью WKScriptMessageHandler.

В вашем HTML-файле добавьте следующий код. Я назвал его index.html и поместил локально в приложение.

<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 ({значения}) ; отправит со значения из JavaScript в Swift. Здесь myApp - это имя обработчика, который я добавил в быстрый код.

Вот быстрый код

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)
    }
}
0 голосов
/ 25 июня 2019

Я использовал следующий код, чтобы получить все значения формы. Это сработало отлично.

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 }

    })
0 голосов
/ 12 июня 2019

Форма не имеет значения, вы должны извлечь ее из дочерних элементов input.Также не то, что getElementsByName возвращает NodeList и ни одного элемента.

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