0

如何创建一个接受 URL 参数并使用 evaluateJavaScript 返回 HTML 的 macOS 方法?

我想抓取一个使用 JavaScript 的 URL,所以 String(contentsOf: url) 和 URLSession.shared.dataTask(with: url) 似乎都不起作用。

下面的代码有效,但它创建了一个全局,而不是返回一个字符串。我想要可以在其他类似项目中重用的代码。

我可以使用 didSet{} 或 GCD DispatchGroup() 和 group.enter() 和 group.leave() 创建类或 ViewController 扩展来创建仅在页面加载和 JavaScript 完成时返回的简单方法吗?我假设我需要一个类来捕获 WKNavigationDelegate 调用。

我想要一个 macOS 方法,而不是 iOS 方法。

这是我的工作代码:

ViewController.swift

import Cocoa
import WebKit

class ViewController: NSViewController, WKNavigationDelegate {
var webView: WKWebView!
var  webString: String = "" {
    didSet {
        print("webString: \(webString.count) Bytes")
        print("\(webString)")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.webView = WKWebView()
    webView.navigationDelegate = self

    let url = URL(string: "https://www.someWebsite.com")!
    let myRequest = URLRequest(url: url)
    webView.load(myRequest)
}

// WKNavigationDelegate methods
func webView(_ webView: WKWebView, didFinish: WKNavigation!) {
    print(#function)

    webView.evaluateJavaScript(
        "document.documentElement.outerHTML.toString()",
        completionHandler: { (html: Any?, error: Error?) in
            self.webString = html as! String
            print("In compHandler, HTML: \(self.webString.count) bytes\n")
    })
}

func webView(_ webView: WKWebView, didFail: WKNavigation!, withError: Error) {
    print(#function)
    print("ERROR: Error=\(withError)")
}

我想要与我用于同步下载的代码类似的东西:

func downloadDataTask(url: String) -> String {
var returnStr = ""

guard let myURL = URL(string: url) else {
    showErrorAlert(
        title: "ERROR: Invalid URL",
        message: "Invalid URL in downloadDataTask()\n  URL:'\(url)'")
    return("Error: Invalid URL: '\(url)'")
}

let group = DispatchGroup()
group.enter()

let task = URLSession.shared.dataTask(with: myURL) { data, urlResponse, error in

    if let myData = data {
        let string = String(decoding: myData, as: UTF8.self)
        returnStr = string

        group.leave()
    } else {
        showErrorAlert(
            title: "ERROR: Unable to load HTML from URL",
            message: "Unable to load HTML in downloadDataTask()\n")
        group.leave()
    }
}
task.resume()

// wait for async completion handler task to complete
group.wait()

return(returnStr)
}

任何帮助,将不胜感激!

4

0 回答 0