public static void main(String[] args) {
// Create a new instance of the Firefox driver
// Notice that the remainder of the code relies on the interface,
// not the implementation.
WebDriver driver = new FirefoxDriver();
// And now use this to visit Google
driver.get("http://www.google.com");
// Alternatively the same thing can be done like this
// driver.navigate().to("http://www.google.com");
// Find the text input element by its name
WebElement element = driver.findElement(By.name("q"));
// Enter something to search for
element.sendKeys("Cheese!");
// Now submit the form. WebDriver will find the form for us from the element
element.submit();
// Check the title of the page
System.out.println("Page title is: " + driver.getTitle());
// Google's search is rendered dynamically with JavaScript.
// Wait for the page to load, timeout after 10 seconds
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});
// Should see: "cheese! - Google Search"
System.out.println("Page title is: " + driver.getTitle());
//Close the browser
driver.quit();
}
selenium
Problems
spaghetti code
bad identifiers
no possibility of reuse of
identities
navigation/access logic
but: typical result
selenium
common problem:
how find existing code
selenium
solution
conventions
maps
how to get one for all?
page object pattern
use page layout of application for code structure
page object pattern
mapping
page object pattern
Pages
every logical page is an class
hierarchies are possible
fields for page elements
page object pattern
actions
methods for actions
unit testing: fine grained
fillA
clickB
getC
functional testing:
searchFor
getResultByIndex
page object pattern
Navigation
by method return types
goToLoginPage(): LoginPage
searchFor(query:String): ResultPage
page object pattern
fluent api
every method returns type for next action
page object pattern
assertions
as method of a page
self describing name
page object pattern
return values
java lamdas are limited
value objects
groovy closures
other jvm languages
page object pattern
closures
Method on page
GoogleResultsPage doSomething(Closure closure) { .
closure.call(this)
this
}