2015-03-27 2 views
4

У меня есть консольное приложение, и я определил в нем веб-браузер. Во-первых, я перехожу к странице и заполняю форму для входа и вызываю кнопку отправки для входа.C# webbrowser control не переходит на другую страницу

После этого я хочу перейти на другую страницу на том же сайте, используя тот же веб-браузер, но не перейдя на эту страницу. вместо этого он переходит на страницу, которая перенаправляется после входа в систему.

Это мой код для разъяснений; этот код дает мне исходный код www.websiteiwanttogo.com/default.aspx вместо product.aspx что здесь не так?

static WebBrowser wb = new WebBrowser(); 

    [STAThread] 
    static void Main(string[] args) 
    { 
     wb.AllowNavigation = true; 
     wb.Navigate("https://www.thewebsiteiwanttogo.com/login.aspx"); 
     wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); 
     Application.Run(); 


    } 

    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. 
      wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx"); 

      Console.WriteLine(wb.DocumentText); 
      Console.ReadLine(); 
      Application.Exit(); 

     } 
    } 
+0

Спасибо за такой замечательный вопрос. Я вижу, что убрал, увидев этот вопрос и ответы. – NANDAKUMAR

ответ

3

Существует множество различных способов достижения этой функциональности. Тем не менее, я думаю, что:

  1. Либо вызов, чтобы перейти к следующей странице происходит слишком быстро, или
  2. 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"); 
    } 
} 
+0

Спасибо за ответ Бен! Я попробую код в примере, который вы добавили после EDIT, но кажется, что мне нужно перейти на VS2012, чтобы использовать его, потому что я не могу использовать «ожидание» в 2010 году, и ни Microsoft.Bcl.Async, ни Async CTP не работали для меня. Я отредактирую это после того, как я применил ваше решение. –

+0

Я бы попробовал его без «ожидания» и посмотрел, работает ли это. Если нет, вам определенно придется использовать асинхронные методы. –

+0

Да, вы были правы. он работает без команды ожидания. но он дает некоторые ошибки скрипта и просит меня продолжить работу или нет. Я должен нажать «да», если я хочу, чтобы программа продолжала работать. Могу ли я сделать это автоматически? –

Смежные вопросы