Robot Framework ile yazılan birçok test projesi, dosya uzantısı .robot olan sıradan Selenium betiklerinden farksız. Örneğin, Python yardımcı dosyalarında `webdriver.Chrome()` ile tarayıcı başlatıp, `find_element` ve `send_keys` ile işlemler yapılıyor. Bu yaklaşım, Robot Framework'ün sunduğu okunabilir anahtar kelimeler, paylaşılan kütüphaneler ve tutarlı bekleme mekanizmaları gibi avantajları tamamen göz ardı ediyor. Eğer zaten SeleniumLibrary kullanıyorsanız, ham WebDriver API'sine ihtiyacınız yok. SeleniumLibrary, yüksek seviyeli anahtar kelimeler sunarken, Page Object Model (POM) yapısal bir düzen sağlar. Bu ikili, testleri kısa tutar ve UI değişikliklerinin etkisini sınırlar.
Ham WebDriver ile SeleniumLibrary'yi karıştırmak, büyüyen bir test paketinde ciddi sorunlara yol açar. Örneğin, `driver = webdriver.Chrome()` ile başlatılan bir sürücü, SeleniumLibrary'nin yönettiği tarayıcıdan farklı olur. Sonuçta, konum belirleyiciler (locators) yardımcı dosyalara ve test dosyalarına dağılır; beklemeler bir yerde `time.sleep(2)` iken başka yerde hiç kullanılmaz. İki paralel WebDriver yığınıyla uğraşmak, özellikle CI süreçlerinde sorun gidermeyi zorlaştırır. Bu tür bir yapı, sürdürülebilir olmaktan uzaktır.
Peki, doğru yaklaşım nasıl olmalı? SeleniumLibrary ile Page Object Model'ı birleştiren dört katmanlı bir yapı öneriyoruz: Konum Belirleyiciler (Locators), Temel Sayfa (BasePage), Sayfa Kütüphaneleri (Page Libraries) ve Robot Testleri (Robot Tests). Konum belirleyiciler, her ekran için ayrı bir modülde toplanır. Örneğin, `LoginLocators` sınıfında `USERNAME = "id:user-name"` gibi sabitler tanımlanır. Temel Sayfa sınıfı, tıklama ve metin girme gibi ortak eylemleri içerir ve bekleme işlemlerini merkezileştirir. Sayfa kütüphaneleri, belirli bir ekranın işlemlerini (örneğin, `LoginPage.login()`) içerir. Robot testleri ise yalnızca senaryoyu anlatan ince dosyalardır.
Bu yapıyı somutlaştırmak için, Sauce Demo uygulamasını hedef alan küçük bir MIT lisanslı şablon yayınladık: `rf-seleniumlibrary-pageobject-template`. Depoyu klonlayıp dört testi çalıştırarak yapıyı görebilirsiniz. Şablonun klasör yapısı şöyledir: `resources/locators/` (konum belirleyiciler), `pages/` (Python sayfa kütüphaneleri), `tests/` (robot dosyaları). Bu sayede konum belirleyiciler tek bir yerde toplanır ve değişiklikler kolayca yönetilir. Ayrıca, `BasePage` sınıfı, `wait_until_element_is_visible` gibi SeleniumLibrary yöntemlerini kullanarak tutarlı beklemeler sağlar.
Bir robot test dosyası artık şu kadar basit olabilir: `Valid Login` testi, `Login With Valid Credentials ${VALID_USER} ${VALID_PASSWORD}` ve `Inventory Should Be Visible` adımlarından oluşur. Konum belirleyici veya sürücü kurulumu yoktur. Tarayıcı açma/kapama işlemleri `Test Setup` ve `Test Teardown` ile yönetilir. SeleniumLibrary, `common.resource` dosyasında bir kez içe aktarılır ve sayfa nesneleri aynı örneği kullanır. Bu sayede, sürücü argümanları taşımak zorunda kalmazsınız.
Gelecekte Ne Bekleniyor?
Mevcut bir projeyi bu yapıya geçirmek için büyük bir yeniden yazım gerekmez. Adım adım ilerleyebilirsiniz: Önce konum belirleyicileri `resources/locators/` altına taşıyın. Ardından `BasePage` sınıfını `click` ve `enter_text` gibi temel yöntemlerle oluşturun. Giriş yapma işlemini ilk sayfa kütüphanesi olarak sarın. SeleniumLibrary'yi `common.resource` dosyasına bir kez ekleyin. Son olarak, bir `.robot` dosyasını yeniden yazın ve yardımcı dosyalardaki WebDriver import'larını kaldırın. Bu süreci ekran ekran tekrarlayarak, diğer testleri olduğu gibi bırakabilirsiniz.
Yeni projeler için Playwright veya Cypress gibi araçlar geçerli alternatifler olsa da, halihazırda Robot Framework ve SeleniumLibrary kullanan ekipler için `find_element` ve `send_keys` kullanımını Page Object Model ile değiştirmek düşük riskli ve yüksek getirili bir yükseltmedir. UI'nin her yeniden düzenlenmesinde bu yapının faydasını göreceksiniz. Daha fazla bilgi için gitoza.com/blog/robot-framework-seleniumlibrary-page-object-model adresindeki kılavuzu inceleyebilir, şablonu github.com/gitoza-io/rf-seleniumlibrary-pageobject-template adresinden klonlayabilirsiniz.
Kaynak: dev.to