org.roda.core.common.SeleniumUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.core.common.SeleniumUtils.java

Source

/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE file at the root of the source
 * tree and available online at
 *
 * https://github.com/keeps/roda
 */
package org.roda.core.common;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.Header;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.tika.io.IOUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class SeleniumUtils {
    private static WebDriver driver;
    private static String url;
    private static String driverPath; // "/path/to/chromedriver"
    private static Map<String, String> locations = new HashMap<>();
    private static final String TABLE_CLASS = "cellTableOddRow";

    private SeleniumUtils() {
        // do nothing
    }

    /**
     * 
     * @param args:
     *          the first argument is the RODA base url and the second argument is
     *          the driver path
     * @throws InterruptedException
     * @throws IOException
     */
    public static void main(String[] args) throws InterruptedException, IOException {
        if (args.length != 2) {
            System.err.println("Number of arguments not correct since it is only needed two arguments. "
                    + "The first argument is the RODA base url and the second argument is the driver path");
            commandHelp();
            System.exit(0);
        }

        url = args[0];
        driverPath = args[1];

        ChromeDriverService service = new ChromeDriverService.Builder().usingDriverExecutable(new File(driverPath))
                .usingAnyFreePort().build();
        service.start();

        driver = new RemoteWebDriver(service.getUrl(), DesiredCapabilities.chrome());
        driver.get(url);

        // welcome page
        saveHTML();

        savePublicPages();
        saveLoginPages();
        saveHelpPages();
        savePlanningPages();
        saveAdminPages();
        saveIngestPages();
        saveSearchPages();
        saveBrowsePages();

        driver.quit();
        service.stop();

        for (Entry<String, String> entry : locations.entrySet()) {
            String location = entry.getKey();
            String html = getHTMLSource(location);
            Pattern expression = Pattern.compile("<div id=\"webaxscore\".*?<span>(.*?)</span>");
            Matcher matcher = expression.matcher(html);
            if (matcher.find()) {
                System.out.println(location + " | " + locations.get(location) + " | " + matcher.group(1));
            }
        }
    }

    private static void saveBrowsePages() {
        try {
            // browse page
            WebElement searchButton = driver.findElement(By.className("browse_menu_item"));
            searchButton.click();
            saveHTML();

            // show browse page
            List<WebElement> aipList = driver.findElements(By.className(TABLE_CLASS));
            aipList.get(0).click();
            saveHTML();

            // permissions page
            List<WebElement> permissionPage = driver.findElements(By.className("btn-edit"));
            permissionPage.get(1).click();
            saveHTML();
            goBack();

            // create metadata page
            WebElement createMetadataPage = driver.findElement(By.className("fa-plus-circle"));
            createMetadataPage.click();
            saveHTML();
            goBack();

            // edit metadata page
            WebElement editMetadataPage = driver.findElement(By.className("fa-edit"));
            editMetadataPage.click();
            saveHTML();
            goBack();

            // history metadata page
            WebElement historyMetadataPage = driver.findElement(By.className("fa-history"));
            historyMetadataPage.click();
            saveHTML();
            goBack();

            // show browse representation page
            List<WebElement> representationList = driver.findElements(By.className(TABLE_CLASS));
            representationList.get(0).click();
            saveHTML();

            // show browse file page
            List<WebElement> fileList = driver.findElements(By.className(TABLE_CLASS));
            fileList.get(0).click();
            saveHTML();
            goBack();
            goBack();

            goBack();
        } catch (FileNotFoundException | UnsupportedEncodingException | InterruptedException e) {
            System.err.println("Error running Selenium on browse pages");
        }
    }

    private static void saveSearchPages() {
        try {
            // search page
            WebElement searchButton = driver.findElement(By.className("search_menu_item"));
            searchButton.click();
            saveHTML();

            // advanced search page
            WebElement loadButton = driver.findElement(By.className("fa-angle-down"));
            loadButton.click();
            saveHTML();
        } catch (FileNotFoundException | UnsupportedEncodingException | InterruptedException e) {
            System.err.println("Error running Selenium on search pages");
        }
    }

    private static void saveIngestPages() {
        try {
            // pre-ingest page
            WebElement ingestButton = driver.findElement(By.className("ingest_menu_item"));
            ingestButton.click();
            Thread.sleep(1000);
            WebElement preIngestPage = driver.findElement(By.className("ingest_pre_item"));
            preIngestPage.click();
            saveHTML();

            // transfer page
            ingestButton = driver.findElement(By.className("ingest_menu_item"));
            ingestButton.click();
            Thread.sleep(1000);
            WebElement transferPage = driver.findElement(By.className("ingest_transfer_item"));
            transferPage.click();
            saveHTML();

            // load page
            WebElement loadButton = driver.findElement(By.className("btn-upload"));
            loadButton.click();
            saveHTML();
            goBack();

            // ingest state page
            ingestButton = driver.findElement(By.className("ingest_menu_item"));
            ingestButton.click();
            Thread.sleep(1000);
            WebElement statePage = driver.findElement(By.className("ingest_list_item"));
            statePage.click();
            saveHTML();

            // apprasal page
            ingestButton = driver.findElement(By.className("ingest_menu_item"));
            ingestButton.click();
            Thread.sleep(1000);
            WebElement apprasalPage = driver.findElement(By.className("ingest_appraisal_item"));
            apprasalPage.click();
            saveHTML();
        } catch (FileNotFoundException | UnsupportedEncodingException | InterruptedException e) {
            System.err.println("Error running Selenium on ingest pages");
        }
    }

    private static void saveAdminPages() {
        try {
            // administration process
            WebElement adminButton = driver.findElement(By.className("administration_menu_item"));
            adminButton.click();
            Thread.sleep(1000);
            WebElement processPage = driver.findElement(By.className("administration_actions_item"));
            processPage.click();
            saveHTML();

            // new process page
            WebElement newProcess = driver.findElement(By.className("btn-plus"));
            newProcess.click();
            saveHTML();

            goBack();

            // administration users
            adminButton = driver.findElement(By.className("administration_menu_item"));
            adminButton.click();
            Thread.sleep(1000);
            WebElement usersPage = driver.findElement(By.className("administration_user_item"));
            usersPage.click();
            saveHTML();

            // new user page
            List<WebElement> newUser = driver.findElements(By.className("btn-plus"));
            newUser.get(1).click();
            saveHTML();
            goBack();

            // new group page
            newUser = driver.findElements(By.className("btn-plus"));
            newUser.get(2).click();
            saveHTML();
            goBack();

            // administration activity
            adminButton = driver.findElement(By.className("administration_menu_item"));
            adminButton.click();
            Thread.sleep(1000);
            WebElement activityPage = driver.findElement(By.className("administration_log_item"));
            activityPage.click();
            saveHTML();

            // administration notifications
            adminButton = driver.findElement(By.className("administration_menu_item"));
            adminButton.click();
            Thread.sleep(1000);
            WebElement notificationsPage = driver.findElement(By.className("administration_notifications_item"));
            notificationsPage.click();
            saveHTML();

            // administration statistics
            adminButton = driver.findElement(By.className("administration_menu_item"));
            adminButton.click();
            Thread.sleep(1000);
            WebElement statisticsPage = driver.findElement(By.className("administration_statistics_item"));
            statisticsPage.click();
            saveHTML();
        } catch (FileNotFoundException | UnsupportedEncodingException | InterruptedException e) {
            System.err.println("Error running Selenium on admin pages");
        }
    }

    private static void savePlanningPages() {
        try {
            // risk register page
            WebElement directoryButton = driver.findElement(By.className("planning_menu_item"));
            directoryButton.click();
            Thread.sleep(1000);
            WebElement riskPage = driver.findElement(By.className("planning_risk_item"));
            riskPage.click();
            saveHTML();

            // show risk page
            List<WebElement> tableRisks = driver.findElements(By.className(TABLE_CLASS));
            if (!tableRisks.isEmpty()) {
                tableRisks.get(0).click();
                saveHTML();

                // edit risk page
                WebElement editRisk = driver.findElement(By.className("btn-edit"));
                editRisk.click();
                saveHTML();
                goBack();

                goBack();
            }

            // new risk page
            List<WebElement> newRisk = driver.findElements(By.className("btn-plus"));
            newRisk.get(1).click();
            saveHTML();
            goBack();

            // format register page
            directoryButton = driver.findElement(By.className("planning_menu_item"));
            directoryButton.click();
            Thread.sleep(1000);
            WebElement formatPage = driver.findElement(By.className("planning_format_item"));
            formatPage.click();
            saveHTML();

            // show format page
            List<WebElement> tableFormats = driver.findElements(By.className(TABLE_CLASS));
            if (!tableFormats.isEmpty()) {
                tableFormats.get(0).click();
                saveHTML();

                // edit format page
                WebElement editFormat = driver.findElement(By.className("btn-edit"));
                editFormat.click();
                saveHTML();
                goBack();

                goBack();
            }

            // new format page
            List<WebElement> newFormat = driver.findElements(By.className("btn-plus"));
            newFormat.get(1).click();
            saveHTML();
            goBack();

            // event register page
            directoryButton = driver.findElement(By.className("planning_menu_item"));
            directoryButton.click();
            Thread.sleep(1000);
            WebElement eventPage = driver.findElement(By.className("planning_event_item"));
            eventPage.click();
            saveHTML();

            // show format page
            List<WebElement> tableEvents = driver.findElements(By.className(TABLE_CLASS));
            if (!tableEvents.isEmpty()) {
                tableEvents.get(0).click();
                saveHTML();
                goBack();
            }

            // agent register page
            directoryButton = driver.findElement(By.className("planning_menu_item"));
            directoryButton.click();
            Thread.sleep(1000);
            WebElement agentPage = driver.findElement(By.className("planning_agent_item"));
            agentPage.click();
            saveHTML();

            // show format page
            List<WebElement> tableAgents = driver.findElements(By.className(TABLE_CLASS));
            if (!tableAgents.isEmpty()) {
                tableAgents.get(0).click();
                saveHTML();
                goBack();
            }
        } catch (FileNotFoundException | UnsupportedEncodingException | InterruptedException e) {
            System.err.println("Error running Selenium on planning pages");
        }
    }

    private static void saveHelpPages() {
        try {
            // help page
            WebElement helpMenu = driver.findElement(By.className("help_menu_item"));
            helpMenu.click();
            saveHTML();

            // installing descriptive metadata formats help page
            driver.get(url + "#theme/InstallingNewDescriptiveMetadataFormats.html");
            saveHTML();
            goBack();

            // statistics help page
            driver.get(url + "#theme/HelpStatistics.html");
            saveHTML();
            goBack();

            // advanced search help page
            driver.get(url + "#theme/AdvancedSearch.html");
            saveHTML();
            goBack();

            // build help page
            driver.get(url + "#theme/BuildHelpPage.html");
            saveHTML();
            goBack();
        } catch (FileNotFoundException | UnsupportedEncodingException | InterruptedException e) {
            System.err.println("Error running Selenium on help pages");
        }
    }

    private static void saveLoginPages()
            throws FileNotFoundException, UnsupportedEncodingException, InterruptedException {
        // login page
        WebElement loginMenu = driver.findElement(By.className("user_menu_item"));
        loginMenu.click();
        saveHTML();

        // forget password page
        List<WebElement> loginLinks = driver.findElements(By.className("login-link"));
        loginLinks.get(0).click();
        saveHTML();
        goBack();

        // register page
        loginLinks = driver.findElements(By.className("login-link"));
        loginLinks.get(1).click();
        saveHTML();
        goBack();

        // welcome page after login
        WebElement loginName = driver.findElement(By.className("gwt-TextBox"));
        loginName.sendKeys("admin");
        WebElement loginPassword = driver.findElement(By.className("gwt-PasswordTextBox"));
        loginPassword.sendKeys("roda");
        WebElement loginButton = driver.findElement(By.className("login-button"));
        loginButton.click();
        saveHTML();
    }

    private static void savePublicPages()
            throws FileNotFoundException, UnsupportedEncodingException, InterruptedException {
        // publications page
        driver.get(url + "#theme/Publications.html");
        saveHTML();
        goBack();

        // community help page
        driver.get(url + "#theme/Community_help.html");
        saveHTML();
        goBack();

        // license page
        driver.get(url + "#theme/License.html");
        saveHTML();
        goBack();

        // what is roda page
        driver.get(url + "#theme/What_is_RODA.html");
        saveHTML();
        goBack();
    }

    private static void saveHTML()
            throws FileNotFoundException, InterruptedException, UnsupportedEncodingException {
        saveHTML(10000);
    }

    private static void saveHTML(int sleepTime)
            throws FileNotFoundException, InterruptedException, UnsupportedEncodingException {
        Thread.sleep(sleepTime);

        try {
            WebElement cookieButton = driver.findElement(By.className("cc_btn"));
            cookieButton.click();
        } catch (NoSuchElementException e) {
            // do nothing
        }

        sendPostRequest(driver.getPageSource());
    }

    private static void goBack() throws InterruptedException {
        driver.navigate().back();
        Thread.sleep(1000);
    }

    private static void sendPostRequest(String source) throws UnsupportedEncodingException {
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addTextBody("input", source);

        HttpPost httpPost = new HttpPost("http://www.acessibilidade.gov.pt/accessmonitor/");
        httpPost.setEntity(builder.build());

        try {
            CloseableHttpResponse response = httpClient.execute(httpPost);
            System.err.println(response);

            for (Header h : response.getAllHeaders()) {
                if ("location".equalsIgnoreCase(h.getName())) {
                    locations.put(h.getValue(), driver.getCurrentUrl());
                }
            }
        } catch (IOException e) {
            System.err.println("Error sending POST request!");
        }
    }

    private static String getHTMLSource(String link) throws IOException {
        URL url = new URL(link);
        URLConnection connection = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

        String inputLine;
        StringBuilder content = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }

        IOUtils.closeQuietly(in);
        return content.toString();
    }

    private static void commandHelp() {
        System.out.println("program <roda_url> <path_to_chrome_driver>");
    }
}