在WatiN浏览器中自定义beforennavigate事件
本文关键字:beforennavigate 事件 自定义 WatiN 浏览器 | 更新日期: 2023-09-27 18:08:43
我试图通过修改"before navigation"事件中的标题来使用WatiN框架更改用户代理字符串。我想我真的很接近一个解决方案,但由于某种原因,我被重定向到一个空白的页面,下面的代码在url被访问了一秒钟左右。
如果我注释掉自定义BeforeNavigate-events,浏览器不会重定向到空白页面,这使我相信我的自定义事件需要稍微修改。你知道是什么问题吗?
要重现这个问题,请下载WatiN并运行下面的代码:
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的建议也给了我一个空白页:
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;
}
}
}
请求导航到页面就足够了。
在这种情况下,我建议通过放弃BeforeNavigate2
,并简单地使用_ieInstance.Navigate
来导航,使您的生活更简单。例句:
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);
}
procato上显示的结果将是错误的头,因为加载页面会产生额外的请求,而这些请求不会有正确的头。但是,如果使用Fiddler2之类的工具,您将看到初始请求具有正确的用户代理标头。