C# Webbrowser İpuçları

 
 
 
 

C# ile yazdığımız bir uygulamayı web sayfalarıyla etkileşime sokmak istediğimizde sınırlı sayıda alternatiften birisi, Webbrowser.

(Alternatif olarak; HttpWebRequest ya da Html Agility Pack kullanabilirsiniz.)

Sık sık C# kullanmadığım için kullanmam gerektiğinde, araştırmaya harcadığım süreyi azaltmak adına, en çok lazım olan şeyleri buraya not almak istedim. Ayrıca C# ile bot yazmak isterseniz de buradaki bilgiler oldukça işinize yarayabilir.

1 – Web Sayfasındaki Bir Nesneyi Seçmek

Burada nesneId yerine seçmek istediğiniz nesnenin Id’sini, webBrowser1 yerine de uygulamanızdaki webBrowser’in adını yazmanız gerekiyor.

Seçtiğiniz nesnenin içeriğini html olarak almak isterseniz :

Seçtiğiniz nesnenin içeriğini yazı olarak almak isterseniz, örneğin seçtiğiniz nesnenin html kodu  <h1>Merhaba</h1><span>Ahmet</span> şeklindeyken siz bunu Merhaba Ahmet şeklinde alabilirsiniz :

 2 – Web Sayfasındaki Birden Fazla Nesneyi Seçmek

Bu işlem için ufak bir döngü kullanmamız gerekiyor.

Seçmek istediğimiz nesnenin etiketini kullanarak kuracağımız bu döngü de çeşitli filtreler uygulayarak nokta atışı yapmak mümkün.

En basit şekli ile aynı etikete sahip nesneleri çekmek istersek :

Burada birden fazla nesne seçmiş olduğumuz için HtmlElement yerine HtmlElementCollection kullandık.

Döngümüze ufak bir filtre uygulayıp sadece belirli bir sınıfa sahip olanları da çekebiliriz : (Sınıftan kastım Html de ki Class)

Normalde GetAttribute methodunu kullanırken className gibi istisnalar hariç direk html deki özellik adını kullanıyoruz;

  • Adı yani Name için -> GetAttribute(“name”);
  • Linki yani Href için -> GetAttribute(“href”);
  • Kaynağı yani Source için -> GetAttribute(“src”);
  • Çeşidi yani Type için -> GetAttribute(“type”);

Gibi.

Hazır GetAttribute() methodundan bahsetmişken kısaca SetAttribute() methoduna da değinmek istiyorum.

SetAttribute() methodu da nesneye ait bir özelliği değiştirmemize olanak sağlıyor.

Kullanımı ise nesne.SetAttribute("ozellik", "yeniDeger");  şeklinde. GetAttribute() de ki gibi özellik adını yazdıktan sonra, yeni değerini yazmamız yeterli oluyor :

3 – Seçilen Nesnenin İçeriğini Değiştirmek

Nesneleri seçtikten sonra seçmekle kalmayıp, nesnenin içeriğini değiştirmemiz mümkün :

Burada nesneyi bir textbox yani türü text olan bir input olarak düşünürsek, içindeki yazı deneme olarak değişecektir.

4 – İşlem Yapmadan Önce Sayfanın Yüklenmesini Beklemek

Genel sıkça karşılaştığım problemlerden birisi de sayfa yüklenmeden botun, uygulamanın harekete geçmesi.

Burada ortaya şöyle bir sorun çıkıyor; uygulama sayfa yüklenmeden işlem yapmaya çalıştığı için içeriğini okuyacağı ya da içeriğini değiştireceği ya da başka bir şey yapacağı nesneyi bulamıyor ve program hataya düşüyor.

Bunu engellemek için kodumuzdan önce ekleyeceğimiz ufak bir while döngüsü yeterli oluyor.

Burada webBrowser1 yerine formunuzdaki tarayıcının adını yazmanız gerekiyor. Döngünün içine eklediğimiz Application.DoEvents() sayfa yüklenirken uygulamamızın kitlenmesini engelliyor.

5 – Eventleri Tetiklemek

Web sayfalarının gittikçe daha etkileşimli hale gelmesi, uygulamamızın etkileşimini de arttırmamızı gerektiriyor.

Bu noktada tıklama(click), mouse’u çekme(mouseout), seçimi değiştirme(onchange) gibi event’ları tetiklemek için  InvokeMember() methodunu kullanmamız gerekiyor.

Kullanımı ise oldukça basit, InvokeMember() içine tetiklemek istediğimiz event’ın adını yazıyoruz. Eventların adını nereden öğreneceğiz derseniz, aslında zaten biliyoruz 🙂

Yani javascript de kullandığımız event’ın adını yazmamız yeterli oluyor :

şeklinde bir kodumuz olsun, buradaki onchange event’ını tetiklemek için tek yapmamız gereken nesneyi seçtiken sonra  InvokeMember("onchange")  eklemek :

Click (tıklama) eventını bu şekilde de kullanabiliyoruz, diğer eventlarda da aynısı var mıdır bilmiyorum. Tıklamada  onclick ya da click yazıyoruz :

 6 – Select Seçili Değeri Değiştirmek

Select de seçili değeri değiştirmenin iki yolu var.

Birinci yol direk value(değerini) değiştirmek, ikinci yol ise direk seçili değeri değiştirmek.

Direk value değiştirmek :

Direk value değiştirmek kestirme bir çözüm fakat her zaman işe yaramayabiliyor. Böyle durumlarda direk seçili değeri değiştirebiliyoruz :

 

Şimdilik aklıma gelenler bunlar. Merak ettiğiniz başka bir şey olursa ya da anlattığım şeylerde bir yanlışlık fark ederseniz, 30 saniyenizi ayırıp yorum yazmanız yeterli 🙂

Özellikler ve methodlar hakkında daha fazla bilgi almak isterseniz -> https://msdn.microsoft.com/tr-tr/library/system.windows.forms.htmlelement%28v=vs.110%29.aspx

 

 
 
 
 
  • murat

    4 Kasım 2015 22:10

    Öncelikle selamlar, yazınınız oldukça anlaşılır; bunun için teşekkür etmek isterim. burada bir sorum olacak. webbrowser ile bir siteye giriş yaptıktan sonra yukarıdaki yazınızda bahsettiğiniz yöntemlerle textbox ve buton nesnelerine ulaşarak login işlemini gerçekleştirebiliyorum. buraya kadar sorun yok. Login olduktan sonra URL değişmeden aynı sayfada yeni texbox ve buton nesnesi ortaya çıkıyor. Ancak, bu nesnelere hiç bir şekilde ulşamadım. Bunun bir yolu varmıdır acaba?
    Not: mevcut durumda bazı verileri kopyala yapıştır yapmak zorunda kalıyorum. yani yarı otomatik bir uygulama olmuş oluyor. eğer bunu başarabilirsem çok daha güzel olacak. cevaplarsanız minnettar olurum, cevaplamazsanız da canınız sağolsun. paylaşım için tekrar teşekkürler.

    Cevapla

    • ahmet

      9 Kasım 2015 10:53

      Değerli yorumunuz için teşekkürler.
      Benim aklıma şu şekilde bir çözüm geldi;
      Giriş butonuna tıkladıktan 5-10 saniye sonra çalışan bir timer tanımlarsınız. Bu timer’da textbox ve butonu yakalayacak olan fonksiyonu çalıştırır.

      Cevapla

      • murat

        10 Kasım 2015 11:28

        cevabınız için teşekkür ederim. sonradan fark ettim ki sonradan açılan formun gizli olduğunu farkettim bunun için bir çözüm varmıdır acaba ?
        ….
        <input type="hidden"….
        ….
        şimdiden teşekkürler.

        Cevapla

        • ahmet

          13 Kasım 2015 17:55

          İnput’un gizli olması bir şeyi değiştirmez, eğer hidden tipindeki input’a değer vermek istiyorsanız setAttribute fonksiyonu ile “value” değeri atamanız yeterli olacaktır. bkz;
          girisInput.SetAttribute("value", "buraya değer işte :) ");

          Cevapla

          • murat

            14 Kasım 2015 22:39

            deneyeceğim şimdiden teşekkürler…

  • salih

    9 Ocak 2016 16:13

    Browser a cocuk filtresi eklemek istiyorum yardimci olurmusunuz acaba link kod vs???

    Cevapla

    • ahmet

      10 Ocak 2016 17:38

      Merhaba Salih bey,
      Bahsettiğiniz konu hakkında bir bilgim yok fakat chrome ve firefox gibi tarayıcılar için url engellemeye yönelik eklentiler var. O şekilde araştırırsanız belki bir şeyler bulabilirsiniz.

      Cevapla

  • Ali

    9 Eylül 2016 08:57

    Sitenizi geç fark ettim bunun üzüntüsünü yaşıyorum öncelikle. Başarılar dilerim.

    HtmlAgilityPack kullanma şansı olmayan ya da kullanmaması gerekenler için element ayıklamada bu yöntem gayet uygun aslında.

    Cevapla

  • Erkan

    16 Ekim 2016 19:09

    İyi günler.Aşağıdaki gibi bir kodum var gmail oturum aç sayfasına ulaştıktan sonra adresi yazıp butona tıklatıyorum ve yeni sayfa açılıyor o sayfadaki şifre kısmınıda doldurmak istiyorum fakat html id den o input a ulaşamıyorum null reference exception hatası alıyorum çünkü verdiğim id yi bulamıyor ikinci açılan sayfadaki input a nasıl ulaşabilirim yardımcı olurmusunuz teşekkürler.

    Application.DoEvents();

    webBrowser1.Document.GetElementById(“Email”).SetAttribute(“value”, textBox1.Text); ;
    button_click(“next”);

    webBrowser1.Document.GetElementById(“Passwd”).SetAttribute(“value”, “xxx”);
    button_click(“signIn”);

    Cevapla

    • ahmet

      17 Ekim 2016 15:13

      Tam olarak anlayamadım. Verdiğiniz id, ikinci sayfada olduğu halde mi bulamıyor ?
      Bir de ikinci sayfa popup olarak flan açılmıyor dimi ?

      Cevapla

      • Erkan

        17 Ekim 2016 18:51

        Aynen verdiğim id ikinci sayfada olduğu halde bulamıyor. Hatta button_click(“next”) den sonra Application.DoEvents() bunuda kullandım sayfa tam olarak yüklenmeden işlem yapmasın diye fakat yine hata veriyor.Hata aldığım kısım webBrowser1.Document.GetElementById(“Passwd”).SetAttribute(“value”, “xxx”); bu koddur.İkinci sayfa popup olarak açılmıyo normal istediğim şekilde ikinci sayfayı açıyor direk.

        Cevapla

        • ahmet

          18 Ekim 2016 08:07

          Sayfa tam yüklenmediği için bulamayıp hata veriyor muhtemelen.
          webBrowser1.Document.GetElementById(“Passwd”).SetAttribute(“value”, “xxx”);
          Bu kodun öncesine alttaki kodu ekleyip deneyin,
          while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
          {
          Application.DoEvents();
          System.Threading.Thread.Sleep(5);
          }

          Eğer yine hata alırsanız
          for (int i = 0; i < 250; i++) { Application.DoEvents(); System.Threading.Thread.Sleep(1); }
          Bunu da ekleyip deneyin. Muhtemelen sorununuz çözülecektir.
          İnternet bağlantınız yavaşsa 250'yi daha da arttırabilirsiniz.
          Doğru çözüm bu mudur bilemiyorum ama işe yaradığını söyleyebilirim 😀

          Cevapla

  • ALİ GÖKMEN

    25 Ekim 2016 11:49

    Emeğinize sağlık…
    Benim konu ile alakalı bir sorum olacak . Yardımcı olabilirseniz sevinirim.

    http://keos.izmit.bel.tr/keos/ >>> bu link İzmit belediyesinin harita sitesinin. Mahalle ve sokak seçtiğimde web browserda gözükmesini istiyorum.
    Select içindeki değerleri değiştirirken bahsettiğiniz yöntemleri kullandım ama olmuyor.
    Mahalle tamam ama sokak seçeneğinin içindeki değeri bir türlü değiştiremiyorum.
    Yardımcı olursanız çok makbule geçer.

    Cevapla

  • Emin

    4 Şubat 2017 12:30

    C# ile otomatik butona tıklamak için ne yapabilirim ?

    Cevapla

    • Emin

      4 Şubat 2017 12:31

      C# ile otomatik butona tıklamak için ne yapabilirim ?

      Cevapla

      • ahmet

        8 Şubat 2017 09:24

        HtmlElement nesne = webBrowser1.Document.GetElementById("buton");
        nesne.InvokeMember("click");

        Şeklinde bir komut ile butona tıklattırabilirsiniz. Otomatik tıklamadan kastınız nedir bilmiyorum fakat bu kodu çalıştırdığınız yerde tıklayacaktır.

        Cevapla

Yorum Gönder

Bilgi : E-posta Adresin Sadece İletişim için, kimsecikler görmeyecek.