2014-12-19 28 views
6

ho creato un semplice banco di prova per WatiN (ver 2.1) che recita:Browser.ExecScript() ha smesso di funzionare dopo l'aggiornamento di Windows

var browser = new IE(); 

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

Questo funziona solo se KB3025390 non è installato. L'installazione interrompe il test precedente con un UnAuthorizedAccessException che ha impostato HRESULT su E_ACCESSDENIED. Cosa dà? C'è qualche soluzione?

Aggiornamento: Utilizzo IWebBrowser2.Navigate2 con "javascript: console.log (123)" tipo di script funziona però

  • mi fa sentire a disagio con una tale backchannel
  • gli script attraversano questo back-channel di .Navigate2() può avere una lunghezza massima di circa 2070 caratteri (dare o prendere) altrimenti vengono forzatamente troncati a questa lunghezza che porta a errori javascript al tentativo di eseguirli
  • utilizzando .Navigate2() , anche con lo script più banale, bloccherà definitivamente lo stato di pronto di Internet Explorer nel senso che verrà impostato su READYSTATE_LOADING senza alcuna speranza di liberarsene. In parole povere questo significa che una volta che usi questo trucco, devi eseguire ogni singola operazione successiva in WatiN in modo "dont-wait-for-web-to-load" (GoToNoWait, ClickNoWait ecc.) Per evitare che il tuo codice si congeli aspettando che il browser ritorni a READYSTATE_COMPLETE (che non verrà mai in considerazione come già menzionato).
  • sembra esserci un problema molto più ampio qui nel senso che non riesco nemmeno ad accedere alle proprietà di un oggetto IHtmlWindow2 p.e. window.document genera nuovamente un'eccezione non autorizzata rendendo praticamente impossibile trasferire nel mondo C# i valori di ritorno degli script che sto utilizzando (usando Expando ecc.) per documenti diversi da window.top.document (per window.top finestra .document c'è IWebBrowser2.Document che fa il trucco)

Aggiornamento # 2: la gente sopra al progetto di selenio hanno anche notato questo problema:

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

una segnalazione di bug è stato creato anche:

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

Aggiornamento n. 3: IHTMLWindow2.setInterval e IHTMLWindow2.setTimeout generano anche eccezioni di UnauthorizedAccess. Questi metodi non sono contrassegnati come deprecato in:

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

ancora hanno inflitto una ferita per soffrire dagli stessi tagli tutte uguali.

Update # 4: ho dato l'approccio consigliato in questo post un colpo:

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

Al fine di richiamare dinamicamente il metodo di "eval" dell'oggetto IHTMLWindow2 (o qualsiasi altro metodo davvero). Ottenuto lo stesso "System.UnauthorizedAccessException" come sopra. Quindi non c'è nemmeno gioia qui.

Microsoft consiglia di utilizzare "eval" su "execscript", tuttavia dopo l'esperimento precedente sospetto che si stiano riferendo all'accesso a "eval" solo dal browser.

Per quanto posso dire finora, quando si parla di IE11 a pieno titolo utilizzando "fuori processo" (tramite COM) sembra essere stato completamente proibito insieme a qualsiasi altra funzione-invocazione del window object, l'unica eccezione è il back-channel di .Navigate2() menzionato sopra.

+0

Che dire di 'browser.Eval (" alert (123) ");'? –

+0

Mi chiedo anche se 'browser.GoTo (" javascript: alert (123) ")' funzionerebbe pure. Forse ha qualcosa con come viene chiamato l'allarme? –

+0

.Eval() ha esito negativo con lo stesso valore HRESULT. L'approccio .GoTo() sembra funzionare anche se almeno su test banali. In una nota diversa: ho giocato con le impostazioni di sicurezza di Internet Explorer nella zona Internet e non ne è uscito nulla. Grazie per aver esaminato questo. – xDisruptor

risposta

1

Si scopre che Microsoft alla fine ha annullato la propria decisione di eliminare il codice .execScript a livello di COM. Basta installare gli ultimi aggiornamenti per Windows incluso kb3025390: uno degli aggiornamenti per IE che è venuto dopo kb3025390 riporta la funzionalità .execScript a livello di COM

Nota, tuttavia .execScript non è più accessibile tramite javascript di IE. In quel contesto è andato per sempre.

1

FYI: questo è, inoltre, non funziona

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

provare questo ha lavorato per me in alcuni posti ma non tutti i luoghi

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

o

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

ora cercando per scoprire la soluzione utilizzando eval

0

Ho trovato un modo per aggirare il problema di un aggiornamento che si installa automaticamente. Puoi semplicemente creare un semplice file batch con il seguente contenuto.

{code} @echo off

wusa/uninstall/kb: 3.025.390/quiet/norestart

FINE {code}

Poi vai al task scheduler , creare una nuova attività per questo file batch da eseguire ogni ora o giorno secondo le proprie esigenze. Aggiungilo come attività di sistema in modo che venga eseguito in background e non influisca sulle automazioni in esecuzione.

+0

Grazie per lo sforzo che ci hai dedicato. Sarebbe interessante sondare lo stesso spirito se è possibile disinstallare l'aggiornamento una volta e poi "nasconderlo" dall'aggiornamento di Windows (ovvero aggiungerlo all'elenco degli aggiornamenti indesiderato/nella lista nera). Le mie due preoccupazioni con questo approccio sono, in primo luogo, se l'aggiornamento di Windows sarà abbastanza intelligente da inserire automaticamente nella lista nera gli aggiornamenti futuri che dipendono da questo aggiornamento e, in secondo luogo, in che modo questa catena di aggiornamenti potrebbe influire sulla sicurezza del sistema nelle macchine client. Solo il mio 2c. – xDisruptor

+0

In realtà sto usando Selenium (che diventa inutile dopo l'aggiornamento) sul server client che rientra nella politica del gruppo. Quindi nascondere l'aggiornamento non mi stava aiutando, l'aggiornamento si stava installando ogni 72 ore. Ecco perché ho cercato un altro approccio piuttosto che disinstallarlo dopo ogni 72 ore. Così ho fatto questa semplice operazione di pianificazione. Per quanto riguarda il tuo dubbio, spero che internet explorer risolverà questo problema in quanto ci sono molti sistemi dipendenti che si bloccano a causa di questo, questo aggiornamento specifico è per IE, quindi non disinstallarlo non solleverà alcun problema di sicurezza – NiksGr8