Go ile Tarayıcı Test Otomasyonu
Selam, bu yazı Go ile ufak bir tarayıcı otomasyonu yazmak üzerine olacak ama kullanım alanına göre siz adına scrapping de diyebilirsiniz.
Öncelikle test otomasyonu nedir? Benim yorumum ile test otomasyonu, önceden hazırlanan bir senaryonun otomasyon ile otomatize edilerek sonuçlarının raporlanması.
Detay için https://tr.wikipedia.org/wiki/Test_otomasyon
Şimdi Go ile nasıl yapacağız? Agouti adında tatlı bir framework mevcut ve bu framework tarayıcıların API’larını kullanarak yazdığımız test senaryosunu çalıştırmamızı sağlayacak.
Benim senaryom oldukça basit olacak.
Bir kelime gireceğim ve bu kelime https://sozluk.gov.tr üzerinde aratıldığında sonuç verecek mi bunu test edeceğim. Bu belki bir kabul testi senaryosundan uzak olabilir ama bu yazı için uygun :D
Sırasıyla tarayıcı bu işlem için neler yapmalı yazalım.
- https://sozluk.gov.tr adresine gitmeli.
2. https://sozluk.gov.tr adresinde bizi karşılayan input alanına bir kelime yazmalı.
3. Yazılan kelimeyi aratmak için mercek butonuna basmalı.
Başlayalım.
Benim uygulamamda Agouti ChromeDriver’ı çalıştıracak. Ayrıca Selenium’da kullanılabiliyor.
brew cask install chromedriver
Başarılı şekilde yüklediğimizden emin olmak için;
chromedriver --version
Uygulamamızı yazmaya başlayalım.
touch main.go && go mod init
Agouti paketini indirelim.
$ go get github.com/sclevine/agouti
Yukarıdaki kod driver’ı başlatacak, bir yeni sayfa yaratacak ve son olarak https://sozluk.gov.tr adresine gidecek.
Şimdi ilk görevi tamamladık. Sırada arama inputunu doldurma var, bunu nasıl yapacağız?
Agouti bir web sayfasındaki nesnelere Class, ID, CSS selector, XPath ile ulaşabiliyor. Input alanına sağ tıkladım ve “öğeyi incele ”butonuna basıp bu inputun bir ID’si olduğunu gördüm.
Inputun ID’si “tdk-srch-input”

Kodumuz en son bu sayfayı açma durumunda kalmıştı. Şimdi bu inputu bulacak fonksiyonu ekleyelim.
input := page.FindByID("tdk-srch-input")
err = input.Fill("saygı")
if err != nil {
log.Fatalf("Belirtilen sayfa adresine gidilemedi. : %s\n", err.Error())
}
Artık input alanına arama yapacağımız kelimeyi de yazdık şimdi arama butonuna tıklatmalıyız.
Arama butonu içinde butona sağ tıklayıp “öğeyi incele” dedim ve bu butonun bir ID’si olduğunu gördüm. “tdk-search-btn”
button := page.FindByID("tdk-search-btn")
err = button.Click()
if err != nil {
log.Fatalf("Butona tıklanamadı. : %s\n", err.Error())
}
Butonu ID ile bulduk ve tıklattık. Tarayıcıya dönüp bakarsak arama işleminin gerçekleştiğini görebiliriz. Şimdi son olarak bir de ufak bir test yapalım.
Eğer aranan kelime sözlükte olmasaydı ne olurdu?
Bunu denemek için sözlüğe “saygı” kelimesi ile bir arama yaptım. Aradığım sözcük sözlükte bulunduğunda şöyle bir yanıt aldım.

Sözcük sözlükte bulunduğu durumda“bulunan-gts0” ID’sine sahip div’e bulunan kelime yazılmış.
Şimdi ben bunu kullanarak arama sonucu başarılı mı yoksa başarısız mı bunu test edebilirim.
Eğer arama butonuna basıldıktan sonra HTML içerisinde “bulunan-gts0” ID’sine sahip bir nesne mevcut ve bu nesne boş değil ise test başarılı, aksi halde test başarısız.
Sadece burada küçük bir durum var. Arama butonuna basıldığında arama isteği sayfa yenilenmeden gerçekleşiyor. Yani arama butonuna bastıktan sonra bir süre programımız beklemeli arama sonucu alındıktan sonra “bulunan-gts0” ID’sine sahip olan nesneyi kontrol etmeli.
page.SetImplicitWait(1000)
Fonksiyonu ile tarayıcımın bir diğer işleme geçmeden 1 saniye beklemesini sağlıyorum.
Sonucu kontrol edip bitiriyoruz.
word, _ := page.FindByID("bulunan-gts0").Text()
if word == "" {
fmt.Println("Aranan kelime bulunamadı.")
} else {
fmt.Printf("Kelime \"%s\" bulundu, test başarılı. \n", word)
}
Uygulamamın son hali şöyle.