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 com.gargoylesoftware.htmlunit.WebClient;
019    import com.gargoylesoftware.htmlunit.html.*;
020    import org.apache.log4j.Logger;
021    import org.kuali.rice.core.api.config.property.ConfigContext;
022    
023    import java.io.File;
024    import java.io.FileOutputStream;
025    import java.io.StringReader;
026    import java.net.URL;
027    import java.util.ArrayList;
028    import java.util.Iterator;
029    import java.util.List;
030    
031    public class HtmlUnitUtil {
032        private static final Logger LOG = Logger.getLogger(HtmlUnitUtil.class);
033    
034        /**
035         * 
036         * @param url
037         * @return htmlpage without js enabled
038         * @throws Exception
039         */
040        public static HtmlPage gotoPageAndLogin(WebClient webClient, String url) throws Exception {
041            return gotoPageAndLogin(webClient, url, false);
042        }
043        
044        /**
045         * 
046         * @param url
047         * @param enableJavascript
048         * @return htmlpage with js enabled
049         * @throws Exception
050         */
051        public static HtmlPage gotoPageAndLogin(WebClient webClient, String url, boolean enableJavascript) throws Exception {
052            LOG.debug("URL: " + url);
053    
054            // this is required and needs to set to true, otherwise the values set by the onClick event won't be triggered, e.g. methodToCall
055            webClient.setJavaScriptEnabled(enableJavascript);
056            return (HtmlPage) webClient.getPage(new URL(url));
057        }
058    
059        public static boolean pageContainsText(HtmlPage page, String text) {
060            return page.asText().indexOf(text) >= 0;
061        }
062    
063            public static HtmlPage clickInputContainingText(HtmlPage page, String...values) throws Exception {
064                    page = (HtmlPage)getInputContainingText(page, values).click();
065                    return page;
066            }
067    
068        public static HtmlInput getInputContainingText(HtmlPage page, String... values) throws Exception {
069                    List<HtmlForm> forms = page.getForms();
070                    for (HtmlForm form : forms){
071                            for(HtmlElement element : form.getHtmlElementDescendants()) {
072                                    if (element instanceof HtmlInput) {
073                                            if (elementContainsValues(element, values)) {
074                                                    return (HtmlInput)element;
075                                            }
076                                    }
077                            }
078                    }
079                    return null;
080            }
081    
082    
083        public static List<HtmlInput> getInputsContainingText(HtmlPage page, String... values) throws Exception {
084                    List<HtmlInput> inputs = new ArrayList<HtmlInput>();
085                    List<HtmlForm> forms = page.getForms();
086                    for (HtmlForm form : forms){
087    
088                            for(HtmlElement element : form.getHtmlElementDescendants()) {
089                                    if (element instanceof HtmlInput) {
090                                            if (elementContainsValues(element, values)) {
091                                                    inputs.add((HtmlInput)element);
092                                            }
093                                    }
094                            }
095                    }
096                    return inputs;
097            }
098    
099            protected static boolean elementContainsValues(HtmlElement element, String... values) {
100                    for (String value : values) {
101                            if (element.toString().indexOf(value) == -1) {
102                                    return false;
103                            }
104            }
105                    return true;
106            }
107    
108            public static HtmlPage clickAnchorContainingText(HtmlPage page, String... values) throws Exception {
109                    return (HtmlPage) getAnchorContainingText(page, values).click();
110            }
111    
112            @SuppressWarnings("unchecked")
113            public static HtmlAnchor getAnchorContainingText(HtmlPage page, String... values) throws Exception {
114                    for (Iterator iterator = page.getAnchors().iterator(); iterator.hasNext();) {
115                            HtmlAnchor anchor = (HtmlAnchor) iterator.next();
116                            if (elementContainsValues(anchor, values)) {
117                                    return anchor;
118                            }
119                    }
120                    return null;
121            }
122    
123        public static String getBaseURL() {
124                return ConfigContext.getCurrentContextConfig().getProperty("application.url");
125        }
126        
127        public static String getContext() {
128            return "/" + ConfigContext.getCurrentContextConfig().getProperty("app.context.name");
129        }
130    
131        public static String getTempDir() {
132            return ConfigContext.getCurrentContextConfig().getProperty("temp.dir");
133        }
134    
135        public static Integer getPort() {
136            return new Integer(ConfigContext.getCurrentContextConfig().getProperty("kns.test.port"));
137        }
138    
139        public static void createTempFile(HtmlPage page) throws Exception {
140            createTempFile(page, null);
141        }
142    
143        public static void createTempFile(HtmlPage page, String name) throws Exception {
144            name = name == null ? "TestOutput" : name;
145            File temp = File.createTempFile(name, ".html", new File(HtmlUnitUtil.getTempDir()));
146            FileOutputStream fos = new FileOutputStream(temp);
147            String xml = page.asXml();
148            StringReader xmlReader = new StringReader(xml);
149            int i;
150            while ((i = xmlReader.read()) != -1) {
151                fos.write(i);
152            }
153            try {
154                fos.close();
155            } catch (Exception e) {
156            }
157            try {
158                xmlReader.close();
159            } catch (Exception e) {
160            }
161        }
162    
163        public static HtmlInput getInputContainingText(HtmlForm form, String text) throws Exception {
164    
165                    for (HtmlElement element : form.getHtmlElementDescendants()) {
166                            if (element instanceof HtmlInput) {
167                                    HtmlInput i = (HtmlInput) element;
168                                    if (element.toString().contains(text)) {
169                                            return i;
170                                    }
171                            }
172    
173                    }
174                    return null;
175        }
176        
177            public static HtmlForm getDefaultForm(HtmlPage htmlPage) {
178                    if (htmlPage.getForms().size() == 1) {
179                            return (HtmlForm)htmlPage.getForms().get(0);
180                    }
181                    return (HtmlForm)htmlPage.getForms().get(1);
182            }
183    
184    }