26 Ağustos 2018 Pazar

Chromedriver process kill

  1. Process[] chromeDriverProcesses = Process.GetProcessesByName("chromedriver");
  2. foreach(var chromeDriverProcess in chromeDriverProcesses){
  3. chromeDriverProcess.Kill();
  4. }

23 Ağustos 2018 Perşembe

c# webbrowser

webBrowser1.Document.GetElementById("navbar_username").InnerText ="Tester"; webBrowser1.Document.GetElementById("navbar_password").InnerText = "xxxxxxxxxxx"; foreach (HtmlElement HtmlElement1 in webBrowser1.Document.Body.All) { if (HtmlElement1.GetAttribute("value") == "Log in") { HtmlElement1.InvokeMember("click"); break; } }

public Form1()
        {
            InitializeComponent();
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
        }

        private void AddText_Click(object sender, EventArgs e)
        {
            webBrowser1.Url = new Uri(@"http://google.com");
        }

        void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            foreach (HtmlElement he in webBrowser1.Document.All.GetElementsByName("q"))
            {
                he.SetAttribute("value", "HI");
            }
        }


---------
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;
how to fix this unwanted situation;
 button1_click(){
        wb.Navigate("site1.com");
        waitWebBrowserToComplete(wb);

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

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


 //instead of checking  readState . we get state from DocumentCompleted Event via bool value
 bool webbrowserDocumentCompleted = false;
 public static void waitWebBrowserToComplete(WebBrowser wb)
 {
     while (!webbrowserDocumentCompleted )
     {
         Application.DoEvents();
     }
     webbrowserDocumentCompleted = false;
  }

  form_load(){
     wb.DocumentCompleted += (o, e) => {
        webbrowserDocumentCompleted = true;
      };
  }

--------

webbrowser async

private async Task PageLoad(int TimeOut)
    {
        TaskCompletionSource<bool> PageLoaded = null;
        PageLoaded = new TaskCompletionSource<bool>();
        int TimeElapsed = 0;
        Browser.DocumentCompleted += (s, e) =>
        {
            if (Browser.ReadyState != WebBrowserReadyState.Complete) return;
            if (PageLoaded.Task.IsCompleted) return; PageLoaded.SetResult(true);
        };
        //
        while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
        {
            await Task.Delay(10);//interval of 10 ms worked good for me
            TimeElapsed++;
            if (TimeElapsed >= TimeOut * 100) PageLoaded.TrySetResult(true);
        }
    }
And you can use it like this, with in an async method, or in a button click event, just make it async:
private async void Button1_Click(object sender, EventArgs e)
{
   Browser.Navigate("www.example.com");
   await PageLoad(10);//await for page to load, timeout 10 seconds.
   //your code will run after the page loaded or timeout.
}