2010-01-23 70 views
2

更新:這個問題是垃圾。移動,沒有什麼可以在這裏看到。你可以從JS或ObjC設置密碼文本字段的值。我錯了。如何以編程方式設置WebKit密碼文本字段的值?

我有一個基於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"]; 

這沒有任何影響。

+1

更新:整個問題都是垃圾。你可以*設置JavaScript或Objective-C的值。初次測試時,我的設置肯定有問題。不知道是什麼:( 對不起。 – 2010-01-24 01:51:39

回答

5

這應該肯定能夠工作,而無需跳過任何環節去做。我只寫了一個快速測試應用程序,加載http://mail.google.com/,並簽署了它與雪豹下面的代碼和豹紋細:

- (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的自動填充功能沒有使用非常類似的代碼,我也會感到非常驚訝。

這就是說,我會確保你的應用程序沒有做任何瘋狂的的WebView。你在其他地方做過其他修改嗎?嘗試在像我這樣的示例應用程序中做這件事,看看它是否在那裏工作。

是你加載你自己或遠程服務器上的HTML?一些網站包含Javascript,可清除表單域中的負載,或者在後面的一兩個域中阻止自動填充。也許你遇到了這個問題?

如果一切都失敗了,確保沒有被記錄到的WebView控制檯。你可以看到通過打開Web檢查器或臨時實現私有WebUIDelegate方法:

- (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message; 
+0

謝謝馬特,是的,你是對的,我最初的測試肯定有其他問題,對不起。 – 2010-01-24 01:53:48

0

如何嘗試將字段設置爲普通文本字段,然後通過編程將其更改爲密碼字段,而該字段的顯示全部爲:無,然後將其更改回可見狀態。

0

我會使用-stringByEvaluatingJavaScriptFromString :.

這是我用什麼(我加了一個「id」屬性的領域,使其更容易抓取):

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

我沒有看到如何,這將有助於你既然不能設置從JavaScript密碼字段的值。 – 2010-01-23 23:43:32

+0

我可能失去了一些東西,但我只是追加到我的答案代碼對我的作品 – 2010-01-24 01:26:42

+1

不,我是完全錯誤的。抱歉。設置值直接來自ObjC和JavaScript。我的整個問題是笨蛋:(。 不知道我之前做錯了什麼,但我想我修好了:| – 2010-01-24 01:49:42

3

的限制,可能是因爲DOM橋直接掛鉤到相同的代碼JavaScript運行時,所以你需要繞過任何JavaScript/DOM橋樑。

也許您可以將焦點設置在該字段上(如果網橋允許這樣做)並將鍵盤事件發送到WebView或文檔視圖。

或者,由於這些字段是本機OS X組件,因此您可能會直接與這些組件進行對話(並且WebKit源代碼應該可以幫助您計算如何訪問它們)。

對不起,這兩種解決方案都有一點涉及,我不知道這是否有效!也許webkitdev的郵件列表會有答案,或者你可以試着詢問1Password的開發者;-)

+0

謝謝查爾斯,我認爲這些都是好主意,我會仔細研究它們 – 2010-01-24 00:36:13

相關問題