2014-12-19 109 views
6

我已經建立了一個簡單的測試平臺華廷(版本2.1)後的工作內容是:Browser.ExecScript()停止更新窗口

var browser = new IE(); 

browser.GoTo("http://www.google.co.il"); // webpage doesn't matter really 
browser.RunScript("alert(123)"); 

如果沒有安裝KB3025390這僅適用。安裝它將使用HRESULT設置爲E_ACCESSDENIED的UnAuthorizedAccessException來打破上述測試。是什麼賦予了?有什麼解決方法嗎?

更新:使用IWebBrowser2.Navigate2伴隨着「的javascript:執行console.log(123)」腳本類型的作品不過

  • 這讓我使用這樣的反向通道
  • 腳本貫穿感到不安.Navigate2()的這個反向通道的最大長度可能只有2070個字符(給出或取),否則它們會被強制截斷到這個長度,導致嘗試運行它們時發生javascript錯誤
  • using .Navigate2() ,即使是最瑣碎的腳本,會阻塞Internet Explorer的就緒狀態,因爲它將被設置爲READYSTATE_LOADING,而沒有任何希望擺脫它。。簡而言之,這意味着一旦你使用這個黑客,你必須以「不等待網頁加載」的方式(GoToNoWait,ClickNoWait等)執行WatiN中的每一個後續操作,以免代碼凍結等待瀏覽器回到READYSTATE_COMPLETE(這將永遠不會像前面提到的那樣)。
  • 似乎有一個更廣泛的問題,因爲我甚至無法訪問IHtmlWindow2對象p.e的屬性。 window.document再次拋出一個未經授權的異常,使得它幾乎不可能將我正在運行的腳本(使用Expando等)的腳本的返回值傳遞給C#世界,而不是window.top.document(對於window.top .document窗口有IWebBrowser2.Document其中的伎倆)

更新#2:鄉親在硒項目也已經注意到了這個問題:

https://code.google.com/p/selenium/issues/detail?id=8302

的bug報告已經也創建了:

https://connect.microsoft.com/IE/feedback/details/1062093/installation-of-kb3025390-breaks-out-of-process-javascript-execution-in-ie11

更新#3:IHTMLWindow2.setInterval和IHTMLWindow2.setTimeout還會引發UnauthorizedAccess異常。都沒有標明這些方法在棄用:

http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa741505%28v=vs.85%29.aspx

但他們都受傷了從同一削減都是一樣的痛苦。

更新#4:我給在這個崗位推薦了一槍方法:

https://stackoverflow.com/a/18546866/863651

爲了動態調用IHTMLWindow2對象的「EVAL」的方法(或任何其他方法真的)。與上述相同的「System.UnauthorizedAccessException」。在這裏也沒有喜悅。

微軟建議在「execscript」上使用「eval」,但是在上述實驗之後,我懷疑他們只是從瀏覽器內訪問「eval」。據我所知,當使用「eval」進程(通過COM)的完整IE11 +似乎已被完全禁止以及任何其他函數調用窗口對象,唯一的例外是上面提到的.Navigate2()的返回通道。

+0

'browser.Eval(「alert(123)」);'? –

+0

我也想知道如果'browser.GoTo(「javascript:alert(123)」)'也可以。也許它有什麼警報如何被調用? –

+0

.Eval()失敗,具有相同的HRESULT。 .GoTo()方法似乎至少在平凡的測試上起作用。在另一個說明中:我在互聯網區域擺弄IE的安全設置,沒有任何東西出來。感謝您查看這個。 – xDisruptor

回答

1

事實證明,微軟最終決定在COM級別關閉.execScript。只需安裝適用於Windows的最新更新(包括kb3025390):kb3025390之後提供的IE更新之一帶來了COM級別的.execScript功能

但是,請注意,通過IE的javascript無法訪問.execScript。在這種情況下,它消失了。

1

FYI:這個也沒有工作

ieInstance.Document.Script.<methodNameString>(<commaSeperatedParameterString>) 

試試這個工作對我來說,在一些地方但不是所有的地方

ieObject.Navigate "javascript:<methodNameString>(<commaSeperatedParameterString>)", Null, "_parent" 

ieObject.Navigate2 "javascript:"<methodNameString>(<commaSeperatedParameterString>)", Null, "_parent" 

現在嘗試找出解決方案使用eval

0

我找到了解決自動安裝更新問題的方法。您可以使用以下內容創建一個簡單的批處理文件。

{}代碼 關閉@echo

WUSA /卸載/ KB:3025390 /寧靜/ norestart更新日誌文件

END {}代碼

然後進入任務調度,爲這個批處理文件創建一個新任務,按照您的要求每運行一個小時或一天。將它作爲系統任務添加,以便它在後臺運行並且不會影響正在運行的自動化。

+0

感謝您爲此付出的努力。如果可以卸載更新一次,然後從Windows Update中「隱藏」它(也就是將其添加到不需要/列入黑名單的更新列表中),那麼以相同的精神進行探究會很有趣。我對這種方法的兩個擔憂是,首先,Windows更新是否足夠聰明,能夠自動將未來更新自動列入黑名單中;第二,這種閃存更新鏈將如何影響客戶端計算機的系統安全。只是我的2c。 – xDisruptor

+0

實際上,我在使用Selenium(在更新後變得毫無用處)在組策略下的客戶端服務器上。所以隱藏更新並沒有幫助我,每72小時更新一次。 這就是爲什麼我尋找另一種方法,而不是每72小時後卸載它。 所以我做了這個簡單的調度任務。 關於你的疑問,我希望Internet Explorer能夠解決這個問題,因爲有很多依賴系統因爲這個而崩潰,這個特定的更新僅適用於IE,因此不會卸載它不會引發任何安全問題 – NiksGr8