Posted at

WKWebViewで表示されるHTMLおよびPlainText、JSONを取得する

More than 1 year has passed since last update.


WKNavigationDelegateを受け取る


  • webViewはWKWebViewとする

  • WKNavigationDelegateを受け取るようにする

webView.navigationDelegate = self


WkWebView#evaluateJavaScriptでJavaScript実行

以下のようにdidCommitで、JavaScriptを実行してHTML全体を受け取る

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {

webView.evaluateJavaScript(
"document.body.innerHTML",
completionHandler: { (html: Any?, error: Error?) in
if let html = html as? String {
print(html)
}
}
)
}

もちろん、JavaScriptなのでgetElementByIdで、あるidのinputタグのvalueを得ることもできる

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {

webView.evaluateJavaScript(
"document.getElementById('username').value",
completionHandler: { (value: Any?, error: Error?) in
if let username = value as? String {
print(username)
}
}
)
}


PlainTextやJSONの場合

上記のevaluateJavaScriptで取得するとpreタグの中に入ってくる。(実際はHTMLに改行はなく1行である)。Content-Type:text/plain、もしくは、application/jsonでも、preタグの中に入ってくる。

<html>

<head></head>
<body>
<pre style="word-wrap: break-word; white-space: pre-wrap;">AnyText</pre>
</body>
</html>

getElementsByTagNameでpreの内容を得る

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {

webView.evaluateJavaScript(
"document.getElementsByTagName('pre')[0].innerText",
completionHandler: { (text: Any?, error: Error?) in
if let text = text as? String {
print(text)
}
}
)
}

ちなみにdidCommitじゃなくdidFinishでもevaluateJavaScriptで中身を取れます。didCommitはWebViewで表示される前に取れるようです。