5
"before navigation"- 이벤트의 헤더를 수정하여 WatiN 프레임 워크를 사용하여 사용자 에이전트 문자열을 변경하려고합니다. 나는 정말 솔루션에 가깝다고 생각하지만 몇 가지 이유로 URL을 잠깐 방문한 후 아래 코드로 빈 페이지로 리디렉션됩니다.WatiN 브라우저의 Custom BeforeNavigate-event
사용자 정의 BeforeNavigate 이벤트를 주석 처리하면 브라우저가 빈 페이지로 리디렉션되지 않으므로 사용자 정의 이벤트를 약간 수정해야한다고 생각합니다. 문제가 무엇인지 아이디어가 있습니까?
이 문제를 재현 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;
}
}
}
모든 요청에 대해 사용자 에이전트를 변경해야합니까, 아니면 페이지에 대한 직접 탐색 요청만으로 충분합니까? 또한 단일 테스트/프로세스 내에서 여러 번 여러 가지 사항을 변경해야합니까? –
@BenAaronson 죄송합니다. 어떤 이유로 든이 알림을받지 못했습니다. 페이지로 이동하는 요청이면 충분합니다. 그렇습니다. 각 IE 인스턴스는 자체 헤더를 가질 수 있어야합니다. – Johan