更新:这个问题是铺位.继续前进,没有什么可看的.您可以从JS或ObjC设置密码文本字段的值.我错了.
我有一个基于WebKit的Cocoa应用程序,它可以加载包含HTML表单的HTML文档WebView
.HTML表单包含密码文本字段,如:
我想以编程方式设置此文本字段的值(如果可能,从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"];
这没有效果.
这绝对可以工作,而不必跳过任何箍这样做.我刚刚编写了一个加载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;