WKWebview迅速评估JavaScript仅在某些网站上有效

时间:2018-10-24 14:47:20

标签: javascript asp.net swift

我试图用webView.evaluateJavaScript迅速填写登录页面。它在某些网站上有效,但在其他网站上则无效。无法正常运行的网站,我可以在chrome控制台中输入JavaScript并获得肯定的结果,因此我认为JS是正确的。这是不起作用的示例。

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    guard let jsFile = Bundle.main.url(forResource: "injectCredentials", withExtension: "js") else {
        return
    }
    do {
        let injectJS = try String(contentsOf: jsFile)
        let formatted = String(format: injectJS, "NKuser", "NKpassword")
        webView.evaluateJavaScript(formatted) { (value, error) in
            print(value)
        }
    } catch {
    }
}

injectCredentials内容

var timeoutSeconds = 30;

var username = "%@";
var password = "%@";

var checkLogin = setInterval(checkLoginFields, 1000);
setTimeout(function() {
           clearInterval(checkLogin);
           }, timeoutSeconds * 1000);

function checkLoginFields() {
    var usernameInput = document.getElementById('ctl02_txtEmpNo');
    usernameInput.value = '123558';
}

,最后是网页元素。

这是一个.aspx网页。在chrome控制台中输入上述JS将在文本字段中输入文本,但是在iOS应用中,什么也没有发生。但是,完全相同的代码(更改了元素ID)可在其他不是aspx的登录网页上使用。

<td style="text-align: left; padding-bottom: 3px;">
                <input name="ctl02$txtEmpNo" type="text" maxlength="6" size="20" id="ctl02_txtEmpNo" tabindex="1"><div style="visibility:hidden;display:inline-block;width:1px;overflow:hidden;"><input type="password" name="txtFakePassword" id="txtFakePassword" style="width:1px;"></div>
            </td>

1 个答案:

答案 0 :(得分:0)

evaluateJavaScript 仅适用于当前页面数据,如果您要进行一些调用(例如想评估登录脚本),则返回的内容永远不会返回您的值,因此可用于捕获登录回调。其他处理程序,以查看登录行为。

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    if let url = webView.url, let host = url.host {
          if (url.path == loginPath) {
                if let username = self.username, let password = self.password {
                    let js = String(format: "js script", username, password)
                    webView.evaluateJavaScript(js, completionHandler: nil)
                }
            } else if (url.path == "error path") {
                // Login failed
            }
    }

}