Otomasyon, Teknoloji

SELENIUM WEB DRIVER ve XPATH

XPath Nedir ve Nasıl Yazılır?



Selenium kullanılan otomasyonlarda elementlerin id, sınıf, isim gibi genel konum belirleyiciler ile bulunamadığı durumlarda xpath web sayfalarındaki elementleri bulmak için kullanılır.




Xpath Nedir?

Xpath kısaca xml yolu olarak tanımlanır. Web sayfalarındaki herhangi bir öğeyi bulmak için kullanılan syntax ya da dil diyebiliriz. HTML ve DOM yapısını kullanarak bir web sayfasındaki herhangi bir öğenin konumunu bulmak amacıyla kullanılır.

XPath’in temel formatı aşağıdaki ekran görüntüsünde açıklanmaktadır.



XPath yazımı için ön bilgi:

  • //: Kullanılan node’u seçmek için
  • Tagname: Belirli bir node’un etiket ismi.
  • @ : nitelik seçimi. (class, id gibi )
  • Attribute: Node’un özelliğinin ismi.
  • Value : Özelliğin değeri.



Web sayfasındaki öğeyi doğru bir şekilde bulmak için birçok konum belirleyici türleri vardır:

 

XPath KonumlandırıcılarıWeb Sayfalarındaki Farklı Öğeleri Bulma
IDÖğenin ID’sine göre bulmak için
ClassnameÖğeyi sınıf ismine göre bulmak için
NameÖğeyi öğenin adına göre bulmak için
Link textÖğeyi öğenin bağlantısının metnine göre bulmak için
XPathDinamik öğeyi bulmak için
CSS path

CSS yolu adı, sınıfı veya kimliği olmayan öğeleri de bulabilmek için.


XPath Türleri


İki farklı XPath türü vardır.

Absolute XPath ve Relative XPath




1) Absolute XPath

Öğeyi bulmanın doğrudan yoludur, ancak Absolute XPath’ın dezavantajı, öğenin yolunda herhangi bir değişiklik yapılması durumunda XPath’ın başarısız olmasıdır.

Bu aslında tavsiye edilmeyen bir yoldur. Web üzerinde F12 tuşu ile inspect mode açılır. Elements bölümüne tıklanır. Öğe bulunduktan sonra yine sağ click ile Copy – Copy XPath seçilir.

Aşağıda Absolute XPath örneğini görebilirsiniz.


Absolute xpath:

html/body/div[1]/section/div[1]/div/div/div/div[1]/div/div/div/div/div[3]/div[1]/div/h4[1]/b




Relative xpath:



Relative Xpath  için path (öğe yolu), HTML DOM yapısının ortasından başlar. Çift eğik çizgi (//) ile başlar, yani öğeyi web sayfasının herhangi bir yerinde arayabilir.

HTML DOM yapısının ortasından başlayabilirsiniz ve uzun xpath yazmanıza gerek yoktur.

Aşağıdaki ekranda gösterilen aynı öğenin göreli bir XPath ifadesi örneği verilmiştir.

Bu, Relative XPath aracılığıyla öğeyi bulmak için kullanılan yaygın biçimdir. Relative XPath’in faydası daha çok kullanılabilir olması ve daha az bakım/maliyet gerektirmesidir.


Relative xpath: //*[@class=’featured-box’]//*[text()=’Testing’]

 

 

 

 

XPath Eksenleri Nelerdir?

 

XPath eksenleri, XML belgesindeki farklı node’ları geçerli bağlam node’undan itibaren arar. XPath Eksenleri, kimliği, Sınıf Adı, Adı vb. Olmayan normal XPath yöntemiyle mümkün olmayan dinamik öğeleri bulmak için kullanılan yöntemlerdir.

 


Selenium’da XPath İle Karmaşık ve Dinamik Öğelerini Kullanma



1) Temel XPath:

XPath ifadesi aşağıda gösterildiği gibi XML belgesinden ID, Name, Classname vb. Nitelikler temelinde node veya node listesi seçer.

Xpath=//input[@name=’uid’] ​


Aşağıdaki sayfaya erişim linki :

http://demo.guru99.com/v1/​

 



Bazı temel XPath ifadeleri:


Xpath=//input[@type=’text’]

Xpath= //label[@id=’message23′]

Xpath= //input[@value=’RESET’]

Xpath=//*[@class=’barone’]

Xpath=//a[@href=’http://demo.guru99.com/’]

Xpath= //img[@src=’//cdn.guru99.com/images/home/java.png’]


2) Contains ():

Contains (), XPath ifadesinde kullanılan bir yöntemdir. Herhangi bir özelliğin değeri, örneğin oturum açma bilgileri gibi dinamik olarak değiştiğinde kullanılır.

 

