获取WKWebView内部区域的快照

时间:2019-06-25 17:36:54

标签: ios webview uiwebview wkwebview

我正在尝试获取网站上存在的验证码快照,以便可以要求我的用户在其他UI中键入该验证码。 https://www.camsonline.com/InvestorServices/COL_ISAccountStatement.aspx 我使用

找到了验证码的框架
document.getElementById('captchImg').getBoundingClientRect();

但是此框架是参考Web视图而不是iOS窗口。我确实尝试使用

进行转换
webview.convert(CGRect(x: 685, y: 1063), to: self.view)

但这似乎并不能解决问题。我只想要来自验证码快照的图像。我该怎么办?我在SO上尝试了许多答案,但到目前为止没有任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为您可以使用base64编码保存缓存的图像,然后将其转换为所需的UIImage。例如,将其放回另一个UIImageView。

此代码示例仅加载到self.imageView中,您可以使用它进行任何操作。

   func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        let str = "var c = document.createElement('canvas'); var ctx = c.getContext('2d'); ctx.drawImage(document.getElementById('captchImg'), 100, 40); var value = c.toDataURL(); value.split(',')[1]; "

        self.webView.evaluateJavaScript(str) { (value, error) in
             if error == nil {
                 if let img = value as? String {
                      self.imageView.image = self.base64ToImage(base64: img)
                 }
             }
         }
    }

    func base64ToImage(base64: String) -> UIImage? {
        var img: UIImage = UIImage()
        if (!base64.isEmpty) {
            if let decodedData = NSData(base64Encoded: base64 , options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) {
                if let decodedimage = UIImage(data: decodedData as Data) {
                    img = (decodedimage as UIImage?)!
                    return img
                }
            }
        }
        return nil
    }