6

のテキスト フィールドを事前に入力する必要があり、これが最善の方法で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は入力されていません。

問題のフィールドはフォーム内にネストされています。それが違いを生むかどうかわかりませんか?

-編集2-

別のサイトでこれを試してみたところ、問題がターゲット Web サイトの 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>
4

3 に答える 3

5

JavaScript コードを 1 つの NSString 内に配置してから、 で実行する必要がありstringByEvaluatingJavaScriptFromStringます。コードは次のようになります。

 [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('email').value = '%@'", email]];
 [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('pass').value = '%@'", password]];
于 2013-08-09T11:40:37.137 に答える
5

要素 ID は、Firefox で強調表示して を選択することで取得できましたinspect element。これにより、次のように返された 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();"]];

解決しました。

助けてくれてありがとう。

于 2013-08-14T09:17:18.287 に答える
1

このコードを使用してください

view.loadUrl("javascript:(function() { "
    + " document.getElementById('login').value = '" + emailAdress+ "';"
    + " document.getElementById('login').readOnly='true'"
    + "})();");
于 2015-06-26T06:56:29.040 に答える