0

None of the ways I've found to read the body of the html are working, all are returning nil.

//
//  ViewController.swift
//  ProjectGetJSONJasper
//
//  Created by Scott Lydon on 5/1/22.
//

import UIKit
import WebKit

class ViewController: WKWebViewController {

    override var startWebsite: String {
        "https://app.jasper.ai/?_gl=1%2a1r3ye0c%2a_ga%2aMjA2NDczMDkwNy4xNjUxMDI3NjMx%2a_ga_D4P3CS8W5P%2aMTY1MTM4NjA0My43LjEuMTY1MTM4NjA1MS41Mg.."
    }
}


class WKWebViewController: UIViewController {

    var startWebsite: String {
        "overide me!"
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        setupViews()
    }


     func setupViews() {
        let webView = WKWebView()
        webView.navigationDelegate = self
        webView.uiDelegate = self

        webView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(webView)

        webView.load(URLRequest(url: URL(string: startWebsite)!))

        NSLayoutConstraint.activate(
            [
                webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                webView.topAnchor.constraint(equalTo: view.topAnchor),
                webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                webView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            ]
        )
    }

    @objc func evaluated(_ webView: WKWebView, html: String, error: Error?) {
        // override me!
    }
}

extension WKWebViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.documentElement.outerHTML.toString()") { [weak self]
            (html: Any?, error: Error?) in
            guard let html = html else { return }
            self?.evaluated(webView, html: String(describing: html), error: error)
        }
        webView.evaluateJavaScript("document.body.innerHTML") { [weak self]
            (html: Any?, error: Error?) in
            guard let html = html else { return }
            self?.evaluated(webView, html: String(describing: html), error: error)
        }
        webView.evaluateJavaScript("document.documentElement.outerHTML") { [weak self]
            (html: Any?, error: Error?) in
            guard let html = html else { return }
            self?.evaluated(webView, html: String(describing: html), error: error)
        }
        webView.evaluateJavaScript("document") { [weak self]
            (html: Any?, error: Error?) in
            guard let html = html else { return }
            self?.evaluated(webView, html: String(describing: html), error: error)
        }
    }
}

extension WKWebViewController: WKUIDelegate {

    // So alerts and popups appear to be intercepted and available for my control through delegate methods!
    // It can also be a way to print or send information to myself from the webpge.  This confirms that my javascript was executed!!!! woot woot!
    func webView(
        _ webView: WKWebView,
        runJavaScriptAlertPanelWithMessage message: String,
        initiatedByFrame frame: WKFrameInfo
    ) async {
        print("reached: ", message)
        print("bla")
    }
}

2
  • Did you checked [this]) stackoverflow.com/questions/43170736/…) ? Commented May 1, 2022 at 9:26
  • To the linked question, it’s unrelated because my evaluatejavascript is getting called back, however, the answers offer some ways to get better responses. I will explore those! Thank you. Commented May 1, 2022 at 17:23

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.