package org.jboss.arquillian.drone.webdriver.binary.handler; import java.io.IOException; import java.util.logging.Logger; import org.jboss.arquillian.drone.webdriver.binary.downloading.ExternalBinary; import org.jboss.arquillian.drone.webdriver.binary.downloading.source.ExternalBinarySource; import org.jboss.arquillian.drone.webdriver.factory.BrowserCapabilitiesList; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.openqa.selenium.remote.DesiredCapabilities; /** * A class for handling binaries for Edge */ public class EdgeDriverBinaryHandler extends AbstractBinaryHandler { private static final String EDGE_SYSTEM_DRIVER_BINARY_PROPERTY = "webdriver.edge.driver"; private static final String EDGE_DRIVER_BINARY_PROPERTY = "edgeDriverBinary"; private static final String EDGE_DRIVER_VERSION_PROPERTY = "edgeDriverVersion"; private static final String EDGE_DRIVER_URL_PROPERTY = "edgeDriverUrl"; private DesiredCapabilities capabilities; public EdgeDriverBinaryHandler(DesiredCapabilities capabilities) { this.capabilities = capabilities; } @Override protected String getBinaryProperty() { return EDGE_DRIVER_BINARY_PROPERTY; } @Override public String getSystemBinaryProperty() { return EDGE_SYSTEM_DRIVER_BINARY_PROPERTY; } @Override protected String getArquillianCacheSubdirectory() { return new BrowserCapabilitiesList.Edge().getReadableName(); } @Override protected String getDesiredVersionProperty() { return EDGE_DRIVER_VERSION_PROPERTY; } @Override protected String getUrlToDownloadProperty() { return EDGE_DRIVER_URL_PROPERTY; } @Override protected ExternalBinarySource getExternalBinarySource() { return new EdgeStorageSources(); } @Override protected DesiredCapabilities getCapabilities() { return capabilities; } private class EdgeStorageSources implements ExternalBinarySource { private static final String EDGE_WEB_DRIVERS_URL = "https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/"; private static final String DRIVERS_LIST = ".driver-downloads li"; private static final String INFO_PARAGRAPH = "p"; private static final String LINK = "a"; private static final String URL = "href"; private static final int VERSION_POSITION = 1; private static final int LATEST_DRIVER = 0; private Logger log = Logger.getLogger(EdgeStorageSources.class.toString()); @Override public ExternalBinary getLatestRelease() throws Exception { Element driver = getDriversList().get(LATEST_DRIVER); String driverVersion = getDriverVersion(driver); String webDriverUrl = getDriverUrl(driver); return new ExternalBinary(driverVersion, webDriverUrl); } @Override public ExternalBinary getReleaseForVersion(String version) throws Exception { String webDriverUrl = ""; String driverVersion = ""; Elements driversList = getDriversList(); for (int driverItemNumber = 0; driverItemNumber < driversList.size(); driverItemNumber++) { Element driver = driversList.get(driverItemNumber); driverVersion = getDriverVersion(driver); if (driverVersion.equals(version)) { webDriverUrl = getDriverUrl(driver); break; } } if (webDriverUrl.isEmpty()) { log.warning("WebDriver with specified version was not found."); } return new ExternalBinary(driverVersion, webDriverUrl); } private Elements getDriversList() throws IOException { Document edgeWebDriversPage = Jsoup.connect(EDGE_WEB_DRIVERS_URL).get(); return edgeWebDriversPage.select(DRIVERS_LIST); } private String getDriverVersion(Element driver) { return driver.select(INFO_PARAGRAPH).text().split(" ")[VERSION_POSITION]; } private String getDriverUrl(Element driver) { return driver.select(LINK).attr(URL); } } }