C#, как ожидать веб-страницы, чтобы закончить загружаться перед продолжением

Второй не совсем такой же, как первый. Я прочитал

for i;= 1 to n do 

из-за с 1 по n как

for i = 1; i <= n; i += 1

В каждом j-цикле k начинается с j. Таким образом, k начинается с 1 только в первом j-цикле каждого i-цикла.

Хотя первый алгоритм просто представляется в виде строк и столбцов, второй - нет.

function a1(n) {
  console.clear();
  console.log('algorithm 1');
  console.log('n = ' + n);
  console.log('x | y | z');
  var x, y, z = 0;
  var tr, td;
  
  for (x = 1; x <= n; x += 1) {
    tr = document.createElement('tr');
    for (y = 1; y <= n; y++) {
      td = document.createElement('td');
      z = z + 1;
      console.log(x + ' | ' + y + ' | ' + z);
      tr.appendChild(td);
      td.innerHTML = z;
    }
    tbl1.appendChild(tr);
  }
}

function a2(n) {
var i, j, k, r = 0;
  console.clear();
  console.log('algorithm 2');
  console.log('n = ' + n);
  console.log('i | j | k |i+j| r')
for (i = 1; i <= n; i += 1) {
  for (j = 1; j <= i; j += 1) {
    for (k = j; k <= (i + j); k += 1) {
      r = r + 1;
      console.log(i+ ' | ' + j + ' | ' + k + ' | ' + (i+j) + ' | ' + r);
    }
  }
}
return (r);
}

// output table 1 handle
var tbl1 = document.getElementById('output1');

// Event handlers for buttons a1 and a2
document.getElementById("a1_start").addEventListener("click", function(){
  a1(5);
});
document.getElementById("a2_start").addEventListener("click", function(){
  console.log('returns ' + a2(4));
});
td {
  text-align: center;
  border: solid 1px #000;
}
<button id="a1_start">
  start algorithm 1
</button>
 
<button id="a2_start">
  start algorithm 2
</button>
<table id="output1">
</table>

27
задан McMillan Cheng 23 October 2018 в 11:46
поделиться

8 ответов

Попробуйте событие

webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);

void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser.Document.GetElementById("product").SetAttribute("value", product);
    webBrowser.Document.GetElementById("version").SetAttribute("value", version);
    webBrowser.Document.GetElementById("commit").InvokeMember("click");
}
DocumentCompleted
28
ответ дан Quintin Robinson 28 November 2019 в 04:05
поделиться

Проверьте проект WatiN:

Вдохновленный разработка Watir WatiN, запущенного в декабре 2005 для создания подобного вида веб-приложения, Тестирующего возможный для языков .NET. С тех пор WatiN превратился в простую в использовании, многофункциональную и стабильную платформу. WatiN разрабатывается в C# и стремится приносить Вам простой способ автоматизировать Ваши тесты с использованием Internet Explorer и FireFox .NET...

12
ответ дан gnat 28 November 2019 в 04:05
поделиться

код yuna и bnl не сработал в приведенном ниже примере;

пример с ошибкой:

1-й ожидает завершения. Но 2-й с invokemember ("submit" ") не сделал. вызвать работы. но ReadyState.Complete действует как Завершено до того, как ДЕЙСТВИТЕЛЬНО завершено:

wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
   Application.DoEvents();
}
MessageBox.Show("ok this waits Complete");

//navigates to new page
wb.Document.GetElementById("formId").InvokeMember("submit");
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
   Application.DoEvents();
}
MessageBox.Show("webBrowser havent navigated  yet. it gave me previous page's html.");  
var html = wb.Document.GetElementsByTagName("HTML")[0].OuterHtml;

как исправить эту нежелательную ситуацию:

использование

    public myForm1 {

        myForm1_load() { }

        // func to make browser wait is inside the Extended class More tidy.
        WebBrowserEX wbEX = new WebBrowserEX();

        button1_click(){
            wbEX.Navigate("site1.com");
            wbEX.waitWebBrowserToComplete(wb);

            wbEX.Document.GetElementById("input1").SetAttribute("Value", "hello");
            //submit does navigation
            wbEX.Document.GetElementById("formid").InvokeMember("submit");
            wbEX.waitWebBrowserToComplete(wb);
            // this actually waits for document Compelete. worked for me.

            var processedHtml = wbEX.Document.GetElementsByTagName("HTML")[0].OuterHtml;
            var rawHtml = wbEX.DocumentText;
         }
     }

//put this  extended class in your code.
//(ie right below form class, or seperate cs file doesnt matter)
public class WebBrowserEX : WebBrowser
{
   //ctor
   WebBrowserEX()
   {
     //wired aumatically here. we dont need to worry our sweet brain.
     this.DocumentCompleted += (o, e) => { webbrowserDocumentCompleted = true;};
   }
     //instead of checking  readState, get state from DocumentCompleted Event 
     // via bool value
     bool webbrowserDocumentCompleted = false;
     public void waitWebBrowserToComplete()
     {
       while (!webbrowserDocumentCompleted )
       { Application.DoEvents();  }
       webbrowserDocumentCompleted = false;
     }

 }
4
ответ дан bh_earth0 28 November 2019 в 04:05
поделиться

Делайте попытку Селена ( http://seleniumhq.org ) или WatiN ( http://watin.sourceforge.net ) для сохранения себя некоторая работа.

2
ответ дан PHeiberg 28 November 2019 в 04:05
поделиться

Если Вы используете InternetExplorer. COM-объект приложения, проверьте свойство ReadyState на значение 4.

1
ответ дан James Pogran 28 November 2019 в 04:05
поделиться

Я думаю , событие DocumentCompleted управления WebBrowser должно получить Вас, куда необходимо пойти.

1
ответ дан Mike 28 November 2019 в 04:05
поделиться

Принятие элемента "фиксации" представляет стандартную кнопку отправки Формы тогда, можно присоединить обработчик событий к событию WebBrowsers Navigated.

1
ответ дан AnthonyWJones 28 November 2019 в 04:05
поделиться

Этот код мне очень помог. Возможно, это может быть и для вас

wb.Navigate(url);
while(wb.ReadyState != WebBrowserReadyState.Complete)
{
     Application.DoEvents();
}
MessageBox.Show("Loaded");
31
ответ дан 28 November 2019 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: