Game Eagle
Game Eagle

Reputation: 183

evaluateJavaScript swift nil

Please tell me, I'm trying to take input value from webview. Why do I get "nil". What could be the problem? Screen provided below

enter image description here Code provided below

import SwiftUI
import WebKit

struct ContentView: View {
  var body: some View {
    WebView().edgesIgnoringSafeArea(.all)
  }
}

struct WebView: UIViewRepresentable {
  func makeUIView(context: Context) - > WKWebView {
    let webView = WKWebView()
    webView.scrollView.isScrollEnabled = false
    return webView
  }


  func updateUIView(_ webView: WKWebView, context: Context) {
    let liveView = "https://**/"
    if let url = URL(string: liveView) {
      let request = URLRequest(url: url)
      webView.load(request)
      webView.evaluateJavaScript("document.getElementById('ses').value") {
        (result, error) in
        print(result)
      }
    }
  }
}

Upvotes: 0

Views: 1672

Answers (3)

M_Khater
M_Khater

Reputation: 109

You need to check if webView is completely loaded.

To check if webView is loaded:

class ViewController: WKNavigationDelegate{

    let webView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        webView.navigationDelegate = self
        
        let myURL = URL(string:"https://someWebSite.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
        
        
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("Loaded")
    }
}

for more info about navigationDelegate

Upvotes: 1

Game Eagle
Game Eagle

Reputation: 183

You need to wait until the page loads.

let timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) {
  (timer) in
  webView.evaluateJavaScript("document.getElementById('ses').value") {
    (result, error) in
    print(result!)
  }
}

Upvotes: 2

Matvii Hodovaniuk
Matvii Hodovaniuk

Reputation: 513

It seems like you don't have this element in your document.

// element exists
console.log(document.getElementById('demo').value)

// element doesn't exist
console.log(document.getElementById('foo'))
<div id="demo" value="demo-value">Demo</div>

Upvotes: -1

Related Questions