/**
* 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>");
}
}