C # WebBrowser Нажмите кнопку, затем перейдите на другую страницу - PullRequest
1 голос
/ 26 октября 2011

Мне нужно нажать кнопку HTML и перейти на другую страницу. После нажатия мне нужно дождаться загрузки страницы и переходить на новую страницу только после загрузки старой страницы.

Вот код, который нажимает кнопку:

element = webBrowser1.Document.GetElementById("LoginButton");
element.InvokeMember("click");

У webBrowser есть свойство IsBusy, но оно не работает после нажатия кнопки:

element = webBrowser1.Document.GetElementById("LoginButton");
element.InvokeMember("click");
if(webBrowser1.IsBusy)
{
     MessageBox.Show("Busy"); // Nothing happens, but page is not full loaded.
}

Если я добавлю System.Threading.Thread.Sleep(1000), страница загрузится, и я смогу перейти на следующую страницу, но время загрузки страницы на других компьютерах может быть больше.

Что я могу сделать, чтобы загрузить другую страницу только после загрузки предыдущей страницы?

П.С .: Я из России, извините за плохой английский.

Ответы [ 4 ]

0 голосов
/ 26 сентября 2013

Используйте это, вы можете просто использовать это один раз

 br1.DocumentCompleted += br1_DocumentCompleted;
        Application.Run();

Позвонить

void br1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        var br1 = sender as WebBrowser;
        if (br1.Url == e.Url)
        {
            Console.WriteLine("Natigated to {0}", e.Url);
            Application.ExitThread();   // Stops the thread
        }
    }

Заменить br1 на имя вашего веб-браузера. Надеюсь, это поможет

0 голосов
/ 26 октября 2011

WebBrowser.Navigated - это событие браузера , которое вы ищете.

0 голосов
/ 27 октября 2011

Если на вашей веб-странице есть какие-либо блоки javascript, вы не сможете решить проблему, используя сам элемент управления WebBrowser. Вам следует дождаться события document.ready с использованием кода javascript и сообщить об этом вашей программе на C #.

Ранее я создал блок javascript, который отображает состояние веб-страницы. Это выглядит так:

var isBusy = true;
function getIsScriptBusy () {
   return isBusy;
}
// when loading is complete:
// isBusy = false;
// document.ready event, for example

и код C #, ожидающий, пока он вернет true:

void WaitForCallback(int timeout) {
    Stopwatch w = new Stopwatch();
    w.Start();
    Wait(delegate() {
        return (string)Document.InvokeScript("getIsScriptBusy") != "false"
            && (w.ElapsedMilliseconds < timeout || Debugger.IsAttached);
    });
    if(w.ElapsedMilliseconds >= timeout && !Debugger.IsAttached)
        throw new Exception("Operation timed out.");
}
void Wait(WaitDelegate waitCondition) {
    int bRet;
    MSG msg = new MSG();
    while(waitCondition() && (bRet = GetMessage(ref msg, new HandleRef(null, IntPtr.Zero), 0, 0)) != 0) {
        if(bRet == -1) {
            // handle the error and possibly exit
        } else {
            TranslateMessage(ref msg);
            DispatchMessage(ref msg);
        }
        Thread.Sleep(0);
    }
}
0 голосов
/ 26 октября 2011

Существует множество событий, отображаемых элементом управления WebBrowser.Вы можете попробовать Navigated или DocumentCompleted.

Ник

...