package org.apache.archiva.web.test.parent; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import com.thoughtworks.selenium.DefaultSelenium; import com.thoughtworks.selenium.Selenium; import org.apache.archiva.web.test.tools.ArchivaSeleniumExecutionRule; import org.junit.Assert; import org.junit.Rule; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import org.apache.commons.io.FileUtils; /** * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a> * */ public abstract class AbstractSeleniumTest { @Rule public ArchivaSeleniumExecutionRule archivaSeleniumExecutionRule = new ArchivaSeleniumExecutionRule(); public String browser = System.getProperty( "browser" ); public String baseUrl = "http://localhost:" + System.getProperty( "tomcat.maven.http.port" ) + "/archiva/index.html?request_lang=en"; public int maxWaitTimeInMs = Integer.getInteger( "maxWaitTimeInMs" ); public String seleniumHost = System.getProperty( "seleniumHost", "localhost" ); public int seleniumPort = Integer.getInteger( "seleniumPort", 4444 ); private Selenium selenium = null; public Properties p; /** * this method is called by the Rule before executing a test * * @throws Exception */ public void open() throws Exception { p = new Properties(); p.load( this.getClass().getClassLoader().getResourceAsStream( "test.properties" ) ); Properties tomcatPortProperties = new Properties(); tomcatPortProperties.load( new FileInputStream( new File( System.getProperty( "tomcat.propertiesPortFilePath" ) ) ) ); int tomcatPort = Integer.parseInt( tomcatPortProperties.getProperty( "tomcat.maven.http.port" ) ); baseUrl = "http://localhost:" + tomcatPort + "/archiva/index.html?request_lang=en"; open( baseUrl, browser, seleniumHost, seleniumPort, maxWaitTimeInMs ); archivaSeleniumExecutionRule.selenium = selenium; assertAdminCreated(); } /** * this method is called by the Rule after executing a tests */ public void close() { if ( getSelenium() != null ) { getSelenium().stop(); } } /** * Initialize selenium */ public void open( String baseUrl, String browser, String seleniumHost, int seleniumPort, int maxWaitTimeInMs ) throws Exception { try { if ( getSelenium() == null ) { selenium = new DefaultSelenium( seleniumHost, seleniumPort, browser, baseUrl ); selenium.start(); selenium.setTimeout( Integer.toString( maxWaitTimeInMs ) ); } } catch ( Exception e ) { // yes System.out.print( e.getMessage() ); e.printStackTrace(); } } public void assertAdminCreated() throws Exception { initializeArchiva( baseUrl, browser, maxWaitTimeInMs, seleniumHost, seleniumPort ); } public void initializeArchiva( String baseUrl, String browser, int maxWaitTimeInMs, String seleniumHost, int seleniumPort ) throws Exception { open( baseUrl, browser, seleniumHost, seleniumPort, maxWaitTimeInMs ); getSelenium().open( baseUrl ); waitPage(); // if not admin user created create one if ( isElementVisible( "create-admin-link" ) ) { Assert.assertFalse( getSelenium().isVisible( "login-link-a" ) ); Assert.assertFalse( getSelenium().isVisible( "register-link-a" ) ); // skygo need to set to true for passing is that work as expected ? clickLinkWithLocator( "create-admin-link-a", true ); assertCreateAdmin(); String fullname = getProperty( "ADMIN_FULLNAME" ); String username = getAdminUsername(); String mail = getProperty( "ADMIN_EMAIL" ); String password = getProperty( "ADMIN_PASSWORD" ); submitAdminData( fullname, mail, password ); assertUserLoggedIn( username ); clickLinkWithLocator( "logout-link-a" ); } else { Assert.assertTrue( getSelenium().isVisible( "login-link-a" ) ); Assert.assertTrue( getSelenium().isVisible( "register-link-a" ) ); login( getAdminUsername(), getAdminPassword() ); } } public Selenium getSelenium() { return selenium; } protected String getProperty( String key ) { return p.getProperty( key ); } public String getAdminUsername() { String adminUsername = getProperty( "ADMIN_USERNAME" ); return adminUsername; } public String getAdminPassword() { String adminPassword = getProperty( "ADMIN_PASSWORD" ); return adminPassword; } public void submitAdminData( String fullname, String email, String password ) { setFieldValue( "fullname", fullname ); setFieldValue( "email", email ); setFieldValue( "password", password ); setFieldValue( "confirmPassword", password ); clickButtonWithLocator( "user-create-form-register-button" ); } public void login( String username, String password ) { login( username, password, true, "Login Page" ); } public void login( String username, String password, boolean valid, String assertReturnPage ) { if ( isElementVisible( "login-link-a" ) )//isElementPresent( "loginLink" ) ) { goToLoginPage(); submitLoginPage( username, password, false, valid, assertReturnPage ); } if ( valid ) { assertUserLoggedIn( username ); } } // Go to Login Page public void goToLoginPage() { getSelenium().open( baseUrl ); waitPage(); // are we already logged in ? if ( isElementVisible( "logout-link" ) ) //isElementPresent( "logoutLink" ) ) { // so logout clickLinkWithLocator( "logout-link-a", false ); clickLinkWithLocator( "login-link-a" ); } else if ( isElementVisible( "login-link-a" ) ) { clickLinkWithLocator( "login-link-a" ); } assertLoginModal(); } public void assertLoginModal() { assertElementPresent( "user-login-form" ); Assert.assertTrue( isElementVisible( "register-link" ) ); assertElementPresent( "user-login-form-username" ); assertElementPresent( "user-login-form-password" ); assertButtonWithIdPresent( "modal-login-ok" ); } public void submitLoginPage( String username, String password ) { submitLoginPage( username, password, false, true, "Login Page" ); } public void submitLoginPage( String username, String password, boolean validUsernamePassword ) { submitLoginPage( username, password, false, validUsernamePassword, "Login Page" ); } public void submitLoginPage( String username, String password, boolean rememberMe, boolean validUsernamePassword, String assertReturnPage ) { clickLinkWithLocator( "login-link-a", false ); setFieldValue( "user-login-form-username", username ); setFieldValue( "user-login-form-password", password ); /* if ( rememberMe ) { checkField( "rememberMe" ); }*/ clickButtonWithLocator( "modal-login-ok" ); if ( validUsernamePassword ) { assertUserLoggedIn( username ); } /* else { if ( "Login Page".equals( assertReturnPage ) ) { assertLoginPage(); } else { assertPage( assertReturnPage ); } }*/ } // ******************************************************* // Auxiliar methods. This method help us and simplify test. // ******************************************************* protected void assertUserLoggedIn( String username ) { Assert.assertFalse( isElementVisible( "login-link" ) ); Assert.assertTrue( isElementVisible( "logout-link" ) ); Assert.assertFalse( isElementVisible( "register-link" ) ); Assert.assertFalse( isElementVisible( "create-admin-link" ) ); } public void assertCreateAdmin() { assertElementPresent( "user-create" ); assertFieldValue( "admin", "username" ); assertElementPresent( "fullname" ); assertElementPresent( "password" ); assertElementPresent( "confirmPassword" ); assertElementPresent( "email" ); } public void assertFieldValue( String fieldValue, String fieldName ) { assertElementPresent( fieldName ); Assert.assertEquals( fieldValue, getSelenium().getValue( fieldName ) ); } public void assertPage( String title ) { Assert.assertEquals( getTitle(), title ); } public String getTitle() { // Collapse spaces return getSelenium().getTitle().replaceAll( "[ \n\r]+", " " ); } public String getHtmlContent() { return getSelenium().getHtmlSource(); } public String getText( String locator ) { return getSelenium().getText( locator ); } public void assertTextPresent( String text ) { Assert.assertTrue( "'" + text + "' isn't present.", getSelenium().isTextPresent( text ) ); } /** * one of text args must be in the page so use en and fr text (olamy use en locale :-) ) * * @param texts */ public void assertTextPresent( String... texts ) { boolean present = false; StringBuilder sb = new StringBuilder(); for ( String text : texts ) { present = present || getSelenium().isTextPresent( text ); sb.append( " " + text + " " ); } Assert.assertTrue( "'one of the following test " + sb.toString() + "' isn't present.", present ); } public void assertTextNotPresent( String text ) { Assert.assertFalse( "'" + text + "' is present.", getSelenium().isTextPresent( text ) ); } public void assertElementPresent( String elementLocator ) { Assert.assertTrue( "'" + elementLocator + "' isn't present.", isElementPresent( elementLocator ) ); } public void assertElementNotPresent( String elementLocator ) { Assert.assertFalse( "'" + elementLocator + "' is present.", isElementPresent( elementLocator ) ); } public void assertLinkPresent( String text ) { Assert.assertTrue( "The link '" + text + "' isn't present.", isElementPresent( "link=" + text ) ); } public void assertLinkNotPresent( String text ) { Assert.assertFalse( "The link('" + text + "' is present.", isElementPresent( "link=" + text ) ); } public void assertLinkNotVisible( String text ) { Assert.assertFalse( "The link('" + text + "' is visible.", isElementVisible( "link=" + text ) ); } public void assertLinkVisible( String text ) { Assert.assertTrue( "The link('" + text + "' is not visible.", isElementVisible( "link=" + text ) ); } public void assertImgWithAlt( String alt ) { assertElementPresent( "/¯img[@alt='" + alt + "']" ); } public void assertImgWithAltAtRowCol( boolean isALink, String alt, int row, int column ) { String locator = "//tr[" + row + "]/td[" + column + "]/"; locator += isALink ? "a/" : ""; locator += "img[@alt='" + alt + "']"; assertElementPresent( locator ); } public void assertImgWithAltNotPresent( String alt ) { assertElementNotPresent( "/¯img[@alt='" + alt + "']" ); } public void assertCellValueFromTable( String expected, String tableElement, int row, int column ) { Assert.assertEquals( expected, getCellValueFromTable( tableElement, row, column ) ); } public boolean isTextPresent( String text ) { return getSelenium().isTextPresent( text ); } public boolean isLinkPresent( String text ) { return isElementPresent( "link=" + text ); } public boolean isElementPresent( String locator ) { return getSelenium().isElementPresent( locator ); } public boolean isElementVisible( String locator ) { return getSelenium().isVisible( locator ); } public void waitPage() { // TODO define a smaller maxWaitTimeJsInMs for wait javascript response for browser side validation //getSelenium().w .wait( Long.parseLong( maxWaitTimeInMs ) ); //getSelenium().waitForPageToLoad( maxWaitTimeInMs ); // http://jira.openqa.org/browse/SRC-302 // those hack looks to break some tests :-( // getSelenium().waitForCondition( "selenium.isElementPresent('document.body');", maxWaitTimeInMs ); //getSelenium().waitForCondition( "selenium.isElementPresent('footer');", maxWaitTimeInMs ); //getSelenium().waitForCondition( "selenium.browserbot.getCurrentWindow().document.getElementById('footer')", // maxWaitTimeInMs ); // so the only hack is to not use a too small wait time try { Thread.sleep( maxWaitTimeInMs ); } catch ( InterruptedException e ) { throw new RuntimeException( "issue on Thread.sleep : " + e.getMessage(), e ); } } public String getFieldValue( String fieldName ) { return getSelenium().getValue( fieldName ); } public String getCellValueFromTable( String tableElement, int row, int column ) { return getSelenium().getTable( tableElement + "." + row + "." + column ); } public void selectValue( String locator, String value ) { getSelenium().select( locator, "label=" + value ); } public void assertOptionPresent( String selectField, String[] options ) { assertElementPresent( selectField ); String[] optionsPresent = getSelenium().getSelectOptions( selectField ); List<String> expected = Arrays.asList( options ); List<String> present = Arrays.asList( optionsPresent ); Assert.assertTrue( "Options expected are not included in present options", present.containsAll( expected ) ); } public void assertSelectedValue( String value, String fieldName ) { assertElementPresent( fieldName ); String optionsPresent = getSelenium().getSelectedLabel( value ); Assert.assertEquals( optionsPresent, value ); } public void submit() { clickLinkWithXPath( "//input[@type='submit']" ); } public void assertButtonWithValuePresent( String text ) { Assert.assertTrue( "'" + text + "' button isn't present", isButtonWithValuePresent( text ) ); } public void assertButtonWithIdPresent( String id ) { Assert.assertTrue( "'Button with id =" + id + "' isn't present", isButtonWithIdPresent( id ) ); } public void assertButtonWithValueNotPresent( String text ) { Assert.assertFalse( "'" + text + "' button is present", isButtonWithValuePresent( text ) ); } public boolean isButtonWithValuePresent( String text ) { return isElementPresent( "//button[@value='" + text + "']" ) || isElementPresent( "//input[@value='" + text + "']" ); } public boolean isButtonWithIdPresent( String text ) { return isElementPresent( "//button[@id='" + text + "']" ) || isElementPresent( "//input[@id='" + text + "']" ); } public void clickButtonWithName( String text, boolean wait ) { clickLinkWithXPath( "//input[@name='" + text + "']", wait ); } public void clickButtonWithValue( String text ) { clickButtonWithValue( text, true ); } public void clickButtonWithValue( String text, boolean wait ) { assertButtonWithValuePresent( text ); if ( isElementPresent( "//button[@value='" + text + "']" ) ) { clickLinkWithXPath( "//button[@value='" + text + "']", wait ); } else { clickLinkWithXPath( "//input[@value='" + text + "']", wait ); } } public void clickSubmitWithLocator( String locator ) { clickLinkWithLocator( locator ); } public void clickSubmitWithLocator( String locator, boolean wait ) { clickLinkWithLocator( locator, wait ); } public void clickImgWithAlt( String alt ) { clickLinkWithLocator( "//img[@alt='" + alt + "']" ); } public void clickLinkWithText( String text ) { clickLinkWithText( text, true ); } public void clickLinkWithText( String text, boolean wait ) { clickLinkWithLocator( "link=" + text, wait ); } public void clickLinkWithXPath( String xpath ) { clickLinkWithXPath( xpath, true ); } public void clickLinkWithXPath( String xpath, boolean wait ) { clickLinkWithLocator( "xpath=" + xpath, wait ); } public void clickLinkWithLocator( String locator ) { clickLinkWithLocator( locator, true ); } public void clickLinkWithLocator( String locator, boolean wait ) { assertElementPresent( locator ); getSelenium().click( locator ); if ( wait ) { waitPage(); } } public void clickButtonWithLocator( String locator ) { clickButtonWithLocator( locator, true ); } public void clickButtonWithLocator( String locator, boolean wait ) { assertElementPresent( locator ); getSelenium().click( locator ); if ( wait ) { waitPage(); } } public void setFieldValues( Map<String, String> fieldMap ) { Map.Entry<String, String> entry; for ( Iterator<Entry<String, String>> entries = fieldMap.entrySet().iterator(); entries.hasNext(); ) { entry = entries.next(); getSelenium().type( entry.getKey(), entry.getValue() ); } } public void setFieldValue( String fieldName, String value ) { getSelenium().type( fieldName, value ); } public void checkField( String locator ) { getSelenium().check( locator ); } public void uncheckField( String locator ) { getSelenium().uncheck( locator ); } public boolean isChecked( String locator ) { return getSelenium().isChecked( locator ); } public void assertIsChecked( String locator ) { Assert.assertTrue( getSelenium().isChecked( locator ) ); } public void assertIsNotChecked( String locator ) { Assert.assertFalse( getSelenium().isChecked( locator ) ); } public void assertXpathCount( String locator, int expectedCount ) { int count = getSelenium().getXpathCount( locator ).intValue(); Assert.assertEquals( count, expectedCount ); } public void assertElementValue( String locator, String expectedValue ) { Assert.assertEquals( getSelenium().getValue( locator ), expectedValue ); } public String captureScreenShotOnFailure( Throwable failure, String methodName, String className ) { SimpleDateFormat sdf = new SimpleDateFormat( "yyyy.MM.dd-HH_mm_ss" ); String time = sdf.format( new Date() ); File targetPath = new File( "target", "screenshots" ); int lineNumber = 0; for ( StackTraceElement stackTrace : failure.getStackTrace() ) { if ( stackTrace.getClassName().equals( this.getClass().getName() ) ) { lineNumber = stackTrace.getLineNumber(); break; } } targetPath.mkdirs(); Selenium selenium = getSelenium(); String fileBaseName = methodName + "_" + className + ".java_" + lineNumber + "-" + time; selenium.windowMaximize(); try { // save html to have a minimum feedback if jenkins firefox not up File fileNameHTML = new File( new File( "target", "errorshtmlsnap" ) , fileBaseName + ".html" ); FileUtils.writeStringToFile( fileNameHTML, selenium.getHtmlSource() ); } catch ( IOException e ) { System.out.print( e.getMessage() ); e.printStackTrace(); } File fileName = new File( targetPath, fileBaseName + ".png" ); selenium.captureEntirePageScreenshot( fileName.getAbsolutePath(), "background=#FFFFFF" ); return fileName.getAbsolutePath(); } }