c # Получить URL новой страницы после нажатия кнопки в веб-браузере - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужно перемещаться по некоторым страницам с помощью консоли приложения в C #, у меня есть известный URL в качестве начальной страницы, но другие URL-адреса неизвестны, я открываю их, нажимая кнопки на начальной странице.
Это код кнопки, которую мне нужно нажать на странице:

<input name="ctl00$ContentPlaceHolder1$btn_invia" type="button" id="myId" onclick="ReDirect();" class="myClass" value="BUTTON TEXT" />

Я попробовал этот код для перехода на стартовую страницу, и он работает:

class Program
{
  private static WebBrowser wb1 = new WebBrowser();

  [STAThread]
  static void Main(string[] args)
  {
    runBrowserThread(new Uri("http://www.myUrl.com"));
  }

  private static void runBrowserThread(Uri url)
  {
    var th = new Thread(() => {
        var br = new WebBrowser();
        br.DocumentCompleted += Br_DocumentCompleted; ;
        br.Navigate(url);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
  }

  private static void Br_DocumentCompleted(object sender, 
  WebBrowserDocumentCompletedEventArgs e)
  {
    //Retrieve string content of document
    var document = ((WebBrowser)sender).Document;
    var documentAsIHtmlDocument3 = 
    (mshtml.IHTMLDocument3)document.DomDocument;
    var content = documentAsIHtmlDocument3.documentElement.innerHTML;

    //Parse content with html agility pack or whatever

    //Click on button
    wb1.Document.GetElementById("myId").InvokeMember("click");

    Application.ExitThread();
  }
}

Когда я нажимаю на кнопку, она загружает новую страницу. Но когда я звоню .InvokeMember("click");, он зависает, как я могу заставить WebBrowser wb1 перейти на новую страницу?

1 Ответ

0 голосов
/ 26 апреля 2018

Я выяснил, в чем я был неправ, я позвонил wb1.Document.GetElementById("myId").InvokeMember("click");, но wb1 не был инициализирован, поэтому я не вызвал .InvokeMember("click") для существующего элемента. Я изменил таким образом:

((WebBrowser)sender).Document.GetElementById("myId").InvokeMember("Click");

в методе Br_DocumentCompleted, и теперь он работает. Но теперь у меня есть другая проблема: я изменил метод Br_DocumentCompleted таким образом, потому что мне нужно нажать на кнопку на новой странице, чтобы открыть третью страницу:

    private static void Br_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Retrieve string content of document
        var document = ((WebBrowser)sender).Document;
        var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)document.DomDocument;
        var content = documentAsIHtmlDocument3.documentElement.innerHTML;

        if (((WebBrowser)sender).Url.AbsoluteUri.Contains("startpage.aspx")) 
        {


            //Click on button
            ((WebBrowser)sender).ScriptErrorsSuppressed = true;
            ((WebBrowser)sender).Document.GetElementById("myId").InvokeMember("Click");
        }
        else if (((WebBrowser)sender).Url.AbsoluteUri.Contains("page1.aspx")) 
        {
            ((WebBrowser)sender).Document.GetElementById("btn_send").InvokeMember("Click");
        }
        else if (((WebBrowser)sender).Url.AbsoluteUri.Contains("page2.aspx")) 
        {
            //Some code
            Application.ExitThread();
        }   
    }

И "btn_send" на странице1 имеет этот код:

<input onclick="openEVERFANCY('#CChildren','N'); return false;" id=btn_send class=buttonVerifyDisp type=button value=GO>

и когда я вызываю ((WebBrowser)sender).Document.GetElementById("btn_send").InvokeMember("Click"); для этой кнопки, она не переходит на третью страницу, даже если у меня есть обработчик событий DocumentCompleted

...