{"id":32112,"date":"2025-10-17T22:01:50","date_gmt":"2025-10-17T19:01:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/"},"modified":"2025-10-17T22:01:50","modified_gmt":"2025-10-17T19:01:50","slug":"xpathy-flaky-testleri-bitiren-fluent-api","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/","title":{"rendered":"XPathy: Flaky Testleri Bitiren Fluent API"},"content":{"rendered":"<p><body><\/p>\n<p>Web otomasyon testleriniz s\u00fcrekli &#8220;flaky&#8221; mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath&#8217;in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy&#8217;nin Fluent API&#8217;\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.<\/p>\n<p>Modern web uygulamalar\u0131, s\u00fcrekli de\u011fi\u015fen ve geli\u015fen yap\u0131lar\u0131yla test otomasyon m\u00fchendisleri i\u00e7in ciddi zorluklar sunar. Tek sayfa uygulamalar\u0131 (SPA&#8217;lar) ve dinamik olarak y\u00fcklenen i\u00e7erikler, elementlerin DOM&#8217;daki konumunu s\u00fcrekli de\u011fi\u015ftirebilir veya g\u00f6r\u00fcn\u00fcrl\u00fcklerini anl\u0131k olarak etkileyebilir. Bu durum, otomasyon testlerimizin en b\u00fcy\u00fck d\u00fc\u015fman\u0131 olan &#8220;flaky test&#8221; olgusunu ortaya \u00e7\u0131kar\u0131r. Flaky testler, ayn\u0131 kod ve ayn\u0131 ortamda bazen ge\u00e7erken bazen ba\u015far\u0131s\u0131z olan, g\u00fcvenilmez testlerdir. Bir testin bir kez ba\u015far\u0131l\u0131 olup, sonraki \u00e7al\u0131\u015ft\u0131rmada rastgele bir nedenden ba\u015far\u0131s\u0131z olmas\u0131, otomasyon sistemlerine duyulan g\u00fcveni temelden sarsar.<\/p>\n<p>Geleneksel olarak, web elementlerini hedeflemek i\u00e7in XPath ve CSS Selector&#8217;lar kullan\u0131l\u0131r. XPath, esnekli\u011fi sayesinde \u00e7o\u011fu senaryoda i\u015fimizi g\u00f6rse de, karma\u015f\u0131k ve dinamik web sayfalar\u0131nda yaz\u0131m\u0131 zorla\u015f\u0131r, okunabilirli\u011fi d\u00fc\u015fer ve en \u00f6nemlisi son derece k\u0131r\u0131lgan hale gelir. K\u00fc\u00e7\u00fck bir UI de\u011fi\u015fikli\u011fi, hatta bir div etiketinin araya girmesi bile t\u00fcm XPath ifadesini ge\u00e7ersiz k\u0131labilir. Bu durum, test senaryolar\u0131n\u0131n s\u00fcrekli bak\u0131m\u0131n\u0131 gerektirir ve geli\u015ftirme s\u00fcre\u00e7lerini yava\u015flat\u0131r.<\/p>\n<p>Peki, bu k\u0131r\u0131lganl\u0131\u011f\u0131 nas\u0131l a\u015fabiliriz? Test otomasyonunun temel amac\u0131, yaz\u0131l\u0131m\u0131n kalitesini g\u00fcvence alt\u0131na almak ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rmakt\u0131r. Ancak, flaky testler bu hedeflerin tam tersini yapar; geli\u015ftiricilerin zaman\u0131n\u0131 hata ay\u0131klama ve s\u00fcrekli test d\u00fczeltmeleriyle bo\u015fa harcamalar\u0131na neden olur. G\u00fcvenilir olmayan test sonu\u00e7lar\u0131, ger\u00e7ek hatalar\u0131n g\u00f6zden ka\u00e7mas\u0131na veya gereksiz yere d\u00fczeltmeler yap\u0131lmas\u0131na yol a\u00e7abilir. Bu d\u00f6ng\u00fc, sonunda otomasyon \u00e7abalar\u0131na olan inanc\u0131 azalt\u0131r ve manuel testlere geri d\u00f6n\u00fc\u015f e\u011filimini tetikler. \u0130\u015fte tam da bu noktada, geleneksel XPath yakla\u015f\u0131mlar\u0131n\u0131n yetersiz kald\u0131\u011f\u0131 ve daha modern, daha sa\u011flam \u00e7\u00f6z\u00fcmlere ihtiya\u00e7 duyuldu\u011fu a\u00e7\u0131k\u00e7a ortaya \u00e7\u0131kar. Art\u0131k sadece elementleri bulmak yeterli de\u011fil; onlar\u0131 dinamik ortamlara adapte olabilen, kolayca okunabilen ve bak\u0131m\u0131 yap\u0131labilir bir \u015fekilde bulmam\u0131z gerekiyor. Bu ihtiya\u00e7, XPathy gibi Fluent API&#8217;lar\u0131n y\u00fckseli\u015fini tetikleyen ana fakt\u00f6rlerden biridir. Bu t\u00fcr ara\u00e7lar, testlerin yaz\u0131lma ve s\u00fcrd\u00fcr\u00fclme \u015feklini k\u00f6kten de\u011fi\u015ftirerek, geli\u015ftiricilere daha sa\u011flam ve g\u00fcvenilir otomasyon testleri olu\u015fturma g\u00fcc\u00fc verir.<\/p>\n<h2 id=\"raw-xpath-neden-oldu-geleneksel-yaklasimin-eksiklikleri-nelerdi\">Raw XPath Neden &#8220;\u00d6ld\u00fc&#8221;? Geleneksel Yakla\u015f\u0131m\u0131n Eksiklikleri Nelerdi?<\/h2>\n<p>Geleneksel XPath, web elementlerini DOM (Belge Nesne Modeli) a\u011fac\u0131ndaki konumlar\u0131na g\u00f6re hedeflemek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Ancak bu g\u00fcc\u00fcn beraberinde getirdi\u011fi baz\u0131 ciddi zay\u0131fl\u0131klar vard\u0131r. Bir elementin tam yolunu belirten mutlak XPath&#8217;ler (<code class=\"language-xpath\">\/html\/body\/div[1]\/section\/ul\/li[2]\/a<\/code> gibi) son derece k\u0131r\u0131lgan olmalar\u0131yla bilinirler. Sayfaya k\u00fc\u00e7\u00fck bir element eklenmesi veya \u00e7\u0131kar\u0131lmas\u0131 bile bu yolu ge\u00e7ersiz k\u0131labilir. G\u00f6receli XPath&#8217;ler (<code class=\"language-xpath\">\/\/div[@id='sidebar']\/a[contains(text(),'Hizmetlerimiz')]<\/code> gibi) biraz daha esnek olsa da, yine de b\u00fcy\u00fck bir bak\u0131m y\u00fck\u00fc olu\u015ftururlar.<\/p>\n<p>D\u00fc\u015f\u00fcn\u00fcn ki, bir e-ticaret sitesindeki bir \u00fcr\u00fcn kart\u0131n\u0131 hedeflemek istiyorsunuz. Geleneksel bir XPath \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-xpath\">\n    \/\/div[@class='product-list']\/div[3]\/div[@class='product-card']\/a[@data-product-id='12345']\/h3\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu ifade, \u00fc\u00e7\u00fcnc\u00fc \u00fcr\u00fcn\u00fc se\u00e7en, belirli bir ID'ye sahip \u00fcr\u00fcn kart\u0131n\u0131n i\u00e7indeki ba\u015fl\u0131\u011f\u0131 hedefliyor. E\u011fer \u00fc\u00e7\u00fcnc\u00fc s\u0131radaki \u00fcr\u00fcn\u00fcn yeri de\u011fi\u015firse veya araya yeni bir element girerse, bu XPath an\u0131nda bozulur. Ayr\u0131ca, bu ifadeyi okumak ve neyi hedefledi\u011fini anlamak i\u00e7in HTML yap\u0131s\u0131n\u0131 iyi bilmek gerekir. \u00d6zellikle karma\u015f\u0131k XPath'ler, okunabilirlik a\u00e7\u0131s\u0131ndan bir labirente d\u00f6n\u00fc\u015febilir.<\/p>\n<div class=\"code-example\">\n<p>Geleneksel XPath'in bu karma\u015f\u0131k yap\u0131s\u0131, test otomasyonu ekipleri i\u00e7in zamanla ciddi bir maliyet olu\u015fturur. Testler ba\u015far\u0131s\u0131z oldu\u011funda, \u00f6ncelikle XPath ifadelerinin kontrol edilmesi gerekir ki bu da ciddi bir zaman kayb\u0131d\u0131r.<\/p>\n<\/p><\/div>\n<p>Bir di\u011fer \u00f6nemli sorun, dinamik web siteleridir. JavaScript ile s\u00fcrekli g\u00fcncellenen veya tamamen yeniden \u00e7izilen sayfalar, elementlerin ID'lerini, class'lar\u0131n\u0131 veya di\u011fer niteliklerini de\u011fi\u015ftirebilir. \u00d6rne\u011fin, bir form g\u00f6nderimi sonras\u0131 dinamik olarak olu\u015fturulan bir ba\u015far\u0131 mesaj\u0131n\u0131 hedeflemek, bazen imkans\u0131z hale gelebilir \u00e7\u00fcnk\u00fc mesaj\u0131n tam XPath'i her zaman farkl\u0131 olabilir veya sadece belirli bir zaman diliminde var olabilir. Geleneksel XPath, bu t\u00fcr dinamik de\u011fi\u015fimlere kar\u015f\u0131 \u00e7ok diren\u00e7li de\u011fildir. <code class=\"language-xpath\">starts-with()<\/code> veya <code class=\"language-xpath\">contains()<\/code> gibi fonksiyonlarla bir nebze esneklik sa\u011flansa da, genel \u00e7\u00f6z\u00fcm sunmaktan uzakt\u0131r.<\/p>\n<p>Ayr\u0131ca, geleneksel XPath'in en b\u00fcy\u00fck handikaplar\u0131ndan biri de \"insan odakl\u0131\" olmamas\u0131d\u0131r. Bir geli\u015ftirici veya test m\u00fchendisi, bir UI elementini d\u00fc\u015f\u00fcn\u00fcrken \"Sayfadaki 'Kaydet' d\u00fc\u011fmesini bul\" veya \"\u00dcr\u00fcn listesindeki 'Sepete Ekle' yazan butonu bul\" gibi ifadelerle d\u00fc\u015f\u00fcn\u00fcr. Ancak, geleneksel XPath yazarken bu do\u011fal d\u00fc\u015f\u00fcnce tarz\u0131ndan uzakla\u015farak, elementin DOM i\u00e7indeki hiyerar\u015fik ve teknik konumuna odaklanmak zorunda kal\u0131r\u0131z. Bu da d\u00fc\u015f\u00fcnce yap\u0131s\u0131yla kodlama aras\u0131ndaki mesafeyi a\u00e7ar ve hataya a\u00e7\u0131k bir ortam yarat\u0131r. Bu nedenlerle, test otomasyonunun giderek daha \u00f6nemli hale geldi\u011fi modern geli\u015ftirme d\u00f6ng\u00fclerinde, \"Raw XPath\" yakla\u015f\u0131m\u0131 art\u0131k yetersiz kalmakta ve \"\u00f6l\u00fc\" olarak nitelendirilmektedir. Daha sezgisel, daha sa\u011flam ve daha bak\u0131m\u0131 kolay bir yakla\u015f\u0131ma ihtiya\u00e7 duyulmaktad\u0131r.<\/p>\n<h2 id=\"xpathy-nedir-ve-fluent-api-ne-anlama-gelir\">XPathy Nedir ve Fluent API Ne Anlama Gelir?<\/h2>\n<p>XPathy, web otomasyon testlerinizdeki element bulma s\u00fcrecini devrim niteli\u011finde de\u011fi\u015ftirmeyi hedefleyen, XPath ifadeleri olu\u015fturmak i\u00e7in tasarlanm\u0131\u015f bir Fluent API yakla\u015f\u0131m\u0131d\u0131r. \"Fluent API\", bir API tasar\u0131m desenidir ve zincirleme metot \u00e7a\u011fr\u0131lar\u0131 kullanarak kodun daha okunabilir ve do\u011fal bir dil gibi akmas\u0131n\u0131 sa\u011flar. Ama\u00e7, karma\u015f\u0131k i\u015flemleri bile ad\u0131m ad\u0131m, anla\u015f\u0131l\u0131r bir s\u0131rayla ifade etmektir. XPathy'nin temel felsefesi, karma\u015f\u0131k ve k\u0131r\u0131lgan XPath ifadelerini, insan diline yak\u0131n, anla\u015f\u0131l\u0131r ve s\u00fcrd\u00fcr\u00fclebilir bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcrmektir.<\/p>\n<p>Geleneksel XPath yazarken kar\u015f\u0131la\u015f\u0131lan zorluklar g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, XPathy'nin Fluent API'\u0131, element hedefleme s\u00fcrecini basit, anla\u015f\u0131l\u0131r ad\u0131mlara b\u00f6ler. \u00d6rne\u011fin, bir \"Kaydet\" butonunu bulmak i\u00e7in art\u0131k <code class=\"language-xpath\">\/\/button[text()='Kaydet']<\/code> gibi bir ifade yazmak yerine, XPathy ile <code class=\"language-python\">XPathy().button().with_text(\"Kaydet\")<\/code> \u015feklinde ifade edersiniz. Bu, sadece bir s\u00f6z dizimi de\u011fi\u015fikli\u011fi de\u011fil, ayn\u0131 zamanda elementin ne oldu\u011funu ve neden se\u00e7ildi\u011fini anlatan bir ifade bi\u00e7imidir. Kodun okuyucusu, elementin hangi \u00f6zelliklere sahip oldu\u011funu ve ne anlama geldi\u011fini kolayca kavrayabilir, bu da bak\u0131m maliyetlerini \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<div class=\"tip-box\">\n<p><strong>Uzman \u0130pucu:<\/strong> Fluent API, kodunuzu do\u011fal dil gibi okuman\u0131z\u0131 sa\u011flayarak karma\u015f\u0131kl\u0131\u011f\u0131 azalt\u0131r ve hatalar\u0131 daha kolay tespit etmenize olanak tan\u0131r.<\/p>\n<\/p><\/div>\n<p>XPathy'nin Fluent API'\u0131, bir dizi metodu birbirine zincirleyerek karma\u015f\u0131k XPath'leri olu\u015fturur. Bu metotlar, HTML elementinin etiket ad\u0131 (<code class=\"language-python\">div()<\/code>, <code class=\"language-python\">button()<\/code>, <code class=\"language-python\">input()<\/code> gibi), i\u00e7erdi\u011fi metin (<code class=\"language-python\">with_text()<\/code>, <code class=\"language-python\">contains_text()<\/code> gibi), sahip oldu\u011fu nitelikler (<code class=\"language-python\">with_id()<\/code>, <code class=\"language-python\">with_class()<\/code>, <code class=\"language-python\">has_attribute()<\/code> gibi) veya DOM i\u00e7indeki ili\u015fkileri (<code class=\"language-python\">parent()<\/code>, <code class=\"language-python\">has_child()<\/code> gibi) baz alabilir. Bu yakla\u015f\u0131m, XPath ifadelerini daha mod\u00fcler hale getirir. Her bir metot, belirli bir ko\u015fulu veya \u00f6zelli\u011fi temsil eder ve bir araya geldiklerinde g\u00fc\u00e7l\u00fc ve spesifik bir element se\u00e7ici olu\u015ftururlar.<\/p>\n<p>S\u00fcrd\u00fcr\u00fclebilirlik a\u00e7\u0131s\u0131ndan da XPathy \u00f6nemli avantajlar sunar. Bir UI de\u011fi\u015fikli\u011fi oldu\u011funda, geleneksel XPath'i ba\u015ftan sona yeniden yazmak yerine, XPathy ifadesindeki ilgili metot \u00e7a\u011fr\u0131s\u0131n\u0131 g\u00fcncellemek genellikle yeterlidir. \u00d6rne\u011fin, bir elementin metni de\u011fi\u015firse sadece <code class=\"language-python\">with_text()<\/code> metodundaki de\u011feri g\u00fcncellemek yeterli olurken, DOM yap\u0131s\u0131ndaki bir de\u011fi\u015fiklik sadece <code class=\"language-python\">div()<\/code> yerine <code class=\"language-python\">span()<\/code> gibi etiket ad\u0131n\u0131 de\u011fi\u015ftirmeyi gerektirebilir. Bu mod\u00fcler yap\u0131, testlerin bak\u0131m\u0131n\u0131 h\u0131zland\u0131r\u0131r ve hatal\u0131 XPath'lerin neden oldu\u011fu \"flaky test\" say\u0131s\u0131n\u0131 azalt\u0131r. Sonu\u00e7 olarak, XPathy, test otomasyonunu sadece daha kolay de\u011fil, ayn\u0131 zamanda daha g\u00fcvenilir ve verimli hale getiren bir yakla\u015f\u0131md\u0131r.<\/p>\n<h3 id=\"xpathynin-temel-prensipleri-ve-felsefesi\">XPathy'nin Temel Prensipleri ve Felsefesi Nelerdir?<\/h3>\n<p>XPathy'nin arkas\u0131nda yatan temel prensipler, modern test otomasyonunun ihtiya\u00e7lar\u0131na cevap vermek ve geleneksel XPath'in zay\u0131fl\u0131klar\u0131n\u0131 gidermek \u00fczerine kuruludur. Bu prensipler, geli\u015ftiricilere daha iyi, daha sa\u011flam ve daha keyifli bir test yazma deneyimi sunmay\u0131 hedefler:<\/p>\n<ul>\n<li><strong>Okunabilirlik (Readability):<\/strong> En \u00f6nemli prensiplerden biridir. XPathy, kodun do\u011fal bir dil gibi okunmas\u0131n\u0131 sa\u011flar. <code class=\"language-python\">XPathy().div().with_text(\"Kullan\u0131c\u0131 Ad\u0131\")<\/code> ifadesi, \"\u0130\u00e7erisinde 'Kullan\u0131c\u0131 Ad\u0131' metni olan bir div bul\" anlam\u0131na gelir ve bir test m\u00fchendisi veya geli\u015ftiricinin anadilinde d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fc \u015fekle \u00e7ok yak\u0131nd\u0131r. Bu sayede, kodun ne yapt\u0131\u011f\u0131n\u0131 anlamak i\u00e7in DOM yap\u0131s\u0131n\u0131 detayl\u0131ca incelemeye gerek kalmaz.<\/li>\n<li><strong>S\u00fcrd\u00fcr\u00fclebilirlik (Maintainability):<\/strong> Web uygulamalar\u0131 s\u00fcrekli de\u011fi\u015fir. XPathy, bu de\u011fi\u015fikliklere kar\u015f\u0131 daha diren\u00e7li ifadeler olu\u015fturmaya odaklan\u0131r. Bir UI de\u011fi\u015fikli\u011fi oldu\u011funda, t\u00fcm XPath'i yeniden yazmak yerine, ilgili metot \u00e7a\u011fr\u0131s\u0131n\u0131 g\u00fcncellemek yeterli olur. Bu, testlerin bak\u0131m s\u00fcresini ve maliyetini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/li>\n<li><strong>Sa\u011flaml\u0131k (Robustness):<\/strong> Dinamik element ID'leri, de\u011fi\u015fen class'lar veya DOM'daki hiyerar\u015fik de\u011fi\u015fiklikler flaky testlere neden olabilir. XPathy, <code class=\"language-python\">starts_with()<\/code>, <code class=\"language-python\">contains_text()<\/code>, <code class=\"language-python\">has_attribute()<\/code> gibi metotlarla bu dinamik de\u011fi\u015fimlere kar\u015f\u0131 daha dayan\u0131kl\u0131 element se\u00e7icileri olu\u015fturmay\u0131 te\u015fvik eder. Bu sayede testler, k\u00fc\u00e7\u00fck UI de\u011fi\u015fikliklerinden daha az etkilenir.<\/li>\n<li><strong>Dinamik \u0130\u00e7eri\u011fe Adaptasyon (Adaptability to Dynamic Content):<\/strong> AJAX \u00e7a\u011fr\u0131lar\u0131 veya JavaScript manip\u00fclasyonlar\u0131 ile y\u00fcklenen i\u00e7erik, elementlerin anl\u0131k olarak var olup olmad\u0131\u011f\u0131n\u0131 etkileyebilir. XPathy, bu t\u00fcr dinamik i\u00e7erikleri hedeflemek i\u00e7in daha esnek y\u00f6ntemler sunar ve testlerin daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir elementin sadece belirli bir metin i\u00e7erdi\u011fini bilmek yeterliyken, tam metnini bilme zorunlulu\u011funu ortadan kald\u0131r\u0131r.<\/li>\n<li><strong>Mod\u00fclerlik (Modularity):<\/strong> Her bir XPathy metodu, XPath ifadesinin belirli bir par\u00e7as\u0131n\u0131 temsil eder. Bu mod\u00fcler yap\u0131, karma\u015f\u0131k se\u00e7icilerin daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alar halinde in\u015fa edilmesini sa\u011flar. Ayn\u0131 zamanda, belirli element se\u00e7ici desenlerinin yeniden kullan\u0131labilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu prensipler, XPathy'nin sadece bir ara\u00e7 olmaktan \u00f6te, test otomasyonuna daha stratejik ve verimli bir yakla\u015f\u0131m sunan bir felsefe oldu\u011funu g\u00f6sterir. Geli\u015ftiricilerin \"flaky test\" sendromundan kurtulmalar\u0131na ve ger\u00e7ekten g\u00fcvenilir test otomasyonu olu\u015fturmalar\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h2 id=\"xpathy-ile-element-bulma-nasil-yapilir-adim-adim-uygulama\">XPathy ile Element Bulma Nas\u0131l Yap\u0131l\u0131r? Ad\u0131m Ad\u0131m Uygulama<\/h2>\n<p>XPathy'nin Fluent API'\u0131n\u0131 kullanarak element bulma s\u00fcreci olduk\u00e7a sezgisel ve basittir. Geleneksel XPath'in karma\u015f\u0131kl\u0131\u011f\u0131ndan uzakla\u015farak, kodunuzu daha okunabilir ve y\u00f6netilebilir hale getirebilirsiniz. \u015eimdi, ad\u0131m ad\u0131m XPathy ile nas\u0131l element bulaca\u011f\u0131m\u0131za dair \u00f6rnekler \u00fczerinde duraca\u011f\u0131z. Bu \u00f6rneklerde, Python i\u00e7in hipotetik bir <code>xpathy<\/code> k\u00fct\u00fcphanesi kullan\u0131ld\u0131\u011f\u0131n\u0131 varsayaca\u011f\u0131z, ancak buradaki prensipler \u00e7o\u011fu dilde benzer Fluent API yakla\u015f\u0131mlar\u0131na uyarlanabilir.<\/p>\n<p>\u0130lk olarak, en basit senaryo ile ba\u015flayal\u0131m: bir etiket ad\u0131na ve i\u00e7erdi\u011fi metne g\u00f6re element bulma. Diyelim ki, sayfan\u0131zda \"Giri\u015f Yap\" metnine sahip bir d\u00fc\u011fme (<code class=\"language-html\"><button><\/code>) ar\u0131yorsunuz. Geleneksel XPath ile bu <code class=\"language-xpath\">\/\/button[contains(text(), 'Giri\u015f Yap')]<\/code> \u015feklinde yaz\u0131l\u0131rken, XPathy ile bu i\u015flemi \u00e7ok daha anla\u015f\u0131l\u0131r bir \u015fekilde yapabiliriz:<\/p>\n<pre><code class=\"language-python\">\n    from xpathy import XPathy\n\n    # \u00d6rnek 1: Sadece metin i\u00e7eren bir buton bulma\n    login_button_xpath = XPathy().button().with_text(\"Giri\u015f Yap\").to_xpath()\n    print(f\"Giri\u015f Yap butonu XPath'i: {login_button_xpath}\")\n    # \u00c7\u0131kt\u0131: Giri\u015f Yap butonu XPath'i: \/\/button[contains(text(), \"Giri\u015f Yap\")]\n  <\/pre>\n<p><\/code><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, kod sanki \u0130ngilizce c\u00fcmle gibi okunuyor: \"bir buton bul ve metni 'Giri\u015f Yap' olsun\". Bu, hem daha h\u0131zl\u0131 yazman\u0131z\u0131 hem de kodu daha kolay anlaman\u0131z\u0131 sa\u011flar. Peki ya birden fazla ko\u015fulu bir araya getirmek istersek? \u00d6rne\u011fin, hem belirli bir <code class=\"language-html\">class<\/code>'a sahip hem de belirli bir <code class=\"language-html\">id<\/code>'ye sahip bir <code class=\"language-html\"><input><\/code> alan\u0131 bulmak isteyebiliriz:<\/p>\n<pre><code class=\"language-python\">\n    # \u00d6rnek 2: Birden fazla nitelikle input alan\u0131 bulma\n    username_input_xpath = XPathy()\\\n        .input()\\\n        .with_id(\"username-field\")\\\n        .with_class(\"form-control\")\\\n        .to_xpath()\n    print(f\"Kullan\u0131c\u0131 ad\u0131 alan\u0131 XPath'i: {username_input_xpath}\")\n    # \u00c7\u0131kt\u0131: Kullan\u0131c\u0131 ad\u0131 alan\u0131 XPath'i: \/\/input[@id=\"username-field\" and contains(@class, \"form-control\")]\n  <\/pre>\n<p><\/code><\/p>\n<p>Burada <code class=\"language-python\">\\<\/code> karakteri, uzun bir kod sat\u0131r\u0131n\u0131 daha okunabilir hale getirmek i\u00e7in kullan\u0131lm\u0131\u015ft\u0131r. XPathy, metotlar\u0131 otomatik olarak <code class=\"language-xpath\">and<\/code> operat\u00f6r\u00fc ile birle\u015ftirir, bu da daha spesifik element se\u00e7icileri olu\u015fturman\u0131za olanak tan\u0131r. Diyelim ki dinamik bir <code class=\"language-html\">id<\/code>'ye sahip bir element var ve <code class=\"language-html\">id<\/code>'si \"product-\" ile ba\u015fl\u0131yor ve \"Detail\" metnini i\u00e7eren bir <code class=\"language-html\"><span><\/code> elementi. Bu durumda <code class=\"language-python\">starts_with()<\/code> ve <code class=\"language-python\">contains_text()<\/code> metotlar\u0131n\u0131 kullanabiliriz:<\/p>\n<pre><code class=\"language-python\">\n    # \u00d6rnek 3: Dinamik ID ve k\u0131smi metin ile span bulma\n    dynamic_span_xpath = XPathy()\\\n        .span()\\\n        .with_id_starts_with(\"product-\")\\\n        .contains_text(\"Detail\")\\\n        .to_xpath()\n    print(f\"Dinamik span XPath'i: {dynamic_span_xpath}\")\n    # \u00c7\u0131kt\u0131: Dinamik span XPath'i: \/\/span[starts-with(@id, \"product-\") and contains(text(), \"Detail\")]\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekler, XPathy'nin ne kadar esnek ve g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6stermektedir. Geleneksel XPath'in karma\u015f\u0131kl\u0131\u011f\u0131 olmadan, ihtiya\u00e7 duydu\u011funuz her t\u00fcrl\u00fc element se\u00e7icisini kolayca olu\u015fturabilirsiniz. \u00d6zellikle dinamik ve karma\u015f\u0131k UI'lara sahip modern web uygulamalar\u0131nda, bu t\u00fcr bir Fluent API yakla\u015f\u0131m\u0131, testlerinizin bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131racak ve \"flaky test\" oran\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azaltacakt\u0131r. Kod bloklar\u0131n\u0131n okunabilirli\u011fi, XPath ifadesinin kendisinden \u00e7ok daha y\u00fcksek oldu\u011fundan, bir sorun ya\u015fand\u0131\u011f\u0131nda hatay\u0131 tespit etmek ve d\u00fczeltmek de \u00e7ok daha kolay hale gelir.<\/p>\n<div class=\"code-example\">\n<p>Bu \u00f6rnekte, XPathy'nin zincirleme metotlar\u0131 ile nas\u0131l anla\u015f\u0131l\u0131r bir XPath ifadesi olu\u015fturdu\u011fumuzu g\u00f6r\u00fcyorsunuz. Geleneksel XPath'e g\u00f6re ne kadar daha okunakl\u0131 ve y\u00f6netilebilir oldu\u011fu ortada.<\/p>\n<\/p><\/div>\n<h3 id=\"vaka-analizi-dinamik-bir-tabloda-element-secimi\">Vaka Analizi: Dinamik Bir Tabloda Element Se\u00e7imi Nas\u0131l Kolayla\u015f\u0131r?<\/h3>\n<p>Dinamik tablolar, web otomasyon testlerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biridir. S\u0131ralama, filtreleme, sayfalama veya AJAX ile g\u00fcncellenen i\u00e7erik, elementlerin konumunu s\u00fcrekli de\u011fi\u015ftirebilir. Geleneksel XPath ile bu t\u00fcr tablolar\u0131 hedeflemek, testlerin s\u00fcrekli k\u0131r\u0131lmas\u0131na yol a\u00e7ar. Ancak XPathy'nin Fluent API'\u0131 ile bu s\u00fcre\u00e7 \u00e7ok daha sa\u011flam ve y\u00f6netilebilir hale gelir. \u015eimdi bir senaryoyu inceleyelim: Bir \u00fcr\u00fcn y\u00f6netim panelindeki dinamik bir tabloda belirli bir \u00fcr\u00fcn\u00fcn \"D\u00fczenle\" butonunu bulmak istiyoruz.<\/p>\n<p>Tablo yap\u0131s\u0131 kabaca \u015f\u00f6yle olabilir:<\/p>\n<pre><code class=\"language-html\">\n    <table id=\"product-list-table\">\n      <tbody>\n        <tr data-product-id=\"1\">\n          <td>Laptop Pro<\/td>\n          <td>Elektronik<\/td>\n          <td>1200 TL<\/td>\n          <td>\n            <button class=\"edit-btn\">D\u00fczenle<\/button>\n            <button class=\"delete-btn\">Sil<\/button>\n          <\/td>\n        <\/tr>\n        <tr data-product-id=\"2\">\n          <td>Ak\u0131ll\u0131 Telefon X<\/td>\n          <td>Elektronik<\/td>\n          <td>800 TL<\/td>\n          <td>\n            <button class=\"edit-btn\">D\u00fczenle<\/button>\n            <button class=\"delete-btn\">Sil<\/button>\n          <\/td>\n        <\/tr>\n        <!-- Di\u011fer \u00fcr\u00fcnler -->\n      <\/tbody>\n    <\/table>\n  <\/pre>\n<p><\/code><\/p>\n<p>Amac\u0131m\u0131z, \"Ak\u0131ll\u0131 Telefon X\" adl\u0131 \u00fcr\u00fcn\u00fcn sat\u0131r\u0131ndaki \"D\u00fczenle\" butonunu bulmak. Geleneksel XPath ile bu biraz zahmetli ve k\u0131r\u0131lgan olabilir. \u00d6rne\u011fin, <code class=\"language-xpath\">\/\/tr[.\/td[contains(text(), 'Ak\u0131ll\u0131 Telefon X')]]\/td\/button[contains(text(), 'D\u00fczenle')]<\/code> gibi bir ifade yazmak zorunda kal\u0131r\u0131z ki bu da okunabilirli\u011fi d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<p>XPathy ile bu i\u015flemi nas\u0131l daha zarif ve sa\u011flam bir \u015fekilde yapabiliriz, inceleyelim:<\/p>\n<pre><code class=\"language-python\">\n    from xpathy import XPathy\n\n    # 1. Ad\u0131m: Belirli bir \u00fcr\u00fcn ad\u0131na sahip sat\u0131r\u0131 bulma\n    product_name_to_find = \"Ak\u0131ll\u0131 Telefon X\"\n    row_containing_product = XPathy().tr().has_child(\n        XPathy().td().with_text(product_name_to_find)\n    )\n\n    # 2. Ad\u0131m: Bulunan sat\u0131r\u0131n i\u00e7indeki \"D\u00fczenle\" butonunu hedefleme\n    edit_button_xpath = row_containing_product.find_child(\n        XPathy().button().with_text(\"D\u00fczenle\").with_class(\"edit-btn\")\n    ).to_xpath()\n\n    print(f\"'{product_name_to_find}' \u00fcr\u00fcn\u00fcn\u00fcn D\u00fczenle butonu XPath'i: {edit_button_xpath}\")\n    # \u00c7\u0131kt\u0131: \/\/tr[.\/td[contains(text(), \"Ak\u0131ll\u0131 Telefon X\")]]\/\/button[contains(text(), \"D\u00fczenle\") and contains(@class, \"edit-btn\")]\n\n    # Farkl\u0131 bir senaryo: Sonraki sayfaya ge\u00e7i\u015f butonu\n    # Sayfalama butonlar\u0131 genellikle 'pagination-next-btn' gibi dinamik ID'lere sahip olabilir.\n    next_page_button_xpath = XPathy().button()\\\n        .with_text(\"Sonraki\")\\\n        .with_id_starts_with(\"pagination-\")\\\n        .to_xpath()\n    print(f\"Sonraki sayfa butonu XPath'i: {next_page_button_xpath}\")\n    # \u00c7\u0131kt\u0131: \/\/button[contains(text(), \"Sonraki\") and starts-with(@id, \"pagination-\")]\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizinde, XPathy'nin iki \u00f6nemli \u00f6zelli\u011fini kulland\u0131k:<\/p>\n<ol>\n<li><code class=\"language-python\">has_child()<\/code>: Bir elementin, belirli bir i\u00e7 elemente sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol etmemizi sa\u011flar. Bu, dinamik sat\u0131rlar\u0131 hedeflemek i\u00e7in \u00e7ok g\u00fc\u00e7l\u00fc bir y\u00f6ntemdir. Sat\u0131r\u0131n kendisi de\u011fi\u015fse bile, i\u00e7erdi\u011fi \"Ak\u0131ll\u0131 Telefon X\" metni sabit kald\u0131\u011f\u0131 s\u00fcrece, do\u011fru sat\u0131r\u0131 bulabiliriz.<\/li>\n<li><code class=\"language-python\">find_child()<\/code>: Belirli bir ebeveyn elementin i\u00e7inde, istedi\u011fimiz child elementi bulmam\u0131z\u0131 sa\u011flar. Bu, hiyerar\u015fik se\u00e7imi \u00e7ok daha okunabilir k\u0131lar.<\/li>\n<\/ol>\n<p>Bu yakla\u015f\u0131mla, tablonun genel yap\u0131s\u0131 de\u011fi\u015fse bile (\u00f6rne\u011fin, \"Elektronik\" kolonu ba\u015fka bir yere ta\u015f\u0131nsa veya yeni kolonlar eklense bile), testlerimiz \"Ak\u0131ll\u0131 Telefon X\" metnine ve \"D\u00fczenle\" butonuna odakland\u0131\u011f\u0131 i\u00e7in \u00e7ok daha sa\u011flam kal\u0131r. Geleneksel XPath'in aksine, XPathy ile yaz\u0131lan bu ifadeler, testlerin k\u0131r\u0131lganl\u0131\u011f\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r ve test otomasyon projelerinizin s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131r. Elementlerin g\u00f6rsel veya konumsal de\u011fi\u015fikliklerinden minimum d\u00fczeyde etkilenirken, i\u015flevsel olarak do\u011fru elementi hedeflemeye devam ederiz. Bu, dinamik web sayfalar\u0131nda g\u00fcvenilir test otomasyonu i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<h2 id=\"xpathynin-ileri-duzey-ozellikleri-ve-puf-noktalari\">XPathy'nin \u0130leri D\u00fczey \u00d6zellikleri ve P\u00fcf Noktalar\u0131 Nelerdir?<\/h2>\n<p>XPathy'nin Fluent API'\u0131, temel element se\u00e7icilerin \u00f6tesinde, daha karma\u015f\u0131k ve \u00f6zel senaryolar i\u00e7in g\u00fc\u00e7l\u00fc \u00f6zellikler sunar. Bu ileri d\u00fczey \u00f6zellikler, test otomasyon uzmanlar\u0131n\u0131n en zorlu element bulma problemlerini bile \u00e7\u00f6zmelerine yard\u0131mc\u0131 olurken, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 yine de y\u00fcksek tutar. \u015eimdi bu \u00f6zelliklerden ve baz\u0131 p\u00fcf noktalar\u0131ndan bahsedelim.<\/p>\n<h3>Mant\u0131ksal Operat\u00f6rler: AND ve OR Kullan\u0131m\u0131<\/h3>\n<p>Geleneksel XPath'te <code class=\"language-xpath\">and<\/code> ve <code class=\"language-xpath\">or<\/code> operat\u00f6rleri yayg\u0131n olarak kullan\u0131l\u0131r. XPathy de bu mant\u0131\u011f\u0131 kendi Fluent API'\u0131na entegre eder. Varsay\u0131lan olarak, zincirlenmi\u015f metotlar <code class=\"language-xpath\">and<\/code> operat\u00f6r\u00fc ile birle\u015ftirilir. Ancak, birden fazla alternatif ko\u015fulu denemek istedi\u011finizde <code class=\"language-python\">or_()<\/code> metodu devreye girer:<\/p>\n<pre><code class=\"language-python\">\n    from xpathy import XPathy\n\n    # \u00d6rnek 1: AND operat\u00f6r\u00fc (varsay\u0131lan)\n    xpath_and = XPathy().div().with_class(\"product-card\").has_attribute(\"data-id\", \"123\").to_xpath()\n    print(f\"AND ile XPath: {xpath_and}\")\n    # \u00c7\u0131kt\u0131: \/\/div[contains(@class, \"product-card\") and @data-id=\"123\"]\n\n    # \u00d6rnek 2: OR operat\u00f6r\u00fc\n    xpath_or = XPathy().button().with_text(\"Kaydet\").or_().input().with_type(\"submit\").to_xpath()\n    print(f\"OR ile XPath: {xpath_or}\")\n    # \u00c7\u0131kt\u0131: \/\/button[contains(text(), \"Kaydet\")] | \/\/input[@type=\"submit\"]\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu, \u00f6zellikle bir elementin farkl\u0131 sayfa durumlar\u0131nda farkl\u0131 niteliklere sahip olabilece\u011fi durumlarda, tek bir sa\u011flam se\u00e7ici ile birden fazla olas\u0131l\u0131\u011f\u0131 kapsaman\u0131za olanak tan\u0131r.<\/p>\n<h3>Ebeveyn ve Karde\u015f Elementlerle \u0130li\u015fkisel Se\u00e7im<\/h3>\n<p>Elementler aras\u0131ndaki hiyerar\u015fik ili\u015fkiler, web sayfalar\u0131nda \u00e7ok \u00f6nemlidir. XPathy, <code class=\"language-python\">parent()<\/code> ve <code class=\"language-python\">following_sibling()<\/code> gibi metotlarla bu ili\u015fkileri kolayca hedeflemenizi sa\u011flar:<\/p>\n<pre><code class=\"language-python\">\n    # \u00d6rnek 3: Ebeveyn elemente ula\u015fma\n    child_element_selector = XPathy().span().with_text(\"\u00dcr\u00fcn Ad\u0131\")\n    parent_element_xpath = child_element_selector.parent().div().with_class(\"product-detail\").to_xpath()\n    print(f\"Ebeveyn element XPath'i: {parent_element_xpath}\")\n    # \u00c7\u0131kt\u0131: \/\/div[contains(@class, \"product-detail\") and .\/\/span[contains(text(), \"\u00dcr\u00fcn Ad\u0131\")]]\n\n    # \u00d6rnek 4: Karde\u015f elemente ula\u015fma (\u00d6rn: bir label'dan sonraki input)\n    label_element = XPathy().label().with_text(\"\u015eifre:\")\n    password_input_xpath = label_element.following_sibling().input().with_type(\"password\").to_xpath()\n    print(f\"\u015eifre input alan\u0131 XPath'i: {password_input_xpath}\")\n    # \u00c7\u0131kt\u0131: \/\/label[contains(text(), \"\u015eifre:\")]\/following-sibling::input[@type=\"password\"]\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu ili\u015fkisel se\u00e7iciler, DOM yap\u0131s\u0131 k\u0131smen de\u011fi\u015fse bile elementleri g\u00fcvenilir bir \u015fekilde bulman\u0131za yard\u0131mc\u0131 olur, \u00e7\u00fcnk\u00fc g\u00f6receli konumlar genellikle mutlak konumlardan daha stabildir.<\/p>\n<h3>Custom XPath Ekleme<\/h3>\n<p>Baz\u0131 durumlarda, XPathy'nin sundu\u011fu metotlar mevcut ihtiyac\u0131n\u0131z\u0131 tam olarak kar\u015f\u0131lamayabilir veya \u00e7ok \u00f6zel bir XPath ifadesi yazman\u0131z gerekebilir. XPathy, bu gibi durumlar i\u00e7in esneklik sunar:<\/p>\n<pre><code class=\"language-python\">\n    # \u00d6rnek 5: Custom XPath ekleme\n    custom_xpath_part = \"[position()=last()]\" # Son elementi se\u00e7\n    last_item_xpath = XPathy().li().with_class(\"item\").append_xpath(custom_xpath_part).to_xpath()\n    print(f\"Son \u00f6\u011fe XPath'i: {last_item_xpath}\")\n    # \u00c7\u0131kt\u0131: \/\/li[contains(@class, \"item\")][position()=last()]\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6zellik, XPathy'nin Fluent API'\u0131n\u0131n g\u00fcc\u00fcnden faydalan\u0131rken, gerekti\u011finde tam kontrol\u00fc elinizde tutman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li><strong>M\u00fcmk\u00fcnse ID Kullan\u0131n:<\/strong> ID'ler genellikle en h\u0131zl\u0131 ve en sa\u011flam element se\u00e7icilerdir. E\u011fer bir elementin benzersiz bir ID'si varsa, XPathy'nin <code class=\"language-python\">with_id()<\/code> metodunu tercih edin.<\/li>\n<li><strong>Gereksiz Derinlikten Ka\u00e7\u0131n\u0131n:<\/strong> XPath ifadeleri ne kadar k\u0131sa ve hedefe y\u00f6nelik olursa, o kadar h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r. <code class=\"language-xpath\">\/\/<\/code> (herhangi bir alt d\u00fc\u011f\u00fcm) yerine <code class=\"language-xpath\">\/<\/code> (do\u011frudan alt d\u00fc\u011f\u00fcm) kullanmak performans\u0131 art\u0131rabilir. XPathy, m\u00fcmk\u00fcn oldu\u011funca optimize XPath'ler \u00fcretmeye \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><strong>S\u0131n\u0131rlay\u0131c\u0131 Kullan\u0131n:<\/strong> B\u00fcy\u00fck tablolarda veya listelerde arama yaparken, aramay\u0131 belirli bir ebeveyn elementle s\u0131n\u0131rlamak (\u00f6rne\u011fin, <code class=\"language-python\">XPathy().div().with_id(\"main-content\").find_child(XPathy().button()...)<\/code> gibi) taray\u0131c\u0131n\u0131n arama alan\u0131n\u0131 daralt\u0131r ve performans\u0131 art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu ileri d\u00fczey \u00f6zellikler ve p\u00fcf noktalar\u0131, XPathy'nin sadece yeni ba\u015flayanlar i\u00e7in de\u011fil, deneyimli otomasyon m\u00fchendisleri i\u00e7in de g\u00fc\u00e7l\u00fc bir ara\u00e7 oldu\u011funu g\u00f6stermektedir. Kodun okunabilirli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131r\u0131rken, karma\u015f\u0131k senaryolarda bile sa\u011flam ve g\u00fcvenilir element se\u00e7iciler olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<h3 id=\"mobil-uyumlu-testler-icin-xpathy-nasil-kullanilir\">Mobil Uyumlu Testler \u0130\u00e7in XPathy Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Mobil uyumlu (responsive) web tasar\u0131mlar\u0131, farkl\u0131 ekran boyutlar\u0131nda ve cihazlarda elementlerin konumunu, boyutunu ve hatta g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc de\u011fi\u015ftirebilir. Bu durum, mobil test otomasyonunda geleneksel XPath'in k\u0131r\u0131lganl\u0131\u011f\u0131n\u0131 daha da art\u0131r\u0131r. Ancak XPathy'nin sa\u011flad\u0131\u011f\u0131 esneklik ve dinamik element hedefleme yetenekleri, mobil uyumlu testler i\u00e7in de g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Mobil uyumlu testlerde kar\u015f\u0131la\u015fabilece\u011finiz senaryolar \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Farkl\u0131 Cihazlarda De\u011fi\u015fen Konumlar:<\/strong> Bir buton masa\u00fcst\u00fcnde sa\u011f \u00fcst k\u00f6\u015fede iken, mobilde sayfan\u0131n alt\u0131na ta\u015f\u0131nabilir. Mutlak XPath'ler bu durumda an\u0131nda k\u0131r\u0131l\u0131r.<\/li>\n<li><strong>Elementlerin Gizlenmesi\/G\u00f6sterilmesi:<\/strong> Masa\u00fcst\u00fcnde g\u00f6r\u00fcnen bir men\u00fc, mobil g\u00f6r\u00fcn\u00fcmde gizlenip bir hamburger men\u00fc ikonu ile tetiklenebilir.<\/li>\n<li><strong>S\u0131n\u0131flar\u0131n veya Niteliklerin De\u011fi\u015fmesi:<\/strong> CSS media query'leri, elementlere farkl\u0131 ekran boyutlar\u0131nda farkl\u0131 class'lar uygulayabilir.<\/li>\n<\/ol>\n<p>XPathy, bu t\u00fcr durumlarda daha semantik ve nitelik tabanl\u0131 se\u00e7iciler olu\u015fturarak testlerinizi daha sa\u011flam hale getirir. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><strong>Metin veya Niteliklere Odaklan\u0131n:<\/strong> Konum yerine, elementin i\u00e7erdi\u011fi metin veya benzersiz nitelikleri (<code class=\"language-html\">data-test-id<\/code>, <code class=\"language-html\">aria-label<\/code> gibi) hedefleyin. \u00d6rne\u011fin, <code class=\"language-python\">XPathy().button().with_text(\"Men\u00fc\")<\/code>, men\u00fc butonunun ekran \u00fczerindeki konumundan ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015facakt\u0131r.<\/li>\n<li><strong>G\u00f6r\u00fcn\u00fcrl\u00fck Kontrol\u00fc:<\/strong> Testlerinizde, bir elementin ger\u00e7ekten g\u00f6r\u00fcn\u00fcr olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in otomasyon k\u00fct\u00fcphanenizin (Selenium, Playwright vb.) sa\u011flad\u0131\u011f\u0131 metotlar\u0131 kullan\u0131n. XPathy, elementi bulur; g\u00f6r\u00fcn\u00fcrl\u00fck kontrol\u00fc otomasyon arac\u0131n\u0131z\u0131n i\u015fidir.<\/li>\n<li><strong>Dinamik S\u0131n\u0131flar\u0131 Y\u00f6netme:<\/strong> E\u011fer bir element mobil g\u00f6r\u00fcn\u00fcmde farkl\u0131 bir s\u0131n\u0131fa sahip oluyorsa, <code class=\"language-python\">contains_class()<\/code> veya <code class=\"language-python\">or_()<\/code> operat\u00f6r\u00fc ile birden fazla olas\u0131l\u0131\u011f\u0131 hedefleyebilirsiniz:<\/li>\n<pre><code class=\"language-python\">\n    # Mobil veya masa\u00fcst\u00fc men\u00fc butonu\n    menu_button = XPathy().button()\\\n        .with_class(\"mobile-menu-icon\")\\\n        .or_()\\\n        .button().with_id(\"desktop-menu-toggle\")\\\n        .to_xpath()\n    print(f\"Mobil\/Masa\u00fcst\u00fc Men\u00fc Butonu XPath'i: {menu_button}\")\n    # \u00c7\u0131kt\u0131: \/\/button[contains(@class, \"mobile-menu-icon\")] | \/\/button[@id=\"desktop-menu-toggle\"]\n    <\/pre>\n<p><\/code>\n  <\/ul>\n<p>Responsive tasar\u0131m, CSS Media Query'leri ile y\u00f6netilir. \u0130\u015fte tipik bir \u00f6rnek:<\/p>\n<pre><code class=\"language-css\">\n    \/* Masa\u00fcst\u00fc men\u00fcs\u00fc varsay\u0131lan olarak g\u00f6r\u00fcn\u00fcr *\/\n    .desktop-menu {\n      display: flex;\n    }\n    .mobile-menu-icon {\n      display: none; \/* Masa\u00fcst\u00fcnde gizli *\/\n    }\n\n    @media (max-width: 768px) { \/* Tablet ve alt\u0131 ekranlar i\u00e7in *\/\n      .desktop-menu {\n        display: none; \/* Masa\u00fcst\u00fc men\u00fcs\u00fc gizlenir *\/\n      }\n      .mobile-menu-icon {\n        display: block; \/* Mobil men\u00fc ikonu g\u00f6r\u00fcn\u00fcr *\/\n      }\n      .product-grid {\n        grid-template-columns: 1fr; \/* \u00dcr\u00fcnler tek s\u00fctuna d\u00fc\u015fer *\/\n      }\n    }\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu t\u00fcr durumlarda, XPathy'yi kullanarak elementin o anki g\u00f6r\u00fcn\u00fcmdeki mevcut niteliklerine g\u00f6re se\u00e7im yapabiliriz. \u00d6rne\u011fin, mobil g\u00f6r\u00fcn\u00fcmde tek s\u00fctun haline gelen bir \u00fcr\u00fcn listesindeki her bir <code class=\"language-html\"><\/p>\n<div class=\"product-item\"><\/code> elementini yine <code class=\"language-python\">XPathy().div().with_class(\"product-item\")<\/code> ile hedefleyebiliriz, \u00e7\u00fcnk\u00fc class ad\u0131 de\u011fi\u015fmiyor. Elementlerin hiyerar\u015fisi de\u011fi\u015fse bile, XPathy'nin <code class=\"language-python\">has_child()<\/code> veya <code class=\"language-python\">find_child()<\/code> gibi ili\u015fkisel metotlar\u0131, bu de\u011fi\u015fikliklere daha dayan\u0131kl\u0131 se\u00e7iciler olu\u015fturmam\u0131z\u0131 sa\u011flar. Mobil uyumlu testlerde ba\u015far\u0131l\u0131 olmak i\u00e7in, elementlerin sadece konumuna de\u011fil, ayn\u0131 zamanda i\u015flevsel rol\u00fcne ve benzersiz niteliklerine odaklanmak hayati \u00f6nem ta\u015f\u0131r. XPathy tam da bu esnekli\u011fi ve g\u00fcc\u00fc sa\u011flayarak mobil testlerinizin g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<h2 id=\"sonuc-flaky-testlere-veda-edin-ve-testlerinizi-guclendirin\">Sonu\u00e7: Flaky Testlere Veda Edin ve Testlerinizi G\u00fc\u00e7lendirin<\/h2>\n<p>Web otomasyon testleri, modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Ancak, geleneksel XPath'in inherent k\u0131r\u0131lganl\u0131\u011f\u0131 ve dinamik web sayfalar\u0131n\u0131n getirdi\u011fi zorluklar, \"flaky test\" sorununu beraberinde getirerek otomasyon yat\u0131r\u0131mlar\u0131n\u0131n verimini d\u00fc\u015f\u00fcrm\u00fc\u015ft\u00fcr. Bu makalede ele ald\u0131\u011f\u0131m\u0131z XPathy'nin Fluent API yakla\u015f\u0131m\u0131, bu kronik soruna etkili ve s\u00fcrd\u00fcr\u00fclebilir bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r. Geleneksel XPath'in okunabilirlik, bak\u0131m zorlu\u011fu ve dinamik i\u00e7erik kar\u015f\u0131s\u0131ndaki zay\u0131fl\u0131klar\u0131, test otomasyon m\u00fchendislerini y\u0131llard\u0131r yoran ba\u015fl\u0131ca problemler olmu\u015ftur.<\/p>\n<p>XPathy, bu sorunlara kar\u015f\u0131 adeta bir kalkan g\u00f6revi g\u00f6rerek, XPath ifadelerini daha sezgisel, do\u011fal dil benzeri bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Fluent API sayesinde, \"i\u00e7inde 'Kaydet' yazan bir buton bul\" gibi d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm\u00fcz \u015fekilde kod yazabiliriz. Bu sadece kodun daha kolay okunmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda bak\u0131m maliyetlerini de \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Bir UI de\u011fi\u015fikli\u011fi oldu\u011funda, t\u00fcm XPath ifadesini ba\u015ftan yazmak yerine, XPathy'nin mod\u00fcler yap\u0131s\u0131 sayesinde sadece ilgili metodu g\u00fcncellemek genellikle yeterli olur. Bu h\u0131z ve esneklik, geli\u015ftirme d\u00f6ng\u00fclerinizin daha ak\u0131c\u0131 olmas\u0131na ve testlerinizi g\u00fcncel tutma \u00e7abalar\u0131n\u0131z\u0131n azalmas\u0131na olanak tan\u0131r.<\/p>\n<p>Vaka analizlerimiz ve ileri d\u00fczey \u00f6rneklerimizle g\u00f6sterdi\u011fimiz gibi, XPathy dinamik tablolardan mobil uyumlu testlere kadar geni\u015f bir yelpazedeki zorlu senaryolarda g\u00fcvenilir element se\u00e7iciler olu\u015fturman\u0131za yard\u0131mc\u0131 olur. <code class=\"language-python\">has_child()<\/code>, <code class=\"language-python\">parent()<\/code>, <code class=\"language-python\">or_()<\/code> gibi metotlar, karma\u015f\u0131k ili\u015fkileri ve birden fazla olas\u0131l\u0131\u011f\u0131 tek bir sa\u011flam ifadeyle ele alman\u0131z\u0131 sa\u011flar. Bu, testlerinizin k\u00fc\u00e7\u00fck UI de\u011fi\u015fikliklerinden etkilenmesini minimuma indirir ve b\u00f6ylece \"flaky test\" oran\u0131n\u0131 dramatik bir \u015fekilde d\u00fc\u015f\u00fcr\u00fcr. G\u00fcvenilir testler, geli\u015ftirme ekiplerinin yaz\u0131l\u0131ma olan g\u00fcvenini art\u0131r\u0131r, h\u0131zl\u0131 geri bildirim sa\u011flar ve ger\u00e7ek hatalara odaklanmalar\u0131na olanak tan\u0131r.<\/p>\n<p>Sonu\u00e7 olarak, \"Raw XPath is Dead\" ifadesi, geleneksel yakla\u015f\u0131mlar\u0131n art\u0131k g\u00fcn\u00fcm\u00fcz\u00fcn dinamik web ortam\u0131nda yetersiz kald\u0131\u011f\u0131n\u0131 vurgulayan bir ger\u00e7e\u011fi i\u015faret ediyor. XPathy gibi Fluent API'lar ise bu yeni d\u00f6nemin gerektirdi\u011fi sa\u011flaml\u0131\u011f\u0131, okunabilirli\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi sunarak test otomasyonunun gelece\u011fini \u015fekillendiriyor. Testlerinizi g\u00fc\u00e7lendirmek, geli\u015ftirme s\u00fcre\u00e7lerinizi h\u0131zland\u0131rmak ve \"flaky test\" \u00e7ilesine son vermek istiyorsan\u0131z, XPathy'nin Fluent API yakla\u015f\u0131m\u0131n\u0131 benimsemek, atabilece\u011finiz en ak\u0131ll\u0131ca ad\u0131mlardan biridir. Bu sayede, test otomasyonu yat\u0131r\u0131mlar\u0131n\u0131z\u0131n kar\u015f\u0131l\u0131\u011f\u0131n\u0131 fazlas\u0131yla alacak ve daha kaliteli yaz\u0131l\u0131mlar ortaya koyacaks\u0131n\u0131z.<\/p>\n<h3 id=\"sikca-sorulan-sorular\">S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>XPathy sadece Python i\u00e7in mi ge\u00e7erli?<\/dt>\n<dd>Hay\u0131r, Fluent API konsepti bir\u00e7ok dilde (Java, C#, JavaScript, Ruby vb.) uygulanabilir. XPathy ad\u0131nda spesifik bir k\u00fct\u00fcphane Python i\u00e7in bu makalede \u00f6rnek olarak kullan\u0131lm\u0131\u015f olsa da, bu yakla\u015f\u0131m farkl\u0131 dillerde de benzer k\u00fct\u00fcphanelerle veya kendi implementasyonlar\u0131n\u0131zla kullan\u0131labilir. \u00d6nemli olan, Fluent API tasar\u0131m desenini benimseyen bir ara\u00e7 veya yakla\u015f\u0131md\u0131r.<\/dd>\n<dt>XPathy kullanmak performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olur mu?<\/dt>\n<dd>Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olmaz. XPathy, okunabilirli\u011fi art\u0131r\u0131rken, arka planda standart ve optimize edilmi\u015f XPath ifadeleri \u00fcretir. As\u0131l performans, \u00fcretilen XPath'in taray\u0131c\u0131 taraf\u0131ndan nas\u0131l i\u015flendi\u011fine ve elementin DOM'daki karma\u015f\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r. Genellikle iyi yaz\u0131lm\u0131\u015f XPath'ler yeterince h\u0131zl\u0131d\u0131r. XPathy'nin amac\u0131, iyi XPath'ler yazma s\u00fcrecini kolayla\u015ft\u0131rmakt\u0131r.<\/dd>\n<dt>Hangi web otomasyon ara\u00e7lar\u0131yla entegre edilebilir?<\/dt>\n<dd>XPathy, Selenium WebDriver, Playwright, Puppeteer gibi XPath destekleyen t\u00fcm pop\u00fcler web otomasyon ara\u00e7lar\u0131yla kolayca entegre edilebilir. \u00dcretti\u011fi XPath ifadesini do\u011frudan bu ara\u00e7lar\u0131n <code class=\"language-python\">find_element_by_xpath()<\/code> veya benzeri metotlar\u0131na (\u00f6rne\u011fin, Selenium'da <code class=\"language-python\">driver.find_element(By.XPATH, xpathy_expression)<\/code> \u015feklinde) ge\u00e7irebilirsiniz. Bu, XPathy'nin otomasyon ekosistemindeki esnekli\u011fini art\u0131r\u0131r.<\/dd>\n<dt>Dinamik id'ler veya class'lar i\u00e7in nas\u0131l bir \u00e7\u00f6z\u00fcm sunuyor?<\/dt>\n<dd>XPathy, dinamik ID'ler ve Class'lar gibi de\u011fi\u015fken element niteliklerini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc metotlar sunar. <code class=\"language-python\">starts_with()<\/code>, <code class=\"language-python\">contains()<\/code> gibi XPath fonksiyonlar\u0131n\u0131 temel alan <code class=\"language-python\">with_id_starts_with()<\/code>, <code class=\"language-python\">contains_text()<\/code>, <code class=\"language-python\">with_class_contains()<\/code> gibi metotlarla, elementin de\u011fi\u015fen k\u0131s\u0131mlar\u0131n\u0131 g\u00f6z ard\u0131 ederek sabit k\u0131s\u0131mlar\u0131n\u0131 hedefleyebilirsiniz. Bu sayede, elementler dinamik olarak g\u00fcncellense bile testleriniz sa\u011flaml\u0131\u011f\u0131n\u0131 korur.<\/dd>\n<dt>Karma\u015f\u0131k XPath'lerden XPathy ifadelerine ge\u00e7i\u015f zor mu?<\/dt>\n<dd>Ba\u015flang\u0131\u00e7ta baz\u0131 mevcut karma\u015f\u0131k XPath'leri d\u00f6n\u00fc\u015ft\u00fcrmek biraz \u00e7aba gerektirse de, XPathy'nin Fluent API'\u0131n\u0131n sezgisel yap\u0131s\u0131 sayesinde bu s\u00fcre\u00e7 olduk\u00e7a kolayla\u015f\u0131r. Birka\u00e7 \u00f6rnek \u00fczerinde pratik yapt\u0131ktan sonra, eski XPath'leri yeni, daha okunabilir ve sa\u011flam XPathy ifadelerine \u00e7evirmek do\u011fal bir al\u0131\u015fkanl\u0131k haline gelecektir. Ayr\u0131ca, yeni testler yazarken XPathy ile ba\u015flamak, projenizin ba\u015ftan itibaren daha s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Web otomasyon testleriniz s\u00fcrekli &#8220;flaky&#8221; mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath&#8217;in bak\u0131m\u0131 zor,&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32112","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>XPathy: Flaky Testleri Bitiren Fluent API<\/title>\n<meta name=\"description\" content=\"Web otomasyon testleriniz s\u00fcrekli &quot;flaky&quot; mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath&#039;in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy&#039;nin Fluent API&#039;\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"XPathy: Flaky Testleri Bitiren Fluent API\" \/>\n<meta property=\"og:description\" content=\"Web otomasyon testleriniz s\u00fcrekli &quot;flaky&quot; mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath&#039;in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy&#039;nin Fluent API&#039;\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T19:01:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"XPathy: Flaky Testleri Bitiren Fluent API\",\"datePublished\":\"2025-10-17T19:01:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\"},\"wordCount\":4389,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\",\"name\":\"XPathy: Flaky Testleri Bitiren Fluent API\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T19:01:50+00:00\",\"description\":\"Web otomasyon testleriniz s\u00fcrekli \\\"flaky\\\" mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath'in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy'nin Fluent API'\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"XPathy: Flaky Testleri Bitiren Fluent API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"XPathy: Flaky Testleri Bitiren Fluent API","description":"Web otomasyon testleriniz s\u00fcrekli \"flaky\" mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath'in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy'nin Fluent API'\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/","og_locale":"tr_TR","og_type":"article","og_title":"XPathy: Flaky Testleri Bitiren Fluent API","og_description":"Web otomasyon testleriniz s\u00fcrekli \"flaky\" mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath'in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy'nin Fluent API'\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T19:01:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"XPathy: Flaky Testleri Bitiren Fluent API","datePublished":"2025-10-17T19:01:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/"},"wordCount":4389,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/","url":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/","name":"XPathy: Flaky Testleri Bitiren Fluent API","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T19:01:50+00:00","description":"Web otomasyon testleriniz s\u00fcrekli \"flaky\" mi oluyor? Dinamik web sayfalar\u0131nda elementleri bulmak kabusunuz mu? Geleneksel XPath'in bak\u0131m\u0131 zor, k\u0131r\u0131lgan yap\u0131s\u0131na bir alternatif ar\u0131yorsan\u0131z, XPathy'nin Fluent API'\u0131 ile tan\u0131\u015f\u0131n. Bu makale, testlerinizi nas\u0131l daha sa\u011flam, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/xpathy-flaky-testleri-bitiren-fluent-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"XPathy: Flaky Testleri Bitiren Fluent API"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32112"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32112\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}