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:
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.
Che dire di 'browser.Eval (" alert (123) ");'? –
Mi chiedo anche se 'browser.GoTo (" javascript: alert (123) ")' funzionerebbe pure. Forse ha qualcosa con come viene chiamato l'allarme? –
.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