Contains özelliği, aşağıdaki örnekte gösterildiği gibi, kısmi metin içeren öğeyi bulma yeteneğine sahiptir.

 

Bu örnekte, niteliğin yalnızca kısmi metin değerini kullanarak öğeyi tanımlamaya çalıştık. Aşağıdaki XPath ifadesinde, gönder düğmesi yerine kısmi değer ‘alt’ kullanılmıştır. Elemanın başarılı bir şekilde bulunduğu görülebilir.

“Tür” ün tam değeri “Submit” dir, ancak yalnızca “sub” kısmi değeri kullanılır.

Xpath=//*[contains(@type,’sub’)] 

 

‘Name’ öğesinin tam değeri ‘btnLogin’, ancak yalnızca ‘btn’ değerini kullanıyor.

Xpath=//*[contains(@name,’btn’)] 

Yukarıdaki ifadede, aşağıdaki ekran görüntüsünde gösterildiği gibi ‘name’ değerini bir nitelik olarak ve ‘btn’ değerini kısmi bir değer olarak aldık.

Ancak ‘Name’ niteliği ‘btn’ ile başladığı için 2 öğe (LOGIN & RESET) bulunuyor.

 

 

Benzer şekilde, aşağıdaki ifadede, ‘id’ değerini bir özellik olarak ve ‘message’ değerini Contains bir değer olarak aldık. Bu, ‘name’ niteliği ‘message’ ile başladığı için 2 öğe bulacaktır.

 

Xpath=//*[contains(@id,’message’)]

 

 

 

 

Aşağıdaki ifade de, bağlantının “metnini” bir öznitelik olarak ve “here” ı aşağıdaki ekran görüntüsünde gösterildiği gibi Contains bir değer olarak aldık. Bu, ‘here’ metnini görüntülediği için bağlantıyı (‘here’) bulur.

 

 

 



3) OR & AND kullanma:


OR ifadesinde, 1. Koşulun veya 2. koşulun doğru olması durumu için 2 koşul kullanılır. Herhangi bir koşulun doğru veya her iki koşulun doğru olması durumunda da geçerlidir. Öğeyi bulmak için herhangi bir koşulun doğru olması gerektiği anlamına gelir.

Aşağıdaki XPath ifadesinde, tek veya her iki koşulu da geçerli olan öğeleri tanımlar.

Xpath=//*[@type=’submit’ or @name=’btnReset’]



Aşağıdaki resimde belirtilen ‘type’ özelliğine sahip “LOGIN” öğesi ve “name” özelliğine sahip “RESET” öğesi or koşulu ile seçildi.


AND ifadesinde, iki koşul kullanılır, öğeyi bulmak için her iki koşul da doğru olmalıdır. Herhangi bir koşul yanlışsa öğe bulunamaz.

Xpath=//input[@type=’submit’ and @name=’btnLogin’]

 

Aşağıdaki ifadede ‘LOGIN’ öğesi hem ‘type’ hem de ‘name’ özniteliğine sahip.


4) Starts-with Fonksiyonu:


Starts-with fonksiyonu yenilenen veya web sayfasındaki herhangi bir işlemde öznitelik değeri değişen öğeyi bulur. Bu ifadede, niteliği dinamik olarak değişen öğeyi bulmak için özelliğin başlangıç metniyle eşleşir. Tabi ki nitelik değeri statik olan öğeyi de bulabilirsiniz.


Örneğin: Belirli bir öğenin kimliğinin dinamik olarak şu şekilde değiştiğini varsayalım:

Id=” message12″

Id=” message345″

Id=” message8769″

Gibi… ancak ilk metin (message) aynı. Bu durumda Start-with ifadesini kullanırız.

Aşağıdaki ifade de, “message” id’si ile başlayan iki öğe vardır (i.e., ‘User-ID must not be blank’ & ‘Password must not be blank’).

Aşağıdaki örnekte XPath, ID’si “message” ile başlayan öğeleri bulur.

Xpath=//label[starts-with(@id,’message’)]

5) Text():

Text() ifadesinde, metin işleviyle, tam olarak eşleşen metin öğesini aşağıda gösterildiği gibi buluruz. Bizim örneğimizde, “UserID” metnine sahip öğeyi buluyoruz.

Xpath=//td[text()=’UserID’]




6) XPath Eksen Yöntemleri:


Bu XPath eksen yöntemleri, karmaşık veya dinamik öğeleri bulmak için kullanılır.

Aşağıda bu yöntemlerden bazılarını göreceğiz.

Bu XPath eksenleri yöntemini göstermek için Guru99 banka demo sitesini kullanacağız.



a) Following:

Aşağıdaki ekranda gösterildiği gibi, geçerli node’un () [UserID giriş kutusu geçerli node’dur] belgesindeki tüm öğeleri seçer.

Xpath=//*[@type=’text’]//following::input

 

“Following” eksen password,login ve reset butonunu ile eşleşen 3 input node vardır. Belirli bir öğeye odaklanmak istiyorsanız aşağıdaki XPath yöntemini kullanabilirsiniz:

Xpath=//*[@type=’text’]//following::input[1]

 

XPath’ı [1], [2] ………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

Input ‘1’ olarak yazdığınızda aşağıdaki ekran görüntüsü ‘Password’ input elemanı olan node’u bulur.



b) Ancestor:


Ancestor ekseni, aşağıdaki ekranda gösterildiği gibi geçerli node’un tüm ata elemanlarını  (grandparent, parent, gibi) seçer.

 

Aşağıdaki ifadede, geçerli node’un (“ENTERPRISE TESTING” node’u) parent’ını buluyoruz.

Xpath=//*[text()=’Enterprise Testing’]//ancestor::div 

 

“Ancestor” ekseni kullanılarak eşleşen 13 “div” node’ u vardır. Belirli bir öğeye odaklanmak istiyorsanız, gereksiniminize göre 1, 2 sayısını değiştirdiğiniz aşağıdaki XPath’i kullanabilirsiniz:

Xpath=//*[text()=’Enterprise Testing’]//ancestor::div[1]



XPath’ı [1], [2] ………… vb. Koyarak gereksinime göre değiştirebilirsiniz.



c) Child:


Aşağıdaki ekranda gösterildiği gibi geçerli düğümün (Java) tüm alt öğelerini seçer.

Xpath=//*[@id=’java_technologies’]/child::li 

………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

“Child” ekseni kullanılarak eşleşen 71 “li” node var. Belirli bir öğeye odaklanmak istiyorsanız, aşağıdaki xpath’i kullanabilirsiniz:

Xpath=//*[@id=’java_technologies’]/child::li[1]

Xpath değerini [1], [2]

d) Preceding:

Aşağıdaki ekranda gösterildiği gibi geçerli node’dan önce gelen tüm node’lar seçilir.

Xpath=//*[@type=’submit’]//preceding::input

Xpath değerini [1], [2] ………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

 

 

e) Following-sibling:

 

Context node’un aşağıdaki Child’larının seçilmesi. Child’lar aşağıdaki ekranda gösterilen geçerli node ile aynı seviyededir. Geçerli node’dan sonra öğeyi bulur.

 

xpath=//*[@type='submit']//following-sibling::input



f) Parent:

Geçerli node’un üst öğesini aşağıdaki ekranda gösterildiği gibi seçer.

Xpath=//*[@id=’rt-feature’]//parent::div


“Parent” eksen kullanılarak eşleşen 65 “div” düğümü var. Belirli bir öğeye odaklanmak istiyorsanız, aşağıdaki XPath’i kullanabilirsiniz:

Xpath=//*[@id=’rt-feature’]//parent::div[1]

XPath’ı [1], [2] ………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

 

g) Self:

Geçerli node’u seçer veya “self”, aşağıdaki ekranda gösterildiği gibi node’un kendisini gösterdiği anlamına gelir.

“Self” ekseni kullanılarak eşleşen bir node self-element temsil ettiği için daima sadece bir node bulur.

Xpath =//*[@type=’password’]//self::input




h) Descendant:

Aşağıdaki node’da gösterildiği gibi geçerli node’ un Descendant’ını seçer.

Aşağıdaki ifadede, node altında (alt node, child node vb.) Anlamına gelen tüm öğe child’ları geçerli öğeye (‘child node , grandchild node, vb.) tanımlar.

Xpath=//*[@id=’rt-feature’]//descendant::a

 

Descendant” ekseni kullanılarak eşleşen 12 “bağlantı” node’u vardır. Belirli bir öğeye odaklanmak istiyorsanız, aşağıdaki XPath’i kullanabilirsiniz:


Xpath=//*[@id=’rt-feature’]//descendant::a[1]

 

Özet:

XPath, belirli bir öğe üzerinde işlem yapmak için, web sayfasında bir öğe bulmak için gereklidir.

İki tür XPath vardır:

Absolute XPath

Relative XPath


XPath Eksenleri, normal XPath yöntemiyle bulmanın mümkün olmadığı dinamik öğeleri bulmak için kullanılan yöntemlerdir.

 

Teşekkürler,






Kaynaklar:


https://www.guru99.com/
https://www.tutorialandexample.com/
https://www.educba.com/

Author


Baris