我试图用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>
答案 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
}
}
}