Selenium Dynamic Page Object

O Page Object klasama sam pisao ranije u postu Page Object Pattern, ovaj post ima za cilj da prikaže kako se može napraviti dinamička Page Object klasa. Zahvaljujući novinama koje je .Net 4.0 doneo sa sobom, pre svega dinamički tip, moguće je jednostavan način implementirati dinamički Page Object. Dynamic Page Object Sve što treba jeste da naša Page Object klasa nasledi DynamicObject i da napišemo override metode TryGetMember: public class DynamicPageObject : DynamicObject { private readonly IWebDriver driver; public DynamicPageObject(IWebDriver driver) { this.driver = driver; } public override bool TryGetMember(GetMemberBinder binder, out object result) { try { result = driver.FindElement(By.Id(binder.Name)); return true; } catch (NoSuchElementException) { result = null; return false; } } } Ograničenje ove Page Object klase je to što se za nalaženje elemenata koristi vrednost id atributa. Kako se u praksi najčešće koristi id atribut za nalaženje elemenata, ovo ograničenje retko kad predstavlja problem. Ovakvom implementacijom gubimo IntelliSense podršku, ali zato možemo jednu instancu Page Object klase iskorititi za sve stranice u aplikaciji. ...

2012-04-11 · 2 min · Ivan Franjic

Baseless merge

Cilj ovog članka jeste da objasni šta je baseless merge i kako sprovesti takav merge. Razlog zašto pišem baš o ovome proizliazi i toga da sam više puta bio u situaciji da mi se developeri, pa čak i oni sa više iskustva, obraćaju sa istim problemom: kako izvršiti spajanje grana koje nisu u direktnoj (roditelj-dete) vezi. Šta je zapravo baseless merge? Baseless merge je proces spajanja (merging) dva fajla (ili celih foldera) koji se nalaze na granama koje nisu u direktnoj vezi. ...

2012-03-12 · 2 min · Ivan Franjic

Skrivanje interfejsa, klasa i metoda

Sigurno ste nekom prilikom napravili biblioteku na koju ste bili ponosni, a onda totalno razočarani pretrpanim IntelliSense-om kada pokušate da je koristite. Veliki broj interfejsa, klasa ili metoda čine vašu biblioteku teškom za korišćenje. Pravilnom upotrebom modifikatora pristupa ovaj problem se može samo delimično sanirati, jer neki tipovi jednostavno moraju biti javni. Ovaj problem je naročito očigledan ako ste pravili biblioteku koja izlaže fluent API. Na svu sreću postoji jedan atribut u okviru System.ComponentModel namespace-a koji nam može u ovome pomoći. ...

2012-02-27 · 2 min · Ivan Franjic

Migracija sa Selenium RC na Selenium WebDriver

Kako je WebDriver naslednik Selenium RC-a, svakako da je bolja investicija pisati nove testove korišćenjem novog API-ja. Međutim, šta raditi sa testovima koji već postoje i koji su napisani za Selenium RC. Tvorci WebDriver-a su ovaj problem imali u vidu i zbog toga je moguće izvršiti migraciju na novi API na prilično bezbolan način. Ukoliko je Selenium Server već startovan, potrebno je dodati u test još dve linije koda: var selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com"); selenium.Start(); Eto toliko je jednostavno :) ...

2012-02-14 · 1 min · Ivan Franjic

Generic Controller

Kao nastavak na prethodni članak, ovde je opisan jedan od načina realizacije generičkog rešenja za kontrolere. Ono što je zajedničko za većinu kontrolera jeste da sadrže CRUD (Create, Read, Update, Delete) operacije. Međutim, kontroleri se oslanjaju na različite Repository implementacije i manipulišu različitim entitetima. Zbog toga je logično napraviti neku baznu klasu koja obuhvata CRUD operacija ali je ujedno i generička kako bi mogla da radi sa različitim entitetima. Ovaj članak se nadovezuje na prethodni - Generic Repository, tako da je preporučljivo prethodno pročitati i taj članak. ...

2012-01-30 · 3 min · Ivan Franjic