package base;
import com.saucelabs.common.SauceOnDemandAuthentication;
import com.saucelabs.common.SauceOnDemandSessionIdProvider;
import com.saucelabs.junit.SauceOnDemandTestWatcher;
import com.saucelabs.saucerest.SauceREST;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.nativekey.AndroidKey;
import io.appium.java_client.ios.IOSDriver;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TestName;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.support.ui.WebDriverWait;
import view_objects.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import static base.PlatformType.*;
import static base.ServerType.*;
import static java.lang.String.format;
import static java.lang.System.getProperty;
import static java.lang.System.getenv;
import static java.lang.Thread.sleep;
import static org.junit.Assert.assertTrue;
import static org.openqa.selenium.support.ui.ExpectedConditions.*;
import static test_utils.TestConstants.*;
public abstract class BasePreconditions implements SauceOnDemandSessionIdProvider {
@Rule
public TestName testName = new TestName();
//SAUCELABS
private static final String username = getenv("SAUCE_USERNAME");
private static final String accessKey = getenv("SAUCE_ACCESS_KEY");
private static final String sauceServer = "@ondemand.eu-central-1.saucelabs.com:443/wd/hub"; //EU Central 1
private final SauceREST sauceAPI = new SauceREST(username, accessKey);
private final SauceOnDemandAuthentication auth = new SauceOnDemandAuthentication(username, accessKey);
protected AppiumDriver driver;
protected PlatformType platform;
protected ServerType server;
private String sessionId;
protected String baseAppiumUrl = "http://localhost:";
protected String phoneNumber;
protected String code;
protected AndroidKey codeDigit1;
protected AndroidKey codeDigit2;
protected AndroidKey codeDigit3;
protected AndroidKey codeDigit4;
private WebDriverWait wait;
protected MainView mainView;
protected LoginViews loginViews;
protected OrdersView ordersView;
protected OrderGuideView orderGuideView;
protected OrderGuideSearchView orderGuideSearchView;
protected DeliveryDateView deliveryDateView;
protected ReviewYourOrderView reviewYourOrderView;
protected ForgetAnythingView forgetAnythingView;
protected OrderSentView orderSentView;
protected DoubleCheckDeliveryDateView doubleCheckDeliveryDateView;
protected UploadOptionsView uploadOptionsView;
protected UploadImagesView uploadImagesView;
protected AddImageView addImageView;
protected AddProductDetailsView addProductDetailsView;
protected EditProductView editProductView;
protected ChatView chatView;
protected ChatSettingsView chatSettingsView;
protected ContactsView contactsView;
protected InviteContactView inviteContactView;
protected SelectChatsView selectChatsView;
protected NewMemberInvitedView newMemberInvitedView;
protected UserRemovedFromChatView userRemovedFromChatView;
protected UserRemovedFromLocationView userRemovedFromLocationView;
protected NewStableBuildAvailableView newStableBuildAvailableView;
protected ProductDetailsView productDetailsView;
protected ProductsCatalogueView productsCatalogueView;
protected UnitModalView unitModalView;
protected ProductAddedView productAddedView;
protected MarketView marketView;
protected SpecialityView specialityView;
protected PickLocationView pickLocationView;
protected SupplierChatView supplierChatView;
protected SupplierCardView supplierCardView;
protected CatalogueItemsView catalogueItemsView;
protected ReviewProductsView reviewProductsView;
protected AllSuppliersView allSuppliersView;
protected EnterSupplierDetailsView enterSupplierDetailsView;
protected AddContactNumberView addContactNumberView;
protected YouCanStartOrderingNowView youCanStartOrderingNowView;
protected AndroidSelectPhotoView androidSelectPhotoView;
protected SomethingWentWrongView somethingWentWrongView;
protected CodeEntryView codeEntryView;
protected SettingsView settingsView;
protected NotificationSettingsView notificationSettingsView;
protected IOSPhotosGalleryView iosPhotosGalleryView;
protected OrderView orderView;
protected ReportIssueToSupplierView reportIssueToSupplierView;
protected ProductIssueView productIssueView;
protected IssueDetailsView issueDetailsView;
protected IssuesReportedToSupplierView issuesReportedToSupplierView;
protected ReportedIssuesView reportedIssuesView;
protected ReportedProductView reportedProductView;
protected SelectFileView selectFileView;
protected AddInvoiceView addInvoiceView;
protected AddToOrderView addToOrderView;
protected AddOrEditInvoiceDetailsView addOrEditInvoiceDetailsView;
protected YourInvoiceWasAddedView yourInvoiceWasAddedView;
protected UploadInvoiceView uploadInvoiceView;
protected OpenedChatImagesView openedChatImagesView;
protected LongPressOpenedChatImageView longPressOpenedChatImageView;
protected AndroidShareView androidShareView;
protected RecommendedProductsView recommendedProductsView;
protected InvoiceLayoutView invoiceLayoutView;
protected InvoiceForwardDownloadOptionsView invoiceForwardDownloadOptionsView;
protected ManageLocationView manageLocationView;
protected ManageTeamView manageTeamView;
protected EnterRepDetailsView enterRepDetailsView;
protected OrderForwardingView orderForwardingView;
protected TrackOrdersView trackOrdersView;
protected ProSupplierView proSupplierView;
protected PaymentMethodView paymentMethodView;
protected BillingAddressView billingAddressView;
protected UserAgreementView userAgreementView;
protected PaymentMethodsView paymentMethodsView;
protected PickPaymentMethodView pickPaymentMethodView;
protected RekkiSupportChatView rekkiSupportChatView;
protected ImageUploadView imageUploadView;
protected PaymentMethodsSettingsView paymentMethodsSettingsView;
protected RateSuppliersServiceView rateSuppliersServiceView;
protected SauceCameraAllowAccessView sauceCameraAllowAccessView;
@Override
public String getSessionId() {
return sessionId;
}
@Rule
public SauceOnDemandTestWatcher watcher = new SauceOnDemandTestWatcher(this, auth);
@Rule
public TestName name = new TestName() {
public String getMethodName() {
return format("%s", super.getMethodName());
}
};
public BasePreconditions() {
setPlatformType();
setServerType();
}
private void setPlatformType() {
String cliArg = getProperty("platformType");
if (cliArg == null) {
// default to ios if no one set the platform type
cliArg = "ios";
}
if (cliArg.equalsIgnoreCase(ANDROID.name())) {
platform = ANDROID;
} else if (cliArg.equalsIgnoreCase(ANDROID_DEMO.name())) {
platform = ANDROID_DEMO;
} else if (cliArg.equalsIgnoreCase(ANDROID_DEMO_LOCAL_APK.name())) {
platform = ANDROID_DEMO_LOCAL_APK;
} else if (cliArg.equalsIgnoreCase(IOS.name())) {
platform = IOS;
} else {
platform = IOS_DEMO;
}
}
private void setServerType() {
String serverArg = getProperty("serverType");
if (serverArg == null) {
// default to local if no one set the server type
serverArg = "local";
}
if (serverArg.equalsIgnoreCase(SAUCE_WITH_APP_FROM_SERVER.name())) {
if (username == null || accessKey == null) {
System.out.println("Username and access key were not set; running locally");
server = LOCAL;
return;
}
server = SAUCE_WITH_APP_FROM_SERVER;
} else if (serverArg.equalsIgnoreCase(SAUCE_WITH_APP_FROM_LOCAL.name())) {
server = SAUCE_WITH_APP_FROM_LOCAL;
} else {
server = LOCAL;
}
}
private String getAppFile(String app) {
File file = new File("src/test/resources/apps/" + app);
return file.getAbsolutePath();
}
protected MobileElement safeFindClickable(MobileElement mobileElement) {
return (MobileElement) wait.until(elementToBeClickable(mobileElement));
}
protected MobileElement safeFindVisible(MobileElement mobileElement) {
return (MobileElement) wait.until(visibilityOf(mobileElement));
}
protected void safeFindTextToBePresentInElement(MobileElement mobileElement, String text) {
wait.until(textToBePresentInElement(mobileElement, text));
}
//EMU_1 device
protected AppiumDriver getDriver(DriverFactory driverFactory) {
if (testName.getMethodName().equals("smokeCloseAndReopenAppTest")
|| testName.getMethodName().equals("smokeLoadingAppInOfflineModeTest"))
return driverFactory.getDriverNoReset(EMU_1, "8200", "iPhone 8", "8100");
else return driverFactory.getDriver(EMU_1, "8200", "iPhone 8", "8100");
}
protected void login() throws InterruptedException {
if (platform == ANDROID || platform == ANDROID_DEMO || platform == ANDROID_DEMO_LOCAL_APK) {
loginViews.loginAndroid
(phoneNumber, codeDigit1, codeDigit2, codeDigit3, codeDigit4, (AndroidDriver) driver);
} else {
loginViews.loginIos(phoneNumber, code, (IOSDriver) driver);
}
boolean tryAgain = true;
int retryCount = 0;
while (tryAgain && retryCount < 5) {
try {
safeFindClickable(ordersView.selectLocationDropdownArrow).click();
tryAgain = false;
} catch (StaleElementReferenceException staleElementReferenceException) {
assertTrue(rateSuppliersServiceView.header.isDisplayed() &&
rateSuppliersServiceView.header.getText().equals("RATE YOUR SUPPLIER’S SERVICE THIS WEEK"));
rateSuppliersServiceView.clickOnSkipButton();
retryCount += 1;
tryAgain = true;
}
}
ordersView.clickOnAppleTestLocation();
ordersView.clickOnOrdersTab();
}
@Before
public void setUp() throws IOException, InterruptedException {
String app = getAppFile("Rekki Demo.zip");
if (platform == ANDROID) {
app = "https://unity.rekki.com/android-apks/rekki-live-release-" + getProperty("apkVersion") + ".apk";
} else if (platform == ANDROID_DEMO) {
app = "https://unity.rekki.com/android-apks/rekki-demo-release-" + getProperty("demoApkVersion") + ".apk";
} else if (platform == ANDROID_DEMO_LOCAL_APK && server == LOCAL) {
app = getAppFile("rekki-demo-release-" + getProperty("demoApkVersion") + ".apk");
} else if (platform == IOS_DEMO) {
app = getAppFile("Rekki Demo.zip"); //TODO update iOS when link will be provided
}
URL serverUrl = new URL(baseAppiumUrl);
String appStr = app;
if (platform == ANDROID_DEMO_LOCAL_APK && server == SAUCE_WITH_APP_FROM_LOCAL) { //upload app file from project dir
serverUrl = new URL("https://" + username + ":" + accessKey + sauceServer);
sauceAPI.uploadFile(new File(app)); //DEPRECATED
appStr = "sauce-storage:" + app; //DEPRECATED
//todo - LOCAL MODE
/*
* curl -u "$SAUCE_USERNAME:$SAUCE_ACCESS_KEY" --location \
--request POST 'https://api.eu-central-1.saucelabs.com/v1/storage/upload' \
--form 'payload=@"/Users/sasha/IdeaProjects/mobile_automation/src/test/resources/apps/rekki-demo-release-20.29.31.apk"' \
--form 'name="rekki-demo-release-20.29.31.apk"'
* TODO - later implement it via RestAssured
* */
} else if (server == SAUCE_WITH_APP_FROM_SERVER) {
serverUrl = new URL("https://" + username + ":" + accessKey + sauceServer);
appStr = "https://unity.rekki.com/android-apks/rekki-demo-release-" + getProperty("demoApkVersion") + ".apk";
}
DriverFactory driverFactory = new DriverFactory(platform, server, appStr, serverUrl, name.getMethodName());
driver = getDriver(driverFactory);
sessionId = driver.getSessionId().toString();
mainView = new MainView(driver);
loginViews = new LoginViews(driver);
ordersView = new OrdersView(driver);
orderGuideView = new OrderGuideView(driver);
orderGuideSearchView = new OrderGuideSearchView(driver);
deliveryDateView = new DeliveryDateView(driver);
reviewYourOrderView = new ReviewYourOrderView(driver);
forgetAnythingView = new ForgetAnythingView(driver);
orderSentView = new OrderSentView(driver);
doubleCheckDeliveryDateView = new DoubleCheckDeliveryDateView(driver);
uploadOptionsView = new UploadOptionsView(driver);
uploadImagesView = new UploadImagesView(driver);
addImageView = new AddImageView(driver);
addProductDetailsView = new AddProductDetailsView(driver);
editProductView = new EditProductView(driver);
chatView = new ChatView(driver);
chatSettingsView = new ChatSettingsView(driver);
contactsView = new ContactsView(driver);
inviteContactView = new InviteContactView(driver);
selectChatsView = new SelectChatsView(driver);
newMemberInvitedView = new NewMemberInvitedView(driver);
userRemovedFromChatView = new UserRemovedFromChatView(driver);
userRemovedFromLocationView = new UserRemovedFromLocationView(driver);
newStableBuildAvailableView = new NewStableBuildAvailableView(driver);
productDetailsView = new ProductDetailsView(driver);
productsCatalogueView = new ProductsCatalogueView(driver);
unitModalView = new UnitModalView(driver);
productAddedView = new ProductAddedView(driver);
marketView = new MarketView(driver);
specialityView = new SpecialityView(driver);
supplierChatView = new SupplierChatView(driver);
supplierCardView = new SupplierCardView(driver);
catalogueItemsView = new CatalogueItemsView(driver);
reviewProductsView = new ReviewProductsView(driver);
pickLocationView = new PickLocationView(driver);
allSuppliersView = new AllSuppliersView(driver);
enterSupplierDetailsView = new EnterSupplierDetailsView(driver);
addContactNumberView = new AddContactNumberView(driver);
youCanStartOrderingNowView = new YouCanStartOrderingNowView(driver);
androidSelectPhotoView = new AndroidSelectPhotoView(driver);
somethingWentWrongView = new SomethingWentWrongView(driver);
codeEntryView = new CodeEntryView(driver);
settingsView = new SettingsView(driver);
iosPhotosGalleryView = new IOSPhotosGalleryView(driver);
orderView = new OrderView(driver);
reportIssueToSupplierView = new ReportIssueToSupplierView(driver);
productIssueView = new ProductIssueView(driver);
issueDetailsView = new IssueDetailsView(driver);
issuesReportedToSupplierView = new IssuesReportedToSupplierView(driver);
reportedIssuesView = new ReportedIssuesView(driver);
reportedProductView = new ReportedProductView(driver);
notificationSettingsView = new NotificationSettingsView(driver);
selectFileView = new SelectFileView(driver);
addInvoiceView = new AddInvoiceView(driver);
addToOrderView = new AddToOrderView(driver);
addOrEditInvoiceDetailsView = new AddOrEditInvoiceDetailsView(driver);
yourInvoiceWasAddedView = new YourInvoiceWasAddedView(driver);
uploadInvoiceView = new UploadInvoiceView(driver);
openedChatImagesView = new OpenedChatImagesView(driver);
longPressOpenedChatImageView = new LongPressOpenedChatImageView(driver);
androidShareView = new AndroidShareView(driver);
recommendedProductsView = new RecommendedProductsView(driver);
invoiceLayoutView = new InvoiceLayoutView(driver);
invoiceForwardDownloadOptionsView = new InvoiceForwardDownloadOptionsView(driver);
manageLocationView = new ManageLocationView(driver);
manageTeamView = new ManageTeamView(driver);
enterRepDetailsView = new EnterRepDetailsView(driver);
orderForwardingView = new OrderForwardingView(driver);
trackOrdersView = new TrackOrdersView(driver);
proSupplierView = new ProSupplierView(driver);
paymentMethodView = new PaymentMethodView(driver);
billingAddressView = new BillingAddressView(driver);
userAgreementView = new UserAgreementView(driver);
paymentMethodsView = new PaymentMethodsView(driver);
pickPaymentMethodView = new PickPaymentMethodView(driver);
rekkiSupportChatView = new RekkiSupportChatView(driver);
imageUploadView = new ImageUploadView(driver);
paymentMethodsSettingsView = new PaymentMethodsSettingsView(driver);
rateSuppliersServiceView = new RateSuppliersServiceView(driver);
sauceCameraAllowAccessView = new SauceCameraAllowAccessView(driver);
wait = new WebDriverWait(driver, 15);
if (testName.getMethodName().equals("smokeCloseAndReopenAppTest")
|| testName.getMethodName().equals("smokeLoadingAppInOfflineModeTest")) {
driver.resetApp(); //VERY IMPORTANT PRECONDITION FOR OFFLINE/RESET SCENARIO TESTS
sleep(5_000);
}
sleep(5_000); //waiting for splash screen animation to disappear todo - investigate to avoid this sleep
safeFindClickable(mainView.loginButton).click();
if (!testName.getMethodName().equals("smokeLoginNegativeTest")) {
login();
} else {
if (platform == ANDROID || platform == ANDROID_DEMO || platform == ANDROID_DEMO_LOCAL_APK) {
loginViews.loginAndroidNegative(PHONE_NUMBER, (AndroidDriver) driver);
} else {
loginViews.loginIosNegative(PHONE_NUMBER, CODE_NEGATIVE, (IOSDriver) driver);
}
}
}
@After
public void tearDown() {
driver.quit();
}
}