building frameworks over selenium
TRANSCRIPT
![Page 1: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/1.jpg)
5020510
![Page 2: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/2.jpg)
Building frameworks over Selenium
![Page 3: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/3.jpg)
Framework = ?Essential supporting structure of a building, vehicle or object
![Page 4: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/4.jpg)
Why yes? Why not?
![Page 5: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/5.jpg)
public static void main(String[] args) {WebDriver driver = new FirefoxDriver();driver.get("http://www.some-site.com");
System.out.println(“Opened the website!");
Thread.sleep(5);driver.quit();
}
![Page 6: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/6.jpg)
#0Record & playAnti-patternsNo design
![Page 7: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/7.jpg)
public static void main(String[] args) {
System.out.println(“Opened the website!");
Thread.sleep(5);driver.quit();
}
WebDriver driver = new FirefoxDriver();driver.get("http://www.some-site.com");Utils.openPage();
![Page 8: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/8.jpg)
#1 Kickoff stageUtility classesOne big family
![Page 9: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/9.jpg)
#1 Kickoff Stage IssuesDebugging time ~ test suite age
![Page 10: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/10.jpg)
#1 LessonsLaw of Demeter is awesome
![Page 11: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/11.jpg)
#2 – Localization challengeData providersData driven
![Page 12: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/12.jpg)
Data driven+ Control behavior from outside+ Recycle existing tests - Tests have to get a bit smarter - Data providers can be complex
![Page 13: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/13.jpg)
@DataProvider(name="SearchProvider") public Object[][] makeData(Method m){ if(m.getName().equalsIgnoreCase("testMethodA")){ return new Object[][] { { "Alpha", "Omega" }, { "A", "Z" } };
} else { return new Object[][] { { "A" }, { "B" }, { "D" } }; } }
![Page 14: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/14.jpg)
@DataProvider(name="SearchProvider") public Object[][] makeData(ITestContext c){
for (String group : c.getIncludedGroups()) {//...
} }
![Page 15: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/15.jpg)
#2 LessonsComplex stuff is made out of simple thingsHardcoded things suxData driven rulz
![Page 16: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/16.jpg)
#2 Documentation!
![Page 17: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/17.jpg)
#3 Performance TODO listReuse browser sessionsParallel tests
![Page 18: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/18.jpg)
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="Parallel wall building" parallel="tests" thread-count="2">
<test name="T 1"><!--…-->
</test><test name="T 2">
<!--…..--></test><test name="T 3">
<!--…--></test>
</suite>
![Page 19: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/19.jpg)
#3 PerformanceMulti-threaded tests
![Page 20: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/20.jpg)
@BeforeMethodpublic void setUp() throws MalformedURLException {
threadDriver = new ThreadLocal<RemoteWebDriver>();
threadDriver.set(new RemoteWebDriver(/*...*/));}
public WebDriver getDriver() {return threadDriver.get();
}
![Page 21: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/21.jpg)
#3 Performance pain pointsMultithreads and r/w global variables = no loveLogging is no longer that useful
![Page 22: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/22.jpg)
#3 Lessons learnedDesigning is not optional
![Page 23: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/23.jpg)
#4 Stability
![Page 24: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/24.jpg)
#4 Stability pain pointsFalse-positives rateDebugging $ costsLack of trust
![Page 25: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/25.jpg)
#4 Stability – baby steps improvement
1. Culture of stability2. Design patterns3. Make failures cheap
![Page 26: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/26.jpg)
Lessons learnedRefactoring is inevitableUnit testing is not optional
![Page 27: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/27.jpg)
#5 Harder, better, faster, stronger
![Page 28: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/28.jpg)
#5 Trial of firePage objects
![Page 29: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/29.jpg)
#5 Page objects
Home page
Shopping cart page
Contact form page
Page interface
![Page 30: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/30.jpg)
#5 Trial of firePage objectsSmarter data providers
![Page 31: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/31.jpg)
#5 Smart data providersData
provider
Data provider
FACTORY
Home page
Shopping cart page
Contact form page
Page interface
![Page 32: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/32.jpg)
#5 Trial of fireSmarter data providersPage objectLoadable component
![Page 33: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/33.jpg)
#5 Lessons learnedIncreased complexity must meanbetter documentation
![Page 34: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/34.jpg)
#6 Mobile challengeWrite once, run everywhere
![Page 35: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/35.jpg)
#6 Mobile challengeSupercharge page object
![Page 36: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/36.jpg)
#7 GrowCustomer requests
![Page 37: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/37.jpg)
PrinciplesThink ahead, work smarter
![Page 38: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/38.jpg)
PrinciplesData driven
![Page 39: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/39.jpg)
PrinciplesNothing is bullet proof
![Page 40: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/40.jpg)
PrinciplesTest your tests
![Page 41: Building frameworks over Selenium](https://reader035.vdocuments.net/reader035/viewer/2022062904/587c4a2e1a28abc62c8b4903/html5/thumbnails/41.jpg)
Thank you