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で表示される前に取れるようです。