Selenium C# Element Bulma

harman1999

Katılımcı Üye
1 Eyl 2014
726
0
Merhaba arkadaşlar, c# selenium projesi üzerine çalışıyorum. Bir bot yapmaktayım fakat bir sorunum var Google'in sunucu tarafından yüklediği elementlerin xpatch kodlarını projeye dahil etmeme rağmen bulamıyor. Sanırım nedenide site yüklendikten sonra 1-2 saniye sonra sunucu tarafından tarayıcıya alanlar aktarıyor ve bunun neticesinde selenium ile kodların xpath lerini bulamıyor ve tiklattiramiyorum. Acaba bunun için bir çözüm var mı ?


Not: Thred.sleep kullansam da olayı çözemedim. Burada ki sorun şu oluyor arkadaslar , sayfa yükleniyor. Elementler alınıyor fakat Googlenin formu sonradan yükleme yapıyor , öncesinde sayfa yüklemesi tamamlandığı içinde seleniumda bu elementleri görmüyor bunu nasıl çözebiliriz ?
 
Son düzenleme:

Darkpaw

Katılımcı Üye
10 Ağu 2011
386
5
Dubai
Hocam onda başına //[div] gibi bir şey ekliyorlardı. Ben twitter login selenium gibi bir şey yazarak bir youtube videosu bulup ordan bakmıştım. Bir bakın siz de o videoya. Açıklama kısmında txt olarak kodun indirme bağlantısı da vardı
 

harman1999

Katılımcı Üye
1 Eyl 2014
726
0
Hocam onda başına //[div] gibi bir şey ekliyorlardı. Ben twitter login selenium gibi bir şey yazarak bir youtube videosu bulup ordan bakmıştım. Bir bakın siz de o videoya. Açıklama kısmında txt olarak kodun indirme bağlantısı da vardı
Hemen bakacağım hocam. Sağolasın. Başka fikri olan arkadaşlardan yardım bekliyorum.
 

BeoWulf007

Kıdemli Üye
19 Haz 2013
2,763
20
508
24
Praise The Fool
Dostum bence öncelikle xpath kullanmayı bırakmalısın, Javascript css selector kullanırsan daha ileriye dönük bir programın olur keza sayfanın yapısında en ufak bir değişim xpath'lerin bozulmasına yol açar ancak css selector ile elementlerin class ve id'lerinde düzenlemene yapılmadığı müddetçe zor bozulacaktır.

Sorunun cevabına gelirsek de bilmiyorum keza şimdiye kadar selenium yerine hep htmlagilitypack ile çözdüm işlerimi neyse soruna gelecek olursak yanlış anlamadıysam sayfada bellir bir süre sonra js ile dinamik element ekleniyor anlamadığım nokta ise bunu neden yakalamıyor oluşu zaten tarayıcı motoru sürekli çalışmıyor mu? thread sleep'in işe yaramama sebebi acaba threadi uyuttuğu ve selenium da aynı threadde çalıştığı için olabilir mi? sleep yerine wait tarzı bir method kullanmayı denedin mi?

Biraz kör bir şekilde yardımcı olmaya çalışıyorum kusura bakma lütfen ama selenium'un kendi sayfasında şöyle bir kod parçacığı buldum.

C#:
driver = new ChromeDriver();
driver.Url = "https://www.google.com/ncr";
driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
         
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement firstResult = wait.Until(e => e.FindElement(By.XPath("//a/h3")));

Console.WriteLine(firstResult.Text);

Bunu kendi projene uyarlayabilirsin. WEbDriverWait sınıfında istediğin şekidle bekletebiliyormuşsun, bu sınıfın detaylarına hakim değilim test edip alt methodlarını da görmek lazım. Bu örnekte lambda ile belirli bir element gelene kadar bekletiyor gibi duruyor, path olarak senin yüklenmediğini söylediğin elementin path'ini verip geri dönüşü test edebilirsin belki.
Ya da bu bekleme koşulu zaman gibi şeylere de bağlanması denenebilir.
 

harman1999

Katılımcı Üye
1 Eyl 2014
726
0
Dostum bence öncelikle xpath kullanmayı bırakmalısın, Javascript css selector kullanırsan daha ileriye dönük bir programın olur keza sayfanın yapısında en ufak bir değişim xpath'lerin bozulmasına yol açar ancak css selector ile elementlerin class ve id'lerinde düzenlemene yapılmadığı müddetçe zor bozulacaktır.

Sorunun cevabına gelirsek de bilmiyorum keza şimdiye kadar selenium yerine hep htmlagilitypack ile çözdüm işlerimi neyse soruna gelecek olursak yanlış anlamadıysam sayfada bellir bir süre sonra js ile dinamik element ekleniyor anlamadığım nokta ise bunu neden yakalamıyor oluşu zaten tarayıcı motoru sürekli çalışmıyor mu? thread sleep'in işe yaramama sebebi acaba threadi uyuttuğu ve selenium da aynı threadde çalıştığı için olabilir mi? sleep yerine wait tarzı bir method kullanmayı denedin mi?

Biraz kör bir şekilde yardımcı olmaya çalışıyorum kusura bakma lütfen ama selenium'un kendi sayfasında şöyle bir kod parçacığı buldum.

C#:
driver = new ChromeDriver();
driver.Url = "https://www.google.com/ncr";
driver.FindElement(By.Name("q")).SendKeys("cheese" + Keys.Enter);
        
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement firstResult = wait.Until(e => e.FindElement(By.XPath("//a/h3")));

Console.WriteLine(firstResult.Text);

Bunu kendi projene uyarlayabilirsin. WEbDriverWait sınıfında istediğin şekidle bekletebiliyormuşsun, bu sınıfın detaylarına hakim değilim test edip alt methodlarını da görmek lazım. Bu örnekte lambda ile belirli bir element gelene kadar bekletiyor gibi duruyor, path olarak senin yüklenmediğini söylediğin elementin path'ini verip geri dönüşü test edebilirsin belki.
Ya da bu bekleme koşulu zaman gibi şeylere de bağlanması denenebilir.
Çok teşekkür ederim hocam, PC de değilim geçince deneyeceğim. Dediğiniz gibi wait i hiç kullanmadım. Dediğiniz sorunu çözebilir deneyeceğim. Sonucu belirtirim. Teşekkürler.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.