如何使用用户默认值或JavaScript在WKWebView中自动填充表单

问题描述

您好,Swift开发人员!。 我是快速编程的新手,几乎不需要帮助。

我正在开发一个非常简单的应用程序,该应用程序应该仅使用WkWebView自动填充加载其页面上的发货单来加载网络。

我已成功设法在webView(WkWebView)中获取页面
首先,它加载了该网址https://www.adidas.com/us,在选择要放入购物车中的商品后,它会到达该交付页面https://www.adidas.com/us/delivery在这里我们必须填写this表格。在此之前,不需要登录信息。

我正在尝试同时使用UIWebViewWkWebView来完成此操作,但无济于事,这是我的代码UIWebView部分已注释。

class ViewController: UIViewController,WKUIDelegate {

@IBOutlet weak var uiWebView: UIWebView!

var webView: WKWebView!
let url: String = "https://www.adidas.com/us/delivery"
let defaults = UserDefaults.standard

override func viewDidLoad() {
    super.viewDidLoad()
    
    //WKWebView programatically so it can run below iOS 11
    let webConfiguration = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero,configuration: webConfiguration)
    webView.uiDelegate = self
    view = webView
    
    if let safeUrl = URL(string: url){
        
        let request = URLRequest(url: safeUrl)
        webView.load(request)
        
    }
    
    //        uiWebView.loadRequest(NSURLRequest(url: NSURL(string: url)! as URL) as URLRequest)
    //        let result = uiWebView.stringByEvaluatingJavaScript(from: "document.title")
    //        print("result is: \(result!)")
  
        self.webView.evaluateJavaScript("document.getElementById('di-id-cab9a55c-9d253ce3').value = 'Hello'") { (result,error) in
            print(result) //This will Print Hello
        }

    
}



//    func webViewDidFinishLoad(_ webView: UIWebView) {
//
//        let email = defaults.string(forKey: "EMAIL")
//        let password = defaults.string(forKey: "Pass")
//
//        let fillForm = "document.getElementById('f_707d6a95-3ef9-4b76-a162-9361b4ef7d4d').value = \(password)"
//        webView.stringByEvaluatingJavaScript(from: fillForm)
//    }

}

还有Here's First Name字段的inspect元素的屏幕截图。

在此之后,我将使用用户认值来自动填充数据。那一步我知道该怎么做才卡在这里

请问我有什么有用的代码段或建议吗?我真的被困在这一点上! 预先感谢

解决方法

首先:停止使用UIWebView,因为它已从一侧弃用,并从2020年12月开始停止由AppStore支持。

在加载页面时,您应该将navigationDelegate设置为WKWebView并将值设置为webView(_ webView: WKWebView,didFinish navigation: WKNavigation!)上的字段,例如:

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

extension ViewController : WKNavigationDelegate {
    
    func webView(_ webView: WKWebView,didFinish navigation: WKNavigation!) {
        // Set a delay for dynamic pages
        //DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            let fillForm = "document.getElementsByName('firstName')[0].value = 'My Name'"
            webView.evaluateJavaScript(fillForm,completionHandler: nil)
        //}
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...