Turning gears are the logo of co-scripts

Projemize bir webbrowser kontrolü eklediğimizde onu tıpkı bir web browser gibi yönlendirebiliriz (.navigate(string url) .

Ayrıca mshtml ile web browser kontolünün içine yüklenen içeriğini ele alabilir ve elementler arasında DOM hiyerarşisini kullanarak istediğimiz bilgiyi çekebilir veya sayfa içine müdahelelerde bulunabiliriz (form doldurma ve submit vb.). 

Doğukan isimli bir arkadaşın (:oP) , yeni başladığım bu C# işinde bana bir soru sormasıyla oluşan sabahlama sürecinde birden çok yöntemi olduğunu öğrendiğim web sayfası ele alma olayına en basit olan çözümü size iletiyorum.

Wellformed olmayan (element hiyerarşisi adam gibi olmayan ve standartlara uymayan sayfa)  web içeriğinde harici paketler kullanılıyor. Bunlardan birisi olan HTMLAgilityPack'i daha sonraki bir yazıya bırakıyorum. (OpenSource olan paketin sayfası burası).

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using mshtml;

namespace SelectBoxDren
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

                private void button2_Click(object sender, EventArgs e)
                {
                    comboBox2.Items.Clear();
                    webBrowser1.Navigate(hedefAdres.Text);
                }

                private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
                {
                    if (webBrowser1.Document != null)
                    {
                        HtmlElementCollection selectElems = webBrowser1.Document.GetElementsByTagName("select");
                        foreach (HtmlElement selElem in selectElems)
                        {
                            comboBox2.Items.Add(selElem.Id);
                        }

                    }

                }
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
                {
                    int sira;
                    richTextBox1.Text = '';
                    string secimId = comboBox2.SelectedItem.ToString();
                    HtmlElement sSelect = webBrowser1.Document.GetElementById(secimId);
                    for(sira=0;sira < sSelect.children.count; sira++ )
{
richTextBox1.Text += sSelect.Children[sira].InnerText + Environment.NewLine;
                    }
                }



        }
    }

co-scripts tag image webbrowsermshtmlhtmlelementhtmlparsing
ID:220 | Okunma:5795


 

Merhaba,

Kısaca yazacağım. Bir projede webbrowser kontrolü kullandığınızda kesinlikle içine yüklediğiniz (webbrowser1.navigate(url) ) sayfanın tam yüklenip yüklenmediği, işlemin tamamlanıp tamamlanmadığı sizin için önemli olacaktır.

Bunun kontrolü için while döngüsünde WebBrowserReadyState. durumlarına bakacaksınız. Ancak ben bir projemde bu duruma bakarken programın başka işlem yapmadığını hatta işlemleri tamamen durdurduğunu gördüm ve bu noktada takıldım kaldım.

Biraz web araştırması İngilizce ve Türkçe çözümlere ulaştırdı. Çözümlerden birisi yazılmış bir sınıf olan MessageBoxEx() kullanmak. Böylece mesaj kutusu çıktığında browser yüklemesine devam edebiliyor. Belirtilen süre sonunda da mesaj kutusu kayboluyor. Bunun sakıncası geç yüklenen bir sayfada sürenin saptanamaması.

Şu adresten ilgili makale ve sınıfı bulabilirsiniz. (Microsoft'un sayfası)

Gelelim bir Türkçe forumdan bulduğum güzel çözüme. Kesinlikle anlamlı ve bu bilgi az yerde bulunuyor.

http://www.csharpnedir.com/forum2/printer_friendly_posts.asp?TID=17232 forumunda bulduğum çözüm şu

webbrowser1.navigate("www.google.com")
while(webbrowser1.ReadyState != WebBrowserReadyState.Complete)
{
// buraya kadar biliniyor zaten
Application.DoEvents(); // işin sırrı burada, programın kilitlenmemesini sağlıyor
}

Böylece sorunu aştım.

co-scripts tag image webbrowserreadystatedoeventswebbrowser1
ID:219 | Okunma:3608


 

Microsoft'un sitesinden alınmış bir örnektir. Üstüne bir kaç şey ekleyeceğim, kaybetmemek için geçici olarak koyuyorum. Bir örneğin parçası olacak.

function test(name, address) {
window.alert("Name is " + name + "; address is " + address);
}
private void InvokeTestMethod(String name, String address)
{
    if (webBrowser1.Document != null)
    {
        Object[] objArray = new Object[2];
        objArray[0] = (Object)name;
        objArray[1] = (Object)address;
        webBrowser1.Document.InvokeScript("test", objArray);
    }
}

Devam edilecek...

co-scripts tag image webbrowserinvokescriptwebbrowser.documentjavascript
ID:145 | Okunma:2031