Getting started
Download PopperFramework
- _int.jar contains vendor-independent interfaces and annotations
- _webdriver.jar contains the WebDriver implementation
Add the given jars to your WebDriver project
- Add log4j to your project
- Add cglib 3 to your project
Or just use Maven:
For projects describing PageObjects:<dependency> <groupId>org.popperfw</groupId> <artifactId>Interfaces</artifactId> <version>0.4</version> </dependency>For projects running tests:
<dependency>
<groupId>org.popperfw</groupId>
<artifactId>Core</artifactId>
<version>0.4</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${webdriver.version}</version>
</dependency>
Creating a simple page object
Defining a PageObject is done by defining an annotated interface.
@Page
public interface LoginSite {
@Locator(xpath="//input[@name='username']")
ITextBox usernameTextbox();
@Locator(xpath="//input[@name='password']")
ITextBox passwordTextbox();
@Locator(cssSelector=".submitLoginButton")
IButton submitLoginButton();
@Locator(id="register")
ILink registerLink();
}
Instantiating PageObjects
public class LoginTest {
protected IPoFactory factory;
@Before
public void setup() {
WebdriverContext context = new WebdriverContext();
context.getDefaultConfig().setBrowser(Browser.FIREFOX);
context.getDefaultConfig().setBaseUrl("http://some.location.com/");
factory = context.getFactory();
}
@Test
public void testLogin() {
LoginSite login = factory.createPage(LoginSite.class);
login.open();
login.usernameTextbox().type("Michael");
login.passwordTextbox().type("secret");
login.submitLoginButton().click();
}
}
Using parameters
@Page
public interface Indexsite {
@Locator(xpath = "//a[text()='{0}']")
ILink linkByName(String linkname);
}
Frames (since 0.3)
The content of a frame is handled as a normal PageObject. You have just to annotate the your Element with the @Frame-Annotation
@Page
public interface PageWithIframePO {
@Frame(id="iframe")
PoDescribingFrame myIframe();
}
You may even access elements inside a frame from an PageObject describing content outside that frame.
@Page(name="Page with Frames")
public interface PageWithIframePO {
@Frame(id="iframe")
@Locator(id="idLocator")
ILabel directFrameAccess();
}
Opening sites
An open-method can be declared, too. This can be used, to open the site by entering the url
@Page
public interface OpenedSitePO {
@PageAccessor(uri="/pages/open.html")
void open();
// => http://some.location.com/pages/open.html
@PageAccessor(uri="/pages/open.html?name={0}&password={1}")
void open(String name, String password);
// => http://some.location.com/pages/open.html?name=para1&password=para2
@PageAccessor(uri="/pages/open.html")
void openMapSimple(Map<String, String> parameters);
// => http://some.location.com/pages/open.html?key1=value1&key2=value2
@PageAccessor(uri="/pages/open.html?para1=val1")
void openMapWithExistingParameters(Map<String, String> parameters);
// => http://some.location.com/pages/open.html?para1=val1¶sFromMap
@PageAccessor(absoluteUri="http://google.de?q={1}")
void search(String query);
// => http://google.de?q=para1
}
Getting access to page attributes
There are some Annotaions giving you access to site information
@Page
public interface SimplePO {
@PageSource
String getHtml();
@Title
String getTitle();
}
Configure Popper
You need to tell Popper how tests should be executed, f.e. where to find the SUT, what browser to use, ...
Configure by Sourcecode
WebdriverContext context = new WebdriverContext();
context.getDefaultConfig().setBaseUrl("http://your.system.under.test.com");
context.getDefaultConfig().setBrowser(Browser.FIREFOX);
context.getDefaultConfig().setImplicitTimeout(3000);
context.getDefaultConfig().setLocale(Locale.ENGLISH);
context.getDefaultConfig().setSeleniumHost("http://your.remoteserver.com:4444");
IPoFactory factory = context.getFactory();
Configure Popper by Propertyfile
WebdriverContext context = new WebdriverContext();
context.getDefaultConfig().configureByPropertyfile("/path/to/resource/in/classpath");
IPoFactory factory = context.getFactory();
The Propertyfile looks like this
browserName=FIREFOX seleniumHost=http://your.remoteserver.com:4444 implicitTimeout=3000 browserLanguage=en_US baseUrl=http://your.system.under.test.com
