2014-06-16 21 views
5

Sto provando a modificare la stringa dell'agente utente utilizzando il framework WatiN modificando le intestazioni negli eventi "prima della navigazione". Penso di essere davvero vicino a una soluzione, ma per qualche motivo sono reindirizzato a una pagina vuota con il codice seguente dopo che l'url è stato visitato per un secondo circa.Personalizzato BeforeNavigate-evento nel browser WatiN

Se commento gli eventi BeforeNavigate personalizzati, il browser non reindirizza alla pagina vuota, il che mi porta a credere che il mio evento personalizzato necessiti di una leggera modifica. Hai qualche idea su quale potrebbe essere il problema?

Per riprodurre il problema, scaricare WatiN ed eseguire il codice qui sotto:

private SHDocVw.InternetExplorerClass _ieInstance; 

private const string UserAgent = 
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)" + 
    "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153" + 
    "Safari/537.36\r\n"; 

bool _renavigating; 
private IE _browser; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    _ieInstance = _ieInstance = new SHDocVw.InternetExplorerClass(); 
    //_ieInstance.BeforeNavigate2 += BeforeNavigate; 
    _browser = new IE(_ieInstance); 
    _browser.GoTo("http://www.procato.com/my+headers/"); 
} 

void BeforeNavigate(object pDisp, ref object url, ref object flags, 
    ref object targetFrameName, ref object postData, ref object headers, 
    ref bool cancel) 
{ 
    if (!string.IsNullOrEmpty(UserAgent)) 
    { 
     if (!_renavigating) 
     { 
      headers += string.Format("User-Agent: {0}\r\n", UserAgent); 
      _renavigating = true; 
      cancel = true; 
      _ieInstance.Navigate((string)url, 
       (string)targetFrameName, (byte[])postData, (string)headers); 
     } 
     else 
     { 
      _renavigating = false; 
     } 
    } 
} 

@ suggerimento di Noseratio mi dà una pagina vuota così:

readonly SynchronizationContext _sc = SynchronizationContext.Current; 

void BeforeNavigate(object pDisp, ref object url, ref object flags, 
    ref object targetFrameName, ref object postData, ref object headers, 
    ref bool cancel) 
{ 
    if (!string.IsNullOrEmpty(UserAgent)) 
    { 
     if (!_renavigating) 
     { 
      var newHeaders = string.Format("User-Agent: {0}\r\n", UserAgent); 
      _renavigating = true; 
      cancel = true; 

      string thatUrl = (string)url; 
      object thatFlags = flags; 
      object thatTargetFrameName = targetFrameName; 
      object thatPostData = postData; 
      object thatHeaders = (headers != null && headers != Type.Missing && 
           headers != System.DBNull.Value) ? 
       (headers.ToString() + newHeaders) : newHeaders; 

      _sc.Post(_ => 
      { 
       ((SHDocVw.IWebBrowser)pDisp).Navigate(
        thatUrl, 
        ref thatFlags, 
        ref thatTargetFrameName, 
        ref thatPostData, 
        ref thatHeaders); 
      }, null); 
     } 
     else 
     { 
      _renavigating = false; 
     } 
    } 
} 
+0

È necessario modificare l'useragent su tutte le richieste oppure è sufficiente la richiesta di navigazione diretta per la pagina? Inoltre, hai bisogno di cambiarlo più volte a cose diverse all'interno di un singolo test/processo? –

+0

@BenAaronson Spiacente, non ho ricevuto questa notifica per qualche motivo. La richiesta di navigazione verso la pagina è sufficiente. Sì, ogni istanza di 'IE' deve essere in grado di avere le proprie intestazioni. – Johan

risposta

0

La richiesta di navigazione alla pagina è abbastanza.

In tal caso, suggerirei rendere la vostra vita più semplice per l'ammaraggio, il BeforeNavigate2, e semplicemente utilizzando _ieInstance.Navigate per navigare. per esempio:

private void Form1_Load(object sender, EventArgs e) 
{ 
    _ieInstance = _ieInstance = new SHDocVw.InternetExplorerClass(); 
    _browser = new IE(_ieInstance); 
    _ieInstance.Navigate("http://www.procato.com/my+headers/", Headers: UserAgent); 
} 

Il risultato mostrato sul procato saranno le intestazioni sbagliate perché il caricamento della pagina rende ulteriori richieste, e quelli che non avranno le intestazioni di destra. Tuttavia, se utilizzi uno strumento come Fiddler2, vedrai che la richiesta iniziale ha l'intestazione corretta per l'utente.