更新:这个问题很糟糕。继续前进,没有什么可看的。您可以从JS或ObjC设置密码文本字段的值。我错了。
我有一个基于WebKit的Cocoa应用程序,它在WebView
中加载包含HTML表单的HTML文档。 HTML表单包含密码文本字段,如:
<form name="foo">
<input type="password" name="bar">
</form>
我想以编程方式设置此文本字段的值(如果可能,请从Objective-C设置,但我会做任何有用的事情。)
我相信WebKit(以及其他所有现代浏览器)都实现了JavaScript安全功能,可以阻止JS脚本以编程方式设置此值。
不幸的是,似乎相同的安全限制适用于Objective-C,因为我似乎无法使用ObjC设置值。虽然JS限制是合理的,但ObjC似乎有点不合理。
有没有办法以编程方式设置此字段的值(没有在我的应用程序中捆绑自定义WebKit,但已更改为允许此项)?我愿意接受任何建议。
这是我在ObjC中尝试的内容:
DOMHTMLDocument *doc = (DOMHTMLDocument *)[webView mainFrameDocument];
DOMHTMLFormElement *formEl = (DOMHTMLFormElement *)[[doc forms] namedItem:@"foo"];
DOMHTMLInputElement *inputEl = (DOMHTMLInputElement *)[[formEl elements] namedItem:@"bar"];
[inputEl setValue:@"baz"];
这没有效果。
答案 0 :(得分:5)
这绝对可以工作而不必跳过任何箍来这样做。我刚刚编写了一个加载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];
}
我在工作中也有非常相似的代码,其唯一的工作就是登录网站,并且在Tiger工作了一年。在这种情况下,我会做所有事情,包括通过代码创建WebView。如果Safari的自动填充没有使用非常相似的代码,我也会感到非常惊讶。
那就是说,我会确保你的应用程序没有对WebView做任何疯狂的事情。你是否在其他地方对DOM进行任何其他修改?尝试像我一样在示例应用程序中执行此操作,看看它是否在那里工作。
您正在加载自己的HTML或远程服务器吗?有些网站包含Javascript,可以在加载时清除表单字段,或者在防止自动填充后清除一两秒。也许你正在遇到这个问题?
如果所有其他方法都失败了,请确保没有任何内容记录到WebView的控制台。您可以通过打开Web检查器或临时实现私有WebUIDelegate方法来查看:
- (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message;
答案 1 :(得分:3)
限制可能是因为DOM桥直接挂钩到与javascript运行时相同的代码,因此您需要绕过任何javascript / DOM桥。
也许您可以将焦点设置在字段上(如果网桥只允许那样)并将键盘事件发送到WebView或文档视图。
或者,由于这些字段是本机OS X组件,因此您可以直接与这些字段进行通信(而WebKit源代码应该可以帮助您了解如何访问它们)。
很抱歉,这两个解决方案都有点参与,我不知道这是否有效!也许webkitdev邮件列表会有答案,或者您可以尝试询问1Password开发人员; - )
答案 2 :(得分:0)
如何尝试将字段设置为普通文本字段,然后以编程方式将其更改为密码字段,同时显示字段为:none然后将其更改回可见。
答案 3 :(得分:0)
我会使用-stringByEvaluatingJavaScriptFromString:。
以下是我使用的内容(我在字段中添加了'id'属性以便于抓取):
[_webView stringByEvaluatingJavaScriptFromString: @"document.getElementById(\"bar\").value = \"hello\""];