代码之家  ›  专栏  ›  技术社区  ›  Todd Ditchendorf

如何以编程方式设置WebKit密码文本字段的值?

  •  2
  • Todd Ditchendorf  · 技术社区  · 16 年前

    我有一个基于WebKit的Cocoa应用程序,它加载一个HTML文档,其中包含一个HTML表单 WebView

    <form name="foo">
        <input type="password" name="bar">
    </form>
    

    我希望以编程的方式设置这个文本字段的值(如果可能的话,从Objective-C开始,但我会做任何可行的事情)。

    我相信WebKit(以及所有其他现代浏览器)实现了一个JavaScript安全特性,它阻止JS脚本以编程方式设置这个值。

    不幸的是,似乎同样的安全限制也适用于Objective-C,因为我似乎也无法使用ObjC设置值。虽然JS限制是合理的,但ObjC似乎有点不合理。

    是否有任何方法可以通过编程方式设置此字段的值(除了在我的应用程序中绑定一个自定义WebKit,该WebKit已被修改以允许此操作之外)?我愿意接受任何建议。

    以下是我在ObjC中尝试的内容:

    DOMHTMLDocument *doc = (DOMHTMLDocument *)[webView mainFrameDocument];
    DOMHTMLFormElement *formEl = (DOMHTMLFormElement *)[[doc forms] namedItem:@"foo"];
    DOMHTMLInputElement *inputEl = (DOMHTMLInputElement *)[[formEl elements] namedItem:@"bar"];
    [inputEl setValue:@"baz"];
    

    这没有效果。

    4 回复  |  直到 16 年前
        1
  •  5
  •   Matt Lilek    16 年前

    这肯定会起作用,而不必通过任何障碍来做到这一点。我刚刚编写了一个快速测试应用程序 http://mail.google.com/ 并在SnowLeopard和Leopard上使用以下代码登录:

    - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
    {
        if (![[sender mainFrame] isEqual:frame])
            return;
    
        DOMHTMLFormElement *form = (DOMHTMLFormElement *)[[frame DOMDocument] getElementById:@"gaia_loginform"];
        DOMHTMLInputElement *username = (DOMHTMLInputElement *)[[form elements] namedItem:@"Email"];
        [username setValue:@"myemailacct"];
    
        DOMHTMLInputElement *password = (DOMHTMLInputElement *)[[form elements] namedItem:@"Passwd"];
        [password setValue:@"omghi"];
    
        [form submit];
    }
    

    我也有非常类似的代码在工作中,其唯一的工作是登录到网站,它一直在老虎上工作了一年。在这种情况下,我会做所有事情,包括通过代码创建WebView。如果Safari的autofill没有使用与此非常类似的代码,我也会非常惊讶。

    如果所有其他操作都失败,请确保没有任何内容记录到WebView的控制台。通过打开web检查器或临时实现私有WebUIDelegate方法,您可以看到:

    - (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message;
    
        2
  •  3
  •   charles    16 年前

    这种限制可能是因为DOM桥与javascript运行时直接挂钩到相同的代码中,因此需要绕过任何javascript/DOM桥。

    也许您可以将焦点设置在字段上(如果网桥允许的话),并将键盘事件发送到WebView或Document视图。

    抱歉,这两种解决方案都有点复杂,我不知道这是否有效!也许webkitdev邮件列表会有答案,或者您可以尝试询问1Password开发者;-)

        3
  •  0
  •   dstarh    16 年前

    如何尝试将该字段设置为普通文本字段,然后在字段显示为:none时以编程方式将其更改为密码字段,然后将其更改回可见。

        4
  •  0
  •   Ben Gottlieb    16 年前

    我将使用-stringByEvaluatingJavaScriptFromString:。

    [_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById(\"bar\").value = \"hello\""];