Selenium ile Test Otomasyon Süreçleri

Web sayfalarınızı test etmek için manuel olarak saatlerce uğraştığınız regresyon testlerini otomatikleştirmek istemez misiniz? Aradığınız araç tam olarak Selenium. Desteklediği geniş programlama dili yelpazesiyle Selenium’un Java, Python, C#, Ruby, JavaScript ve Kotlin dilleri için kütüphaneleri bulunuyor.
Bu blog yazısında sizlere Python üzerinden bir örnek ile, Linux tabanlı bir işletim sisteminde, testlerinizi üç farklı tarayıcıda nasıl çalıştırabileceğinizi anlatacağım.
Kurulum
Öncelikle Python dili için pip paket yöneticisini, aşağıdaki komutlarla sistemimize yüklememiz gerekiyor.[1]
$ sudo apt update $ sudo apt install python-pip
Pip kurulumunu yaptıktan sonra, Python için Selenium kütüphanelerini indiriyoruz.[2]
$ pip install selenium
Testleri Python dili ile yazmak için hazırlığımız tamamlandı. Şimdi, testimizi hangi tarayıcıda yapmak istiyorsak o tarayıcıya ait sürücünün kurulumunu yapmamız gerekli. Öne çıkan ve popüler olarak kullanılan birçok tarayıcının Selenium testlerini destekleyen, WebDriver olarak isimlendirilen sürücüleri bulunuyor. Bu adımda Chrome tarayıcısı için kurulumu anlatacağım ancak kurulum tüm tarayıcılar için aynı şekilde ilerliyor. Yazının ilerleyen kısımlarında da üç farklı tarayıcı ile testi uygulayacağız. Buradaki adresten tarayıcıların sürücülerini ve ilgili indirme linklerini bulabilirsiniz.
Linux için gerekli chromedriver dosyasını indirdikten sonra, bu dosyanın bulunduğu dizini sistem yolu değişkenine eklememiz gerekiyor.[3] Aşağıdaki komutla bu işlemi gerçekleştirebiliriz. (İndirdiğimiz sürücünün /opt/WebDriver/bin dizini altında olduğunu varsayıyorum)
$ export PATH=$PATH:/opt/WebDriver/bin >> ~/.profile
Örnek bir test
Kurulumu tamamladık, şimdi basit bir test yazalım.
Selenium otomasyon amaçlı kullanılan bir araç olsa da kendi içinde bir test aracı bulundurmuyor. Testleri daha düzenli ve kontrol edilebilir kılmak için Python içinde hali hazırda bulunan unittest modülünü kullanacağız.
Aşağıda sizin için hazırlamış olduğum testi bir inceleyelim:
#!/usr/bin/env python # -*- coding: UTF-8 -*- from selenium import webdriver import time import unittest class KartacaTest(unittest.TestCase): def setUp(self): self.browser = webdriver.Chrome() # Chrome tarayıcısını tanımlıyor self.browser.implicitly_wait(1) # Tarayıcıya yapılan her istek, hata vermeden önce 1 saniye bekleniyor def test001(self): print "\n-- Kartaca Anasayfa --" self.browser.get("https://kartaca.com") # Verilen adrese gidiyor time.sleep(1) print "Blog linkine tıklanıyor..." self.browser.find_element_by_link_text("Blog").click() # "Blog" yazan linke tıklanıyor time.sleep(1) print "Son blog içeriği açılıyor..." self.browser.find_element_by_class_name("blog-item").click() # "blog-item" sınıfına sahip ilk öğeye tıklanıyor baslik = self.browser.find_element_by_tag_name("h1").text.encode('utf8') # "h1" etiketindeki yazıyı alıyor ve utf8 biçimine çeviriyor print "Son blog yazısının başlığı: " + baslik time.sleep(1) for i in range(3, 0, -1): print "Test sonlandırılıyor... (" + str(i) + ")" # Geri sayaç time.sleep(1) def tearDown(self): print "Tarayıcı kapatılıyor..." self.browser.close() # Tarayıcı kapatılıyor if __name__ == "__main__": unittest.main()
- Öncelikle
webdriver
,time
veunittest
modüllerini ekliyoruz. - KartacaTest adında bir sınıf oluşturuyoruz. Bu sınıf, yazacağımız tüm test durumlarını içinde barındıracak.
setUp(self)
adında bir fonksiyonumuz var. Bu fonksiyon, unittest beraberinde bize sunuluyor ve içinde belirttiğimiz satırlar, yazılan her test fonksiyonunun başında çalışıyor. Biz burada Chrome tarayıcısını ve istekler için genel bir bekleme süresi tanımladık.-
test001(self)
fonksiyonu, isminden de anlaşılacağı üzere bir test durumu fonksiyonu. Yazacağınız tüm test durum fonksiyonları, test karakter dizisiyle başlamalı. Ardından yazdığınız karakterler baz alınarak, alfabetik sıraya göre çalıştırılıyor. Biz burada sırasıyla;- https://kartaca.com adresine gidiyoruz.
- “Blog” yazısına sahip linke tıklıyoruz.
- “blog-item” sınıfına (class) sahip ilk öğeye tıklıyoruz ve böylece en son paylaşılmış blog yazısını açıyoruz.
- Blog yazısının başlığını almak için “h1” etiketinde bulunan yazıyı alıyoruz ve Türkçe karakter sorununu ortadan kaldırmak amaçlı utf8 biçimine çeviriyoruz.
-
tearDown(self)
fonksiyonu da unittest beraberinde bize sunulan bir fonksiyon. İçinde belirttiğimiz satırlar, yazılan her test fonksiyonunun sonunda çalışıyor. Biz burada tarayıcıyı kapatan bir satır yazdık.
Yukarıdaki kodu kartaca-blog.py adında kaydedip python kartaca-blog.py
komutu ile çalıştırdığınızda alacağınız çıktıyı aşağıdaki videoda görebilirsiniz. Tebrikler! İlk testinizi yazmış bulunuyorsunuz.

Selenium Grid ile Çok Tarayıcılı Testler
Yukarıdaki gibi basit bir web otomasyonu yazdığınızda veya sadece tek bir tarayıcıda test uygulamanız gerektiğinde, sizin için uygun olan tarayıcıyı ve WebDriver sürücüsünü indirmeniz yeterli olacaktır. Ancak ya testlerinizi birçok tarayıcıda sırayla, hatta paralel çalıştırmanız gerekliyse? Bu kez ise aradığınız araç Selenium Grid. Bu adımda kendi bilgisayarınıza veya uzakta bulunan bir sunucunuza, Docker ve docker-compose aracılığıyla nasıl kolayca Selenium Grid ortamı kurabileceğinizi göstereceğim.
Konunun dışında olduğundan Docker kurulumundan bahsetmeyeceğim ancak bu linkte bulunan dokümantasyon ile kurulumu gerçekleştirebilirsiniz. Python için pip paket yöneticisini yüklediğimizden, docker-compose kurulumunu da aşağıdaki komut ile yapabilirsiniz.[4]
$ pip install docker-compose
Her şey tamamsa, aşağıdaki selenium-hub.yml dosyasını beraber inceleyelim.
Bu dosyanın yaptığı iş sırayla selenium-hub, node-chrome, node-firefox, node-opera docker imajlarını indirmek ve belirtilen konfigürasyona uygun olarak çalıştırmak. Üç tarayıcıyı da kurduğumuz selenium-hub konteynerine bağlıyor ve bu üç tarayıcıyı tek bir yerden çalıştıracak hale getiriyoruz. Şimdi, bu dosyayı indirdiğimiz dizinde, aşağıdaki komut ile çalıştırıyoruz.
$ docker-compose -f selenium-hub.yml up -d
Konteynerlerin başarılı bir şekilde çalıştığını gördükten sonra, http://localhost:4444/grid/console adresine gidip bir de kendiniz kontrol edebilirsiniz. Aşağıdaki gibi bir görüntü ile karşılaşmış olacaksınız.

Şimdi gelin, yazmış olduğumuz testi Selenium Grid ortamına bağlayalım. Öncelikle Python kodumuzun başına import os
satırını ekliyoruz. Sonra, setUp(self)
fonksiyonumuzun içini aşağıdaki gibi düzenliyoruz:
def setUp(self): capabilities = {'browserName': os.getenv('BROWSER', 'chrome')} # BROWSER çevre değişkenini browserName değişkenine tanımlıyor, varsayılan "chrome" self.browser = webdriver.Remote(command_executor='http://localhost:4444/wd/hub', desired_capabilities=capabilities) self.browser.implicitly_wait(1) # Tarayıcıya yapılan her istek, hata vermeden önce 1 saniye bekleniyor
Yaptığımız değişiklik sayesinde, “BROWSER” çevre değişkenine verdiğimiz tarayıcı ismine göre testi o tarayıcıda çalıştırabiliyoruz. Verilmediği taktirde varsayılan tarayıcı “chrome” olacak şekilde ayarlı. Dikkat ederseniz Selenium Grid’in çalıştığı sunucu olarak localhost adresimizi verdik. Eğer uzaktaki bir sunucuya kurulumu gerçekleştirirseniz, bu adresi de ona göre değiştirmeniz gerekli.
Kodu aşağıdaki komutlarla çalıştırdığınızda sırasıyla; “chrome”, “firefox” ve “opera” tarayıcılarında çalıştırmış ve test etmiş olacaksınız. Örnek bir çıktıyı da aşağıdaki ekran görüntüsünde görebilirsiniz.
$ export BROWSER=chrome && python kartaca-blog-eng.py $ export BROWSER=firefox && python kartaca-blog-eng.py $ export BROWSER=operablink && python kartaca-blog-eng.py

Dilerseniz bu komutları tek seferde sırayla veya paralel olarak çalıştıran bir betik yazarak, işinizi daha da kolaylaştırabilirsiniz. Sizin için şuraya ilgili bir kaynak bırakıyorum.
Sonuç
Yazımın sonuna gelmiş bulunuyorsunuz. Özetle, basit bir örnek ile sizlere Selenium kullanarak son kullanıcı gözünden testlerinizi nasıl otomatikleştirebileceğinizi ve Selenium Grid kurulumu sayesinde bu testleri birden fazla tarayıcıda nasıl test edebileceğinizi gösterdim.
Testlerinizi benim gibi Python üzerinde yazmayı isterseniz, aradığınız tüm soruların cevabını bu kaynakta bulabilirsiniz.
Bol otomasyonlu günler dilerim! 😃
Yazan: Mert Yerlikaya
Yayınlanma Tarihi: 19.10.2020
