個人的にやりたかったこと
例えばというHTML要素があったりなかったりして、それの存在チェックによって処理を切り替えたい。evaluateJavaScriptを使用すれば任意のjavascrriptが実行できるのでそれでチェックできるはず。
evaluateJavaScriptを使用してdivタグの要素を取得する
var webview: WKWebView = WKWebView() // ...... WKWebView周りの処理 webView.evaluateJavaScript( "document.getElementById(\"divArea\")", completionHandler: { (html, error) -> Void in print(html ) if html != nil { // ... } })
htmlの中身は以下
取り出し方がわからない...
html Any? some
payload_data_0 Builtin.RawPointer
payload_data_1 Builtin.RawPointer
payload_data_2 Builtin.RawPointer
payload_data_0 Builtin.RawPointer
payload_data_1 Builtin.RawPointer
payload_data_2 Builtin.RawPointer
evaluateJavaScriptを使用してBool値を受け取る
ならばnullと比較すればどうか?
javascriptなのでnilじゃないよ!
webView.evaluateJavaScript( "document.getElementById(\"divArea\") == null", completionHandler: { (html, error) -> Void in print(html") // Optional(1) print(html as? String") // nil print(html as? Bool") // true print(html as? Int") // 1 })
てっきり文字列で帰ってくると思っていたのでちょっとハマる。
evaluateJavaScriptを使用して浮動小数点数を受け取る
もう少し調べる
webView.evaluateJavaScript( "0.1", completionHandler: { (html, error) -> Void in print(html) // Optional(0.1) print(html as? String) // nil print(html as? Int) // Optional(0) print(html as? Double) // (0.10000000000000001) if html as? String != nil { self.keyChain.setString("1", forKey: "loggedin") } else { self.keyChain.setString("", forKey: "loggedin") } })
0.1の取り出し方がわからないがなんとなく仕組みはわかってきた。
evaluateJavaScriptを使用してテキストフィールドの値を受け取る
テキストフィールドの中に数値や文字が入っていたらどうなるんだろう?
<input type="text" id="textField">
がある画面に対して以下のjavascriptを実行する
webView.evaluateJavaScript( "document.getElementById(\"textField\").value", completionHandler: { (html, error) -> Void in print(html as? String) // Optional("13577") print(html as? Int) // nil })
数値でなく文字列で返ってくるらしい
まとめ
・javascriptの演算はjavascriptの仕様に準ずる
・HTMLの要素は文字列として取得される
ということ?
わかってしまえばそこまで複雑でもない
ただしDOM要素の変換の仕方と浮動小数点数の扱いがよくわからなかった