-
Notifications
You must be signed in to change notification settings - Fork 125
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rdc network throttling test example (#182)
* Add example for Network Throttling * small clean up * add network throttling to list of examples --------- Co-authored-by: Eyal Yovel <[email protected]>
- Loading branch information
Showing
3 changed files
with
208 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
148 changes: 148 additions & 0 deletions
148
...p-examples/src/test/java/com/examples/network_throttling/NetworkThrottlingIosRDCTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
package com.examples.network_throttling; | ||
|
||
import com.google.common.collect.ImmutableMap; | ||
import com.helpers.SauceAppiumTestWatcher; | ||
import io.appium.java_client.ios.IOSDriver; | ||
import org.junit.Before; | ||
import org.junit.Rule; | ||
import org.junit.Test; | ||
import org.junit.rules.TestName; | ||
import org.openqa.selenium.By; | ||
import org.openqa.selenium.MutableCapabilities; | ||
import org.openqa.selenium.support.ui.ExpectedConditions; | ||
import org.openqa.selenium.support.ui.WebDriverWait; | ||
|
||
import java.net.MalformedURLException; | ||
import java.net.URL; | ||
import java.time.Duration; | ||
|
||
import static com.helpers.Constants.SAUCE_EU_URL; | ||
import static com.helpers.Constants.SAUCE_US_URL; | ||
import static com.helpers.Constants.region; | ||
|
||
public class NetworkThrottlingIosRDCTest { | ||
|
||
private final static By moreTabButton = By.xpath("//XCUIElementTypeButton[@name=\"More-tab-item\"]"); | ||
private final static By webviewButton = By.xpath("//XCUIElementTypeButton[@name=\"Webview-menu-item\"]"); | ||
private final static By urlInput = By.xpath("//XCUIElementTypeTextField[@value=\"https://www.website.com\"]"); | ||
private final static By goButton = By.xpath("//XCUIElementTypeButton[@name=\"Go To Site\"]"); | ||
private final static By moreInfoLink = By.xpath("//XCUIElementTypeLink[@name=\"Show more info\"]"); | ||
|
||
@Rule | ||
public TestName name = new TestName(); | ||
|
||
// This rule allows us to set test status with Junit | ||
@Rule | ||
public SauceAppiumTestWatcher resultReportingTestWatcher = new SauceAppiumTestWatcher(); | ||
|
||
private IOSDriver driver; | ||
private WebDriverWait wait; | ||
|
||
@Before | ||
public void setUp() { | ||
MutableCapabilities capabilities = new MutableCapabilities(); | ||
MutableCapabilities sauceOptions = new MutableCapabilities(); | ||
|
||
capabilities.setCapability("platformName", "ios"); | ||
capabilities.setCapability("deviceName", ".*"); | ||
|
||
// Sauce capabilities | ||
sauceOptions.setCapability("username", System.getenv("SAUCE_USERNAME")); | ||
sauceOptions.setCapability("accessKey", System.getenv("SAUCE_ACCESS_KEY")); | ||
|
||
String appName = "SauceLabs-Demo-App.ipa"; | ||
|
||
String testName = name.getMethodName(); | ||
switch (testName) { | ||
case "regularNetworkSpeedTest": | ||
System.out.println("Running regular network speed test"); | ||
capabilities.setCapability("appium:app", "storage:filename=" + appName); | ||
sauceOptions.setCapability("name", "Regular network speed test"); | ||
break; | ||
case "throttledNetworkProfileTest": | ||
System.out.println("Running throttled 2G Slow test"); | ||
capabilities.setCapability("appium:app", "storage:filename=" + appName); | ||
sauceOptions.setCapability("name", "Throttled 2G Slow test"); | ||
// Set a predefined network profile | ||
sauceOptions.setCapability("networkProfile", "2G"); | ||
break; | ||
case "throttledCustomNetworkConditionsTest": | ||
System.out.println("Running throttled custom network conditions test"); | ||
capabilities.setCapability("appium:app", "storage:filename=" + appName); | ||
sauceOptions.setCapability("name", "Throttled custom network conditions test"); | ||
// Set custom network conditions | ||
sauceOptions.setCapability("networkConditions", ImmutableMap.of( | ||
"downloadSpeed", 5000, | ||
"uploadSpeed", 3000, | ||
"latency", 200, | ||
"loss", 5 | ||
)); | ||
break; | ||
case "throttledNetworkSpeedWebTest": | ||
System.out.println("Running throttled 2G Slow web test"); | ||
capabilities.setCapability("browserName", "Safari"); | ||
sauceOptions.setCapability("name", "Throttled 2G Slow web test"); | ||
// Set a predefined network profile | ||
sauceOptions.setCapability("networkProfile", "2G"); | ||
break; | ||
default: | ||
System.out.println("No test configuration found for " + testName); | ||
break; | ||
} | ||
|
||
capabilities.setCapability("sauce:options", sauceOptions); | ||
|
||
try { | ||
driver = new IOSDriver(getAppiumUrl(), capabilities); | ||
} catch (Exception e){ | ||
System.out.println("Error to create the iOS Driver: " + e.getMessage()); | ||
} | ||
|
||
// Setting the driver so that we can report results | ||
resultReportingTestWatcher.setDriver(driver); | ||
} | ||
|
||
@Test | ||
public void regularNetworkSpeedTest() { | ||
testNetworkConditions(); | ||
} | ||
|
||
@Test | ||
public void throttledNetworkProfileTest() { | ||
testNetworkConditions(); | ||
} | ||
|
||
@Test | ||
public void throttledCustomNetworkConditionsTest() { | ||
testNetworkConditions(); | ||
} | ||
|
||
@Test | ||
public void throttledNetworkSpeedWebTest() { | ||
driver.get("https://www.fast.com"); | ||
wait = new WebDriverWait(driver, Duration.ofSeconds(30)); | ||
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("show-more-details-link"))); | ||
} | ||
|
||
private void testNetworkConditions() { | ||
wait = new WebDriverWait(driver, Duration.ofSeconds(5)); | ||
|
||
wait.until(ExpectedConditions.presenceOfElementLocated(moreTabButton)).click(); | ||
wait.until(ExpectedConditions.presenceOfElementLocated(webviewButton)).click(); | ||
wait.until(ExpectedConditions.presenceOfElementLocated(urlInput)).sendKeys("fast.com"); | ||
wait.until(ExpectedConditions.presenceOfElementLocated(goButton)).click(); | ||
|
||
wait = new WebDriverWait(driver, Duration.ofSeconds(30)); | ||
wait.until(ExpectedConditions.presenceOfElementLocated(moreInfoLink)); | ||
} | ||
|
||
private URL getAppiumUrl() throws MalformedURLException { | ||
switch (region) { | ||
case "us": | ||
return new URL(SAUCE_US_URL); | ||
case "eu": | ||
default: | ||
return new URL(SAUCE_EU_URL); | ||
} | ||
} | ||
} |
59 changes: 59 additions & 0 deletions
59
...app/appium-app-examples/src/test/java/com/examples/network_throttling/README.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
# Using Network Throttling on Sauce Labs Real Devices | ||
This folder contains examples for using Network Throttling on real devices for: | ||
|
||
- [iOS real devices on the Sauce Labs Cloud](#run-tests-on-sauce-labs-ios-real-devices) | ||
|
||
## Important information | ||
### Environment variables for Sauce Labs | ||
The examples in this repository use environment variables, make sure you've added the following | ||
|
||
# For Sauce Labs Emulators/Simulators/Real devices | ||
export SAUCE_USERNAME=******** | ||
export SAUCE_ACCESS_KEY=******* | ||
|
||
### Demo app(s) | ||
The Android demo app that has been used for all these tests can be found [here](https://github.com/saucelabs/my-demo-app-android/releases). | ||
The iOS demo app that has been used for all these tests can be found [here](https://github.com/saucelabs/my-demo-app-ios/releases). | ||
|
||
> The advice is to download the files to an `apps` folder in the root of this folder. | ||
Make sure that when you downloaded the files from the releases page, that you rename the apps to the following: | ||
|
||
- `mda-{#.#.#}.apk` => `SauceLabs-Demo-App.apk` | ||
|
||
**If you don't do that then the scripts can't find the apps!** | ||
|
||
### Upload apps to Sauce Storage | ||
If you want to use Android emulators, Android real devices, iOS simulators or iOS real devices in the Sauce Labs platform, you need to upload | ||
the apps to the Sauce Storage. | ||
|
||
#### Manual upload | ||
Execute the following steps to manually upload the apps: | ||
- Login to the Sauce Labs platform | ||
- Go to **LIVE** > **Mobile App** | ||
- Click on **App Upload** and OR select the folder, OR drag the apps to the screen to upload them | ||
|
||
#### Automated upload | ||
You can find a script to upload them to, OR the US, OR EU DC in [this](../../helpers/push_apps_to_storage.sh)-file. You can push the files to the | ||
storage by doing the following from the folder `appium-app-examples`: | ||
|
||
cd src/test/java/com/helpers/ | ||
push_apps_to_storage.sh | ||
|
||
## Run tests on Sauce Labs iOS real devices | ||
If you want to run the tests on iOS Sauce Labs Real Devices then you can run the iOS test with | ||
|
||
// If using the US DC | ||
mvn clean test -Dtest=NetworkThrottlingIosRDCTest -Dregion=us | ||
|
||
// If using the EU DC | ||
mvn clean test -Dtest=NetworkThrottlingIosRDCTest -Dregion=eu | ||
|
||
The tests, which can be found [here](NetworkThrottlingIosRDCTest.java), will be executed on: | ||
|
||
- Any available iPhone or iPad | ||
|
||
> The devices use *dynamic* allocation, meaning they will try to find an available device that matches a regular | ||
expression. | ||
> NOTE: Make sure you are in the folder `appium-app-examples` when you execute this command | ||
> |