Существует множество различных способов достижения этой функциональности. Тем не менее, я думаю, что:
- Либо вызов, чтобы перейти к следующей странице происходит слишком быстро, или
Document.Completed
событие не стрельбы должным образом после входа в систему (это распространено, особенно если документ назначения содержит динамические скрипты)
Я проделал большую автоматизацию веб-страниц (перейдя по ссылке на ссылку, затем выполнив некоторые действия, затем перейдя по другой ссылке и т. д.), и вам следует рассмотреть возможность использования асинхронных процессов. В принципе, вероятно, всегда лучше иметь дело с объектом webBrowser
, чтобы использовать асинхронные процессы, просто потому, что есть много случаев, когда вам нужен один процесс для запуска во время выполнения других функций.
Не вдаваясь в излишние подробности, посмотрите на ответ на этот вопрос и изучить код: Flow of WebBrowser Navigate and InvokeScript
Перед тем, что реализация, однако, вы можете просто попробуйте добавить асинхр подождать, прежде чем пытаться перейти на страницу , (ожидание async похоже на Thread.Sleep()
, но фактически не останавливает загрузку страницы, то есть «поток»).
(Никогда не слышал о асинхронных процессах раньше? Проверьте this tutorial on MSDN).
Попробуйте это первый:
static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wb.Url.ToString().IndexOf("login.aspx") > -1)
{
wb.Document.GetElementById("txtnumber").SetAttribute("value", "000001");
wb.Document.GetElementById("txtUserName").SetAttribute("value", "myusername");
wb.Document.GetElementById("txtPassword").SetAttribute("value", "mypassword");
wb.Document.GetElementById("btnLogin").InvokeMember("click");
}
else
{
//wb.Document.Body you are logged in do whatever you want here.
await Task.Delay(1000); //wait for 1 second just to let the WB catch up
wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");
Console.WriteLine(wb.DocumentText);
Console.ReadLine();
Application.Exit();
}
}
Если это не поможет, рассмотреть the link above и попробовать реализовать более надежную последовательность Навигационной с асинхронными процессами.
Если это не помогает, и вам нужна помощь в навигации или ожидание загрузки динамических страниц, попробуйте этот пост: how to dynamically generate HTML code using .NET's WebBrowser or mshtml.HTMLDocument? Я много раз использовал этот богословский код, и он отлично работает.
Надеюсь, что один из этих методов поможет! Дайте мне знать, и я могу помочь вам сгенерировать более конкретные фрагменты кода.
EDIT:
На втором взгляде, я собираюсь предположить, что Console.ReadLine()
будет замерзать ходовую из wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");
, так как это не будет происходить мгновенно. Вероятно, вы захотите добавить еще один оператор if
в обработчик Document.Completed
, чтобы разрешить wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");
, чтобы завершить навигацию, прежде чем пытаться захватить wb.DocumentText
.Например:
static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wb.Url.ToString().IndexOf("login.aspx") > -1)
{
wb.Document.GetElementById("txtnumber").SetAttribute("value", "000001");
wb.Document.GetElementById("txtUserName").SetAttribute("value", "myusername");
wb.Document.GetElementById("txtPassword").SetAttribute("value", "mypassword");
wb.Document.GetElementById("btnLogin").InvokeMember("click");
}
else if(wb.Url.ToString().IndexOf("product.aspx") > -1)
{
Console.WriteLine(wb.DocumentText);
Console.ReadLine();
Application.Exit();
}
else
{
//wb.Document.Body you are logged in do whatever you want here.
await Task.Delay(1000); //wait for 1 second just to let the WB catch up
wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");
}
}
Спасибо за такой замечательный вопрос. Я вижу, что убрал, увидев этот вопрос и ответы. – NANDAKUMAR