2014-06-16 8 views
5

Ich versuche, die User-Agent-Zeichenfolge mithilfe des WatiN-Frameworks zu ändern, indem ich die Header in den "vor der Navigation" -Ereignissen ändert. Ich denke, dass ich sehr nah an einer Lösung bin, aber aus irgendeinem Grund werde ich auf eine leere Seite mit dem Code unten umgeleitet, nachdem die URL für eine Sekunde oder so besucht wurde.Benutzerdefiniertes BeforeNavigate-Ereignis im WatiN-Browser

Wenn ich die benutzerdefinierten BeforeNavigate-Ereignisse auskommentiere, wird der Browser nicht auf die leere Seite umgeleitet, was mich glauben lässt, dass mein benutzerdefiniertes Ereignis eine leichte Änderung benötigt. Hast du irgendwelche Ideen, was das Problem sein könnte?

Um das Problem zu reproduzieren, herunterzuladen WatiN und den Code auszuführen:

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; 
     } 
    } 
} 

@ Noseratio Vorschlag auch mir eine leere Seite gibt:

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

Müssen Sie den Useragent für alle Anfragen ändern, oder genügt nur die direkte Navigationsanforderung an die Seite? Müssen Sie es innerhalb eines einzelnen Tests/Prozesses mehrmals auf verschiedene Dinge ändern? –

+0

@BenAaronson Leider habe ich diese Benachrichtigung aus irgendeinem Grund nicht erhalten. Die Anfrage zum Navigieren zur Seite ist ausreichend. Ja, jede "IE" -Instanz muss in der Lage sein, eigene Header zu haben. – Johan

Antwort

0

Die Anfrage navigierenden auf die Seite ist genug.

In diesem Fall würde ich Ihr Leben einfacher schlägt vor, dass durch die BeforeNavigate2 Notwasserung und einfach _ieInstance.Navigate mit navigieren. z:

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); 
} 

Das Ergebnis auf procato gezeigt werden die falschen Header sein, weil das Laden der Seite zusätzliche Anfragen macht, und diejenigen, die richtigen Header nicht haben. Wenn Sie jedoch ein Tool wie Fiddler2 verwenden, sehen Sie, dass die erste Anfrage den richtigen User-Agent-Header hat.

Verwandte Themen