All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.martinschneider.justtestlah.configuration.PCloudyWebDriverBuilder Maven / Gradle / Ivy

package io.github.martinschneider.justtestlah.configuration;

import com.ssts.pcloudy.Connector;
import com.ssts.pcloudy.appium.PCloudyAppiumSession;
import com.ssts.pcloudy.dto.appium.booking.BookingDtoDevice;
import com.ssts.pcloudy.dto.device.MobileDevice;
import com.ssts.pcloudy.dto.file.PDriveFileDTO;
import com.ssts.pcloudy.exception.ConnectError;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.ios.IOSElement;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

public class PCloudyWebDriverBuilder extends LocalWebDriverBuilder implements WebDriverBuilder {

  private static final String PCLOUDY_API_URL = "https://device.pcloudy.com/api/";

  private static final Logger LOG = LoggerFactory.getLogger(PCloudyWebDriverBuilder.class);

  @Value("${pcloudy.email}")
  private String email;

  @Value("${pcloudy.apikey}")
  private String apiKey;

  @Value("${pcloudy.duration}")
  private Integer duration;

  /*
   * (non-Javadoc)
   *
   * @see io.github.martinschneider.justtestlah.configuration.WebDriverBuilder# getAndroidDriver()
   */
  @Override
  public WebDriver getAndroidDriver() {
    PCloudyAppiumSession pCloudySession;
    try {
      pCloudySession = getPCloudySession();
    } catch (IOException | ConnectError | InterruptedException exception) {
      LOG.error("Error creating pCloudy session!", exception);
      return null;
    }
    return new AndroidDriver(buildPCloudyUrl(pCloudySession),
        addPCloudyCapabilities(addAndroidCapabilities(new DesiredCapabilities()),
            pCloudySession.getDto()));
  }

  /*
   * (non-Javadoc)
   *
   * @see io.github.martinschneider.justtestlah.configuration.WebDriverBuilder#getIOSDriver()
   */
  @Override
  public WebDriver getIOsDriver() {
    PCloudyAppiumSession pCloudySession;
    try {
      pCloudySession = getPCloudySession();
    } catch (IOException | ConnectError | InterruptedException exception) {
      LOG.error("Error creating pCloudy session!", exception);
      return null;
    }
    return new IOSDriver(buildPCloudyUrl(pCloudySession), addPCloudyCapabilities(
        addIOsCapabilities(new DesiredCapabilities()), pCloudySession.getDto()));
  }

  private Capabilities addPCloudyCapabilities(DesiredCapabilities capabilities,
      BookingDtoDevice device) {
    capabilities.setCapability("deviceName", device.capabilities.deviceName);
    capabilities.setCapability("browserName", device.capabilities.browserName);
    capabilities.setCapability("platformName", device.capabilities.platformName);
    capabilities.setCapability("app", "");
    return capabilities;
  }

  private URL buildPCloudyUrl(PCloudyAppiumSession pCloudySession) {
    try {
      return pCloudySession.getConnector().AppiumApis()
          .getAppiumEndpoint(pCloudySession.getAuthToken());
    } catch (IOException | ConnectError | InterruptedException exception) {
      LOG.error("Error building pCloudy Appium URL!", exception);
      return null;
    }
  }

  private PCloudyAppiumSession getPCloudySession()
      throws IOException, ConnectError, InterruptedException {
    Connector con = new Connector(PCLOUDY_API_URL);
    String authToken = con.authenticateUser(email, apiKey);
    File fileToBeUploaded = new File(appPath);
    PDriveFileDTO alreadyUploadedApp =
        con.getAvailableAppIfUploaded(authToken, fileToBeUploaded.getName());
    if (alreadyUploadedApp == null) {
      LOG.info("Uploading App: {} ", fileToBeUploaded.getAbsolutePath());
      PDriveFileDTO uploadedApp = con.uploadApp(authToken, fileToBeUploaded, false);
      LOG.info("App uploaded");
      alreadyUploadedApp = new PDriveFileDTO();
      alreadyUploadedApp.file = uploadedApp.file;
    } else {
      LOG.info("App already present. Not uploading... ");
    }
    ArrayList selectedDevices = new ArrayList();
    for (MobileDevice device : con.getDevices(authToken, 10, platform, true)) {
      if (device.display_name.contains(deviceName)) {
        selectedDevices.add(device);
        break;
      }
    }
    if (selectedDevices.size() == 0) {
      LOG.error("No device of type {} available for testing", deviceName);
      return null;
    }
    LOG.info("Booking device {} for {} minutes", selectedDevices.get(0).display_name, duration);
    String sessionName = "Appium Session " + new Date();
    BookingDtoDevice bookedDevice =
        con.AppiumApis().bookDevicesForAppium(authToken, selectedDevices, duration, sessionName)[0];
    LOG.info("Booking successful. Session name: {}", sessionName);
    con.AppiumApis().initAppiumHubForApp(authToken, alreadyUploadedApp);
    return new PCloudyAppiumSession(con, authToken, bookedDevice);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy