我需要预先填写UIWebView
中的文字字段,并了解javascript
是解决此问题的最佳方法。不幸的是,我对javascript
一无所知,并且在过去的几个小时里一直在摸索,无处可去。
最新的拙劣尝试:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// username field id = username_5 & pw field id = password_5
NSString *javascript = @"\
var user = 'testUser';\
var pw = 'testPW';\
document.getElementById('username_5').value = user; \
document.getElementById('password_5').value = pw; \
;";
// Execute JS
[_emailWebView stringByEvaluatingJavaScriptFromString:javascript];
}
有人能指出我正确的方向吗?
- 编辑 -
我还尝试过延迟调用,以防页面没有完全加载,如果我调用类似的东西:
- (void)webViewDidFinishLoad:(UIWebView *)wv
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(injectJavascript) withObject:nil afterDelay:1.0];
}
- (void)injectJavascript
{
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('password_5').value = 'testPW';"]];
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.alert('test');"]];
}
出现提醒,但ID为password_5
的字段未填写。
有问题的字段嵌套在表单中。不知道这有什么不同吗?
-EDIT 2 -
我很确定这个问题与目标网站上的HTML /嵌套有关,因为我刚刚在另一个网站上试过这个问题并且它有效。
目标网站嵌套如下:
<html>
<head> … </head>
<body onload="FinishLoad(1);hideJSWarn();">
<div id="noJSWarn" class="cssSecurityWarning" style="display: none;"> … </div>
<table id="table_LoginPage_1" > … </table>
<table id="table_LoginPage_2" > … </table>
<blockquote>
<form id="frmLogin_4" onsubmit="return Login(1)" autocomplete="off" method="POST" action="login.cgi" name="frmLogin">
<input id="tz_offset_5" type="hidden" name="tz_offset"></input>
<table id="table_LoginPage_3" >
<tbody>
<tr> …
<td valign="top">
<table id="table_LoginPage_6" >
<tbody>
<tr>
<td> … </td>
<td>
<input id="username_5" type="text" size="20" name="username"></input>
答案 0 :(得分:5)
我通过在Firefox中突出显示元素ID并选择inspect element
来获取元素ID。
事实证明,这给那些返回的ID提供了不同的ID:
NSString *body = [self.emailWebView stringByEvaluatingJavaScriptFromString:
@"document.getElementsByTagName('body')[0].outerHTML"];
NSLog(@"%@", body);
将这些ID(显然根据用于导航到页面的内容而变化)插入:
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('username').value = '%@';", user]];
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('password').value = '%@';", pw]];
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('input_LoginPage-ipad_1').click();"]];
解决了它。
感谢所有帮助人员。
答案 1 :(得分:4)
您必须将javascript代码放在一个NSString中,然后使用stringByEvaluatingJavaScriptFromString
执行。这就是代码的样子:
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('email').value = '%@'", email]];
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('pass').value = '%@'", password]];
答案 2 :(得分:1)
使用此代码这将起作用
view.loadUrl("javascript:(function() { "
+ " document.getElementById('login').value = '" + emailAdress+ "';"
+ " document.getElementById('login').readOnly='true'"
+ "})();");