#

TECRÜBEMİZİ YAZILIMCILARLA 

PAYLAŞIYORUZ. 

BİLGİ PAYLAŞTIKÇA ÇOĞALIR

BLOG

C# ile Html İçerisindeki Butonları Tetikletmek ve Veri Okumak

C# ile Html İçerisindeki Butonları Tetikletmek ve Veri Okumak

Widows Form uygulaması ile istediğimiz HTML sayfasındaki veriyi okumamız mümkündür. Bu veri içerisinden özelliklerine göre istediğimiz bölümü ayırabiliriz, hatta HTML içerisindeki butonları ve diğer elementleri tetikletebiliriz, bunun için C# ve HtmlAgilityPack bilgisi bizim için yeterli olacaktır.

Öncelikle bu işlem için Visual Studio’yu açıp bir Windows Form projesi oluşturuyoruz.Sonrasında ise Toolbox’tan WebBrowser,Buton ve Timer ekliyoruz.

Geriye Html Parse ederken kullancağımız HmtlAgilityPack ‘yi yüklememiz kalıyor.Bunun için de, Tools>Nuget Package Manager>Package Manager Console yolunu izliyoruz.Açılan konsolda Install-Package HtmlAgilityPack” komutu ile HmtlAgilityPack’i yüklüyoruz. Şimdi WebBrowser üzerinde veriyi çekeceğimiz HTML sayfasını açmamız için Formun Load Event’e

“WebBrowser1.Navigate("http://manta.com.tr/");” kodunu yazıyoruz.

Sadece HTML içerisindeki veriyi okumak istiyorsak, butonun Click Event’ine 

“var Data = WebBrowser1.Document.Body.InnerHtml;” kodunu yazmamız yeterlidir.

Data içerisinden istediğimiz HTML nesnesine erişmek istiyorsak, Nuget Package yardımı ile kurduğumuz HtmlAgilityPack’i kullanmamız gerekiyor.Bunun için; using HtmlAgilityPack; namespace’ini kodumuza eklememiz yeterlidir.Kodun kullanımına gelirsek şu şekilde;

var htmlDoc = new
HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(Data);
var cells = htmlDoc.DocumentNode.SelectNodes("//table[@role='grid']/") [2];

Bu kod bloğu HTML içerisindeki Table’lar içerisinden role attribute değeri grid olan HTML kodunu bize verir, eğer HTML içerisinde bu durumu sağlayan birden fazla table varsa örnek kodda olduğu gibi ([2]) kaçıncı table bizim için uygunsa onu çekmenizi sağlar.

Eğer HTML içerisinde bulunan bir Butonu, Linki yada benzeri bir nesneyi tetikletmek istiyorsak önce bu nesneyi bulmamız gerekiyor. Sonrasında ‘InvokeMember’ kodu nesneyi tetiklememizi sağlıyor.

WebBrowser1.Document.All["nesneninIDsi"].InvokeMember("click");

veya

HtmlElement Btn = WebBrowser1.Document.All["nesneninIDsi"];
            object obj = Btn.DomElement;
            object[] arg = { };
            System.Reflection.MethodInfo mi = obj.GetType().GetMethod("click");
            var Method = mi.Invoke(obj, arg);

Koduyla da gerçekleştirebiliriz.İki kod bloğu da aynı işlevi gerçekleştirmektedir.Bu kod HTML içerisindeki değişikliği belirli bir süre geçtikten sonra gerçekleştiriyor.Yani biz bu kodu yazdıktan sonra alt satırında HTML içerisindeki nesneyi çekmek istersek 

“var Data = WebBrowser1.Document.Body.InnerHtml;”  

“click” işlevinden önceki HTML datasını elde etmiş oluyoruz. Eğer “click” işlevi sonrası datayı elde etmek istiyorsak bu kodu Timer içerisine yazmalıyız. Örneğin “click” işlevinden sonra yeni yüklenecek olan HTML sayfasında “yeniID” isimli bir nesne var, Timer içerisinde bunu sorgulayarak yeni HTML sayfamızın oluşup oluşmadığının kontrolünü sağlayabiliriz.

“var Data = WebBrowser1.Document.Body.InnerHtml;”

If(WebBrowser1.Document.All["yeniID"] !=
null && WebBrowser1.Document.Body.InnerHtml.Contains("yeniID"))

{ … }

Timer içerisinde bu koşuldan sonra yeni oluşan HTML datasını çekip. Benzer işlevler yapmaya devam edebiliriz.

HtmlAgilityPack ile alakalı dökümantasyona  http://html-agility-pack.net/documentation adresinden ulaşabilirsiniz.