001 /** 002 * Copyright 2004-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.hr.time.test; 017 018 import java.io.File; 019 import java.io.FileOutputStream; 020 import java.io.StringReader; 021 import java.net.URL; 022 import java.util.ArrayList; 023 import java.util.Iterator; 024 import java.util.List; 025 026 import org.apache.log4j.Logger; 027 import org.kuali.hr.time.web.TkLoginFilter; 028 import org.kuali.rice.core.api.config.property.ConfigContext; 029 030 import com.gargoylesoftware.htmlunit.BrowserVersion; 031 import com.gargoylesoftware.htmlunit.WebClient; 032 import com.gargoylesoftware.htmlunit.html.HtmlAnchor; 033 import com.gargoylesoftware.htmlunit.html.HtmlElement; 034 import com.gargoylesoftware.htmlunit.html.HtmlForm; 035 import com.gargoylesoftware.htmlunit.html.HtmlInput; 036 import com.gargoylesoftware.htmlunit.html.HtmlPage; 037 import org.kuali.rice.krad.util.GlobalVariables; 038 039 public class HtmlUnitUtil { 040 041 private static final Logger LOG = Logger.getLogger(HtmlUnitUtil.class); 042 043 /** 044 * 045 * @param url 046 * @return htmlpage without js enabled 047 * @throws Exception 048 */ 049 public static HtmlPage gotoPageAndLogin(String url) throws Exception { 050 return gotoPageAndLogin(url, false); 051 } 052 053 /** 054 * 055 * @param url 056 * @param enableJavascript 057 * @return htmlpage with js enabled 058 * @throws Exception 059 */ 060 public static HtmlPage gotoPageAndLogin(String url, boolean enableJavascript) throws Exception { 061 LOG.debug("URL: " + url); 062 final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_7); 063 // this is required and needs to set to true, otherwise the values set by the onClick event won't be triggered, e.g. methodToCall 064 webClient.setJavaScriptEnabled(enableJavascript); 065 webClient.setTimeout(0); 066 return (HtmlPage) webClient.getPage(new URL(url)); 067 } 068 069 public static boolean pageContainsText(HtmlPage page, String text) { 070 return page.asText().indexOf(text) >= 0; 071 } 072 073 public static HtmlPage clickInputContainingText(HtmlPage page, String...values) throws Exception { 074 page = (HtmlPage)getInputContainingText(page, values).click(); 075 return page; 076 } 077 078 public static HtmlInput getInputContainingText(HtmlPage page, String... values) throws Exception { 079 List<HtmlForm> forms = page.getForms(); 080 for (HtmlForm form : forms){ 081 for(HtmlElement element : form.getHtmlElementDescendants()) { 082 if (element instanceof HtmlInput) { 083 if (elementContainsValues(element, values)) { 084 return (HtmlInput)element; 085 } 086 } 087 } 088 } 089 return null; 090 } 091 092 093 public static List<HtmlInput> getInputsContainingText(HtmlPage page, String... values) throws Exception { 094 List<HtmlInput> inputs = new ArrayList<HtmlInput>(); 095 List<HtmlForm> forms = page.getForms(); 096 for (HtmlForm form : forms){ 097 098 for(HtmlElement element : form.getHtmlElementDescendants()) { 099 if (element instanceof HtmlInput) { 100 if (elementContainsValues(element, values)) { 101 inputs.add((HtmlInput)element); 102 } 103 } 104 } 105 } 106 return inputs; 107 } 108 109 protected static boolean elementContainsValues(HtmlElement element, String... values) { 110 for (String value : values) { 111 if (element.toString().indexOf(value) == -1) { 112 return false; 113 } 114 } 115 return true; 116 } 117 118 public static HtmlPage clickAnchorContainingText(HtmlPage page, String... values) throws Exception { 119 return (HtmlPage) getAnchorContainingText(page, values).click(); 120 } 121 122 @SuppressWarnings("unchecked") 123 public static HtmlAnchor getAnchorContainingText(HtmlPage page, String... values) throws Exception { 124 for (Iterator iterator = page.getAnchors().iterator(); iterator.hasNext();) { 125 HtmlAnchor anchor = (HtmlAnchor) iterator.next(); 126 if (elementContainsValues(anchor, values)) { 127 return anchor; 128 } 129 } 130 return null; 131 } 132 133 public static String getBaseURL() { 134 return ConfigContext.getCurrentContextConfig().getProperty("application.url"); 135 } 136 137 public static String getContext() { 138 return "/" + ConfigContext.getCurrentContextConfig().getProperty("app.context.name"); 139 } 140 141 public static String getTempDir() { 142 return ConfigContext.getCurrentContextConfig().getProperty("temp.dir"); 143 } 144 145 public static Integer getPort() { 146 return new Integer(ConfigContext.getCurrentContextConfig().getProperty("kns.test.port")); 147 } 148 149 public static void createTempFile(HtmlPage page) throws Exception { 150 createTempFile(page, null); 151 } 152 153 public static void createTempFile(HtmlPage page, String name) throws Exception { 154 name = name == null ? "TestOutput" : name; 155 File temp = File.createTempFile(name, ".html", new File(HtmlUnitUtil.getTempDir())); 156 FileOutputStream fos = new FileOutputStream(temp); 157 String xml = page.asXml(); 158 StringReader xmlReader = new StringReader(xml); 159 int i; 160 while ((i = xmlReader.read()) != -1) { 161 fos.write(i); 162 } 163 try { 164 fos.close(); 165 } catch (Exception e) { 166 } 167 try { 168 xmlReader.close(); 169 } catch (Exception e) { 170 } 171 } 172 173 public static HtmlInput getInputContainingText(HtmlForm form, String text) throws Exception { 174 175 for (HtmlElement element : form.getHtmlElementDescendants()) { 176 if (element instanceof HtmlInput) { 177 HtmlInput i = (HtmlInput) element; 178 if (element.toString().contains(text)) { 179 return i; 180 } 181 } 182 183 } 184 return null; 185 } 186 187 public static HtmlForm getDefaultForm(HtmlPage htmlPage) { 188 if (htmlPage.getForms().size() == 1) { 189 return (HtmlForm)htmlPage.getForms().get(0); 190 } 191 return (HtmlForm)htmlPage.getForms().get(1); 192 } 193 194 }