Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sayfa kaynak kodundaki içeriklere ulaşmak
#11
IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver();
            driver.Navigate().GoToUrl("https://www.migros.com.tr/sut-kahvaltilik-c-4");
            Thread.Sleep(6000);
            for (int i = 1; i < 21; i++)
            {
                IWebElement elementUrunAd = driver.FindElement(By.XPath("/html[1]/body[1]/sm-root[1]/div[1]/main[1]/sm-product[1]/article[1]/sm-list[1]/div[2]/div[4]/div[2]/div[4]/sm-list-page-item["+i+"]/mat-card[1]/div[1]/a[1]"));
                IWebElement elementUrunFiyat = driver.FindElement(By.XPath("/html[1]/body[1]/sm-root[1]/div[1]/main[1]/sm-product[1]/article[1]/sm-list[1]/div[2]/div[4]/div[2]/div[4]/sm-list-page-item["+i+"]/mat-card[1]/div[2]/fe-product-price[1]/div[1]/div[1]/span[1]"));

                lstUrunFiyat.Items.Add("Adı : " + elementUrunAd.Text + " | Fiyatı: " + elementUrunFiyat.Text);

}


hocam şu kodları yazdım şiddetli bir deprem oldu tam test edemedim
Cevapla
#12
@Akif Alioğlu  öncelikle çok geçmiş olsun Hocam.

belirtiğiniz kodu denedim. aşağıdaki hata ile sonuçlanıyor.

Kod:
IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver();
           driver.Navigate().GoToUrl("https://www.migros.com.tr/sut-kahvaltilik-c-4");
           Thread.Sleep(6000);
           for (int i = 1; i < 21; i++)
           {
               IWebElement elementUrunAd = driver.FindElement(By.XPath("/html[1]/body[1]/sm-root[1]/div[1]/main[1]/sm-product[1]/article[1]/sm-list[1]/div[2]/div[4]/div[2]/div[4]/sm-list-page-item[" + i + "]/mat-card[1]/div[1]/a[1]"));
               IWebElement elementUrunFiyat = driver.FindElement(By.XPath("/html[1]/body[1]/sm-root[1]/div[1]/main[1]/sm-product[1]/article[1]/sm-list[1]/div[2]/div[4]/div[2]/div[4]/sm-list-page-item[" + i + "]/mat-card[1]/div[2]/fe-product-price[1]/div[1]/div[1]/span[1]"));
               textBox1.Text = "Adı : " + elementUrunAd + elementUrunFiyat;
           }  

Muhtemelen for döngüsündeki i değerini alırken birşeyleri yanlış yapıyor. zira i değerini silip sadece tek ürünü listelerken hata vermiyor. Fakat element id ve fiyat bilgisi yerine birtakım rakamlar veriyor. onu da aşağıya görüntülüyorum.



for döngüsündeki hata resmi :
Ara
Cevapla
#13
Sorun ürünlerin div class bölümündeki [ ] içeriğindeymiş. for döngüsündeki i ile sırayla gitmiyor. özellikle kampanyalı ürünlerde [ ] içindeki rakam i değerinden başka bir değer alıyor.

örneğin bahsettiğimiz linkteki 3 ürün kampanyalı bir ürün ve ilk baştaki ürün ile farklı bir değer alıyor.

ilk ürünün xpath yolu : /html/body/sm-root/div/main/sm-product/article/sm-list/div[2]/div[4]/div[2]/div[4]/sm-list-page-item[1]/mat-card/div[1]/a

iken 3. ürünün xpath yolu : /html/body/sm-root/div/main/sm-product/article/sm-list/div[2]/div[4]/div[2]/div[4]/sm-list-page-item[3]/mat-card/div[2]/a

oluyor. burada sondaki div[1] olarak kaldığından haliyle 3 üründe "xpath yol bulunamıyor" hatası veriyor. sırayla diğer ürünlere baktım. onlarda da benzer karışıklıklar mevcut.
Ara
Cevapla
#14
Kodun son hali

Kod:
IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver();
           driver.Navigate().GoToUrl("https://www.migros.com.tr/sut-kahvaltilik-c-4");
           Thread.Sleep(6000);

           int count = driver.FindElements(By.XPath("/html/body/sm-root/div/main/sm-product/article/sm-list/div[2]/div[4]/div[2]/div[4]/sm-list-page-item")).Count;
           
           for (int i = 1; i < 3; i++)
           {
               string elementUrunAd = driver.FindElement(By.XPath("/html[1]/body[1]/sm-root[1]/div[1]/main[1]/sm-product[1]/article[1]/sm-list[1]/div[2]/div[4]/div[2]/div[4]/sm-list-page-item[" + i + "]/mat-card[1]/div[1]/a[1]")).Text;
               string elementUrunFiyat = driver.FindElement(By.XPath("/html/body/sm-root/div/main/sm-product/article/sm-list/div[2]/div[4]/div[2]/div[4]/sm-list-page-item[" + i + "]/mat-card/div[2]/fe-product-price/div/div/span")).Text;
               lstUrunFiyat.Items.Add("Adı : " + elementUrunAd + " = " + elementUrunFiyat);
           }    

Bu aşamada listenin resmi :



isim ve fiyat sağlıklı bir şekilde geliyor. int count elemanı ile kaç adet ürün olduğunu ve for döngüsüne de bu değeri yazdığımda listelenen tüm ürünleri alabileceğim.

Fakat yukarda bahsettiğim gibi özellikle kampanyalı ürünlerde sondaki div içeriği for döngüsündeki i değerinden farklı değer alıyor. Bunu nasıl çözecez? Big Grin
Ara
Cevapla
#15
Teşekkür ederim şansa tam test edemeden deprem oldu cyropath ile xpath değerine baktınızmı yada oktay hocanınn anlattığı şekilde

Ben zaman bulursam tekrar bakarım hocam
Cevapla
#16
öncelikle her ürünün xpath adresini stringlere atayıp o adresleri for döngüsüne ekleterek listboxa yazdırmalıyım. sayfada kaç adet ürünün olduğunu ("int count = driver.FindElements(By.XPath") komutuyla elde edebiliyorum fakat sayfada bulunan tüm bu ürünlerin xpath adreslerini stringlere atamanın yolunu bulamadım.

Sayfadaki ürünlerin xpath adreslerini otomatik olarak okutabilirsem tamam olucak gibi.
Ara
Cevapla
#17
hatamız xpath absolute ile yapmak imiş. xpath relative adresini alınca listeledi :Smile

Ara
Cevapla
#18
Çok iyi.. bir sorum olacak Emre abiden özür diliyorum konuyla alakasız xp kullanma sebebiniz nedir.
Cevapla
#19
(09-12-2021, Saat: 00:17)Akif Alioğlu Nickli Kullanıcıdan Alıntı:  Çok iyi.. bir sorum olacak Emre abiden özür diliyorum konuyla alakasız xp kullanma sebebiniz nedir.

xp kullanmıyorum windows 7 kullanıyorum. sadece tema sevmem. win95 den beridir klasik görünümde kullanırım oldu bitti.



Bu aşamada bir tavsiye daha alabilirim. Daha önce hayal meyal hatırladığım kadarıyla oluşan listeyi excelle aktarıyordum zira kg/lt fiyatına göre form içerisinde listeleme yapmayı becerememiştim.

Acaba Listeleme yaparken listview mi? datagridview mi? veya başka bir şey varsa onu mu kullanmalıyım?

Amacım listede 3 sütun olucak. Ürün adı, fiyatı, en önemlisi son sütun kg/lt fiyatı.  aşağıda örnek resim gibi. kg/lt fiyatı sütununa bastığımda oluşan listeyi ucuzdan pahalıya olucak şekilde yapılandıracak. Dediğim gibi daha önce excelle aktardığımda excel bu sıralamayı yapıyordu. excelle gerek kalmadan hangisiyle yaparsam daha uygun olur sizce?

Ara
Cevapla
#20
Anladım Smile teşekkürler Datagridview ile en mantıklı oda stabil değil. Datatable ile son göstermeden önce sıralayabilirsiniz
Cevapla

{lang: 'en'}


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Soru Raspberry Pi'de kök dosyalara ulaşmak? vayvan 0 1,543 31-01-2019, Saat: 00:38
Son Yorum: vayvan

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi
Change Theme