How to use IOSStopScreenRecordingOptions class of io.appium.java_client.ios package

Best io.appium code snippet using io.appium.java_client.ios.IOSStopScreenRecordingOptions

MobileFactory.java

Source:MobileFactory.java Github

copy

Full Screen

...43import io.appium.java_client.ios.IOSElement;44import io.appium.java_client.ios.IOSStartScreenRecordingOptions;45import io.appium.java_client.ios.IOSStartScreenRecordingOptions.VideoQuality;46import io.appium.java_client.ios.IOSStartScreenRecordingOptions.VideoType;47import io.appium.java_client.ios.IOSStopScreenRecordingOptions;48import io.appium.java_client.screenrecording.ScreenRecordingUploadOptions;49/**50 * MobileFactory creates instance {@link WebDriver} for mobile testing.51 * 52 * @author Alex Khursevich (alex@qaprosoft.com)53 */54public class MobileFactory extends AbstractFactory {55 56 private final static String vnc_mobile = "vnc_mobile";57 58 @Override59 public WebDriver create(String name, Device device, DesiredCapabilities capabilities, String seleniumHost) {60 if (seleniumHost == null) {61 seleniumHost = Configuration.get(Configuration.Parameter.SELENIUM_HOST);62 }63 String driverType = Configuration.getDriverType(capabilities);64 String mobilePlatformName = Configuration.getPlatform();65 // TODO: refactor code to be able to remove SpecialKeywords.CUSTOM property66 // completely67 // use comparison for custom_capabilities here to localize as possible usage of68 // CUSTOM attribute69 String customCapabilities = Configuration.get(Parameter.CUSTOM_CAPABILITIES);70 if (!customCapabilities.isEmpty()) {71 mobilePlatformName = SpecialKeywords.CUSTOM;72 }73 LOGGER.debug("selenium: " + seleniumHost);74 RemoteWebDriver driver = null;75 if (isCapabilitiesEmpty(capabilities)) {76 capabilities = getCapabilities(name, device);77 }78 try {79 if (driverType.equalsIgnoreCase(SpecialKeywords.MOBILE)) {80 EventFiringAppiumCommandExecutor ce = new EventFiringAppiumCommandExecutor(new URL(seleniumHost));81 if (mobilePlatformName.toLowerCase().equalsIgnoreCase(SpecialKeywords.ANDROID)) {82 if (isVideoEnabled()) {83 84 final String videoName = UUID.randomUUID().toString();85 86 AndroidStartScreenRecordingOptions o1 = new AndroidStartScreenRecordingOptions()87 .withVideoSize(R.CONFIG.get("screen_record_size"))88 .withTimeLimit(Duration.ofSeconds(R.CONFIG.getInt("screen_record_duration")))89 .withBitRate(getBitrate(VideoQuality.valueOf(R.CONFIG.get("screen_record_quality"))));90 AndroidStopScreenRecordingOptions o2 = new AndroidStopScreenRecordingOptions()91 .withUploadOptions(new ScreenRecordingUploadOptions()92 .withRemotePath(String.format(R.CONFIG.get("screen_record_ftp"), videoName))93 .withAuthCredentials(R.CONFIG.get("screen_record_user"), R.CONFIG.get("screen_record_pass")));94 ce.getListeners()95 .add(new MobileRecordingListener<AndroidStartScreenRecordingOptions, AndroidStopScreenRecordingOptions>(ce, o1, o2, initVideoArtifact(videoName)));96 }97 driver = new AndroidDriver<AndroidElement>(ce, capabilities);98 } else if (mobilePlatformName.toLowerCase().equalsIgnoreCase(SpecialKeywords.IOS)) {99 if (isVideoEnabled()) {100 101 final String videoName = UUID.randomUUID().toString();102 103 IOSStartScreenRecordingOptions o1 = new IOSStartScreenRecordingOptions()104 .withVideoQuality(VideoQuality.valueOf(R.CONFIG.get("screen_record_quality")))105 .withVideoType(VideoType.MP4)106 .withTimeLimit(Duration.ofSeconds(R.CONFIG.getInt("screen_record_duration")));107 IOSStopScreenRecordingOptions o2 = new IOSStopScreenRecordingOptions()108 .withUploadOptions(new ScreenRecordingUploadOptions()109 .withRemotePath(String.format(R.CONFIG.get("screen_record_ftp"), videoName))110 .withAuthCredentials(R.CONFIG.get("screen_record_user"), R.CONFIG.get("screen_record_pass")));111 ce.getListeners().add(new MobileRecordingListener<IOSStartScreenRecordingOptions, IOSStopScreenRecordingOptions>(ce, o1, o2, initVideoArtifact(videoName)));112 }113 driver = new IOSDriver<IOSElement>(ce, capabilities);114 } else if (mobilePlatformName.toLowerCase().equalsIgnoreCase(SpecialKeywords.CUSTOM)) {115 // that's a case for custom mobile capabilities like browserstack or saucelabs116 driver = new RemoteWebDriver(new URL(seleniumHost), capabilities);117 } else {118 throw new RuntimeException("Unsupported mobile capabilities for type: " + driverType + " platform: " + mobilePlatformName);119 }120 }121 if (device.isNull()) {122 // TODO: double check that local run with direct appium works fine123 RemoteDevice remoteDevice = getDeviceInfo(driver);124 // 3rd party solutions like browserstack or saucelabs return not null125 if (remoteDevice != null && remoteDevice.getName() != null) {...

Full Screen

Full Screen

VideoRecording.java

Source:VideoRecording.java Github

copy

Full Screen

1package se.soprasteria.automatedtesting.webdriver.helpers.video;2import io.appium.java_client.android.AndroidStartScreenRecordingOptions;3import io.appium.java_client.android.AndroidStopScreenRecordingOptions;4import io.appium.java_client.ios.IOSStartScreenRecordingOptions;5import io.appium.java_client.ios.IOSStopScreenRecordingOptions;6import io.appium.java_client.screenrecording.BaseStartScreenRecordingOptions;7import io.appium.java_client.screenrecording.BaseStopScreenRecordingOptions;8import io.appium.java_client.screenrecording.CanRecordScreen;9import org.monte.media.Format;10import org.monte.media.math.Rational;11import org.monte.screenrecorder.ScreenRecorder;12import se.soprasteria.automatedtesting.webdriver.api.base.BaseClass;13import se.soprasteria.automatedtesting.webdriver.api.base.BaseTestConfig;14import se.soprasteria.automatedtesting.webdriver.api.datastructures.ConfigurationOption;15import se.soprasteria.automatedtesting.webdriver.helpers.driver.AutomationDriver;16import java.awt.*;17import java.io.File;18import java.io.FileOutputStream;19import java.nio.file.Files;20import java.nio.file.Path;21import java.nio.file.Paths;22import java.text.SimpleDateFormat;23import java.util.Base64;24import java.util.Date;25import static org.monte.media.FormatKeys.*;26import static org.monte.media.VideoFormatKeys.*;27/**28 * VIDEO RECORDING FUNCTIONALITY IS A BETA FEATURE!29 * IT IS UNSTABLE AND NEED MORE TESTING.30 * <p>31 * Class with methods handling the video recording functionality.32 * If property "config.video.record" is set to value "true" in config.xml-file33 * video recording will be saved whenever a test fails.34 */35public class VideoRecording extends BaseClass {36 private ScreenRecorder screenRecorder;37 public static final String USER_DIR = "user.dir";38 private static String outBaseFolder = "target/surefire-reports/video/";39 private String folder;40 private String currentVideoFilePath;41 private static final VideoRecording INSTANCE;42 private static final boolean VIDEO_RECORDING_ENABLED;43 static {44 INSTANCE = new VideoRecording();45 VIDEO_RECORDING_ENABLED = Boolean.valueOf(BaseTestConfig.getConfigurationOption(ConfigurationOption.VIDEO_RECORDING));46 }47 public static VideoRecording getInstance() {48 return INSTANCE;49 }50 public void startRecording(AutomationDriver driver) {51 if (VIDEO_RECORDING_ENABLED) {52 initVideoRecording();53 if (driver.isWeb() || driver.isWindowsDriver()) {54 startRecordingWeb();55 } else if (driver.isMobile()) {56 startRecordingMobile(driver);57 }58 }59 }60 public void stopRecording(AutomationDriver driver, boolean deleteRecording, String testName) {61 if (VIDEO_RECORDING_ENABLED) {62 if (driver.isWeb() || driver.isWindowsDriver()) {63 stopRecordingWeb(testName);64 } else if (driver.isMobile()) {65 stopRecordingMobile(driver, testName);66 }67 logger.info("Stopped video recording");68 }69 if (deleteRecording) deleteRecording();70 }71 private void startRecordingWeb() {72 try {73 logger.info("Video recording is ON, Video folder: " + folder);74 this.screenRecorder = new ScreenRecorder(getGraphicsConfiguration(), null,75 new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI),76 new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE,77 CompressorNameKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE,78 DepthKey, 24, FrameRateKey, Rational.valueOf(15),79 QualityKey, 1.0f,80 KeyFrameIntervalKey, 15 * 60),81 null, null, new File(folder));82 this.screenRecorder.start();83 logger.info("Start Video recording");84 } catch (Exception e) {85 System.setProperty("videoRecord", null);86 logger.error("Can't start video recording." + e.getMessage());87 }88 }89 private void startRecordingMobile(AutomationDriver driver) {90 BaseStartScreenRecordingOptions options;91 if (driver.isAndroid()) {92 options = new AndroidStartScreenRecordingOptions();93 } else {94 options = new IOSStartScreenRecordingOptions();95 }96 try {97 ((CanRecordScreen) driver.getWebDriver()).startRecordingScreen(options);98 } catch (Exception e) {99 logger.warn("Could not start recording screen on mobile platform: " + e.getMessage());100 }101 logger.trace("Mobile recording started");102 }103 private void stopRecordingWeb(String testName) {104 try {105 this.screenRecorder.stop();106 File currentVideoFile = this.screenRecorder.getCreatedMovieFiles().get(0);107 currentVideoFilePath = videoFileName(testName) + ".avi";108 File videoFile = new File(currentVideoFilePath);109 currentVideoFile.renameTo(videoFile);110 logger.info("Append video record to file : " + currentVideoFile);111 } catch (Exception e) {112 logger.error("Can't stop video recording." + e.getMessage());113 }114 }115 private void stopRecordingMobile(AutomationDriver driver, String testName) {116 BaseStopScreenRecordingOptions options;117 if (driver.isAndroid()) {118 options = new AndroidStopScreenRecordingOptions();119 } else {120 options = new IOSStopScreenRecordingOptions();121 }122 byte[] decodedBytes = null;123 try {124 decodedBytes = Base64.getDecoder().decode(((CanRecordScreen) driver.getWebDriver()).stopRecordingScreen(options));125 } catch (Exception e) {126 logger.warn("Could not stop recording screen on mobile platform: " + e.getMessage());127 }128 try {129 currentVideoFilePath = videoFileName(testName) + ".mp4";130 FileOutputStream out = new FileOutputStream(currentVideoFilePath);131 out.write(decodedBytes);132 out.close();133 } catch (Exception e) {134 logger.error("Could not decode mobile video: ", e.toString());...

Full Screen

Full Screen

IOSDevice.java

Source:IOSDevice.java Github

copy

Full Screen

...20import io.appium.java_client.MobileElement;21import io.appium.java_client.ios.IOSDriver;22import io.appium.java_client.ios.IOSStartScreenRecordingOptions;23import io.appium.java_client.ios.IOSStartScreenRecordingOptions.VideoQuality;24import io.appium.java_client.ios.IOSStopScreenRecordingOptions;25import io.appium.java_client.ios.IOSTouchAction;26/**27 * @author wasiq.bhamla28 * @since 13-Apr-2017 5:33:35 PM29 */30public class IOSDevice extends Device<IOSDriver<MobileElement>, IOSTouchAction> {31 /**32 * @param server Server instance33 * @param name Server name34 *35 * @author wasiq.bhamla36 * @since 13-Apr-2017 9:12:09 PM37 */38 public IOSDevice (final AppiumServer server, final String name) {39 super (server, name);40 }41 /*42 * (non-Javadoc)43 * @see com.github.wasiqb.coteafs.appium.device.Device#startRecordSetting()44 */45 @SuppressWarnings ("unchecked")46 @Override47 protected IOSStartScreenRecordingOptions startRecordSetting () {48 final IOSStartScreenRecordingOptions options = IOSStartScreenRecordingOptions.startScreenRecordingOptions ();49 final IOSVideoSetting record = this.setting.getPlayback ()50 .getRecording ()51 .getIos ();52 if (record.getQuality () != VideoQuality.MEDIUM) {53 options.withVideoQuality (record.getQuality ());54 }55 if (record.getFps () > 0) {56 options.withFps (record.getFps ());57 }58 if (record.getCodec () != null) {59 options.withVideoType (record.getCodec ());60 }61 return options;62 }63 /*64 * (non-Javadoc)65 * @see com.github.wasiqb.coteafs.appium.device.Device#stopRecordSetting()66 */67 @SuppressWarnings ("unchecked")68 @Override69 protected IOSStopScreenRecordingOptions stopRecordSetting () {70 return IOSStopScreenRecordingOptions.stopScreenRecordingOptions ();71 }72}...

Full Screen

Full Screen

IOSStopScreenRecordingOptions.java

Source:IOSStopScreenRecordingOptions.java Github

copy

Full Screen

...14 * limitations under the License.15 */16package io.appium.java_client.ios;17import io.appium.java_client.screenrecording.BaseStopScreenRecordingOptions;18public class IOSStopScreenRecordingOptions extends19 BaseStopScreenRecordingOptions<IOSStopScreenRecordingOptions> {20 public static IOSStopScreenRecordingOptions stopScreenRecordingOptions() {21 return new IOSStopScreenRecordingOptions();22 }23}...

Full Screen

Full Screen

IOSStopScreenRecordingOptions

Using AI Code Generation

copy

Full Screen

1import io.appium.java_client.ios.IOSStopScreenRecordingOptions;2IOSStopScreenRecordingOptions stopOptions = new IOSStopScreenRecordingOptions();3stopOptions.withVideoType("mjpeg");4stopOptions.withVideoQuality("medium");5stopOptions.withVideoScale(2.0);6stopOptions.withTimeLimit("00:00:30");7stopOptions.withVideoFilter("negate");8stopOptions.withVideoFilter("scale=1280:720");9stopOptions.withVideoFilter("setpts=2*PTS");10stopOptions.withVideoFilter("transpose=2");11stopOptions.withVideoFilter("crop=1280:720:0:0");12stopOptions.withVideoFilter("rotate=PI/2");13stopOptions.withVideoFilter("vflip");14stopOptions.withVideoFilter("hflip");15stopOptions.withVideoFilter("fps=fps=30");16from appium.webdriver.ios import IOSStopScreenRecordingOptions17stopOptions = IOSStopScreenRecordingOptions()18stopOptions.video_type("mjpeg")19stopOptions.video_quality("medium")20stopOptions.video_scale(2.0)21stopOptions.time_limit("00:00:30")22stopOptions.video_filter("negate")23stopOptions.video_filter("scale=1280:720")24stopOptions.video_filter("setpts=2*PTS")25stopOptions.video_filter("transpose=2")26stopOptions.video_filter("crop=1280:720:0:0")27stopOptions.video_filter("rotate=PI/2")28stopOptions.video_filter("vflip")29stopOptions.video_filter("hflip")30stopOptions.video_filter("fps=fps=30")

Full Screen

Full Screen

IOSStopScreenRecordingOptions

Using AI Code Generation

copy

Full Screen

1IOSStopScreenRecordingOptions stopScreenRecordingOptions = new IOSStopScreenRecordingOptions();2stopScreenRecordingOptions.withVideoType("mjpeg");3driver.stopRecordingScreen(stopScreenRecordingOptions);4IOSStartScreenRecordingOptions startScreenRecordingOptions = new IOSStartScreenRecordingOptions();5startScreenRecordingOptions.withVideoType("mjpeg");6driver.startRecordingScreen(startScreenRecordingOptions);7IOSStartScreenRecordingOptions startScreenRecordingOptions = new IOSStartScreenRecordingOptions();8startScreenRecordingOptions.withVideoType("mjpeg");9driver.startRecordingScreen(startScreenRecordingOptions);10IOSStopScreenRecordingOptions stopScreenRecordingOptions = new IOSStopScreenRecordingOptions();11stopScreenRecordingOptions.withVideoType("mjpeg");12driver.stopRecordingScreen(stopScreenRecordingOptions);13IOSStartScreenRecordingOptions startScreenRecordingOptions = new IOSStartScreenRecordingOptions();14startScreenRecordingOptions.withVideoType("mjpeg");15driver.startRecordingScreen(startScreenRecordingOptions);16IOSStopScreenRecordingOptions stopScreenRecordingOptions = new IOSStopScreenRecordingOptions();17stopScreenRecordingOptions.withVideoType("mjpeg");18driver.stopRecordingScreen(stopScreenRecordingOptions);19IOSStartScreenRecordingOptions startScreenRecordingOptions = new IOSStartScreenRecordingOptions();20startScreenRecordingOptions.withVideoType("mjpeg");21driver.startRecordingScreen(startScreenRecordingOptions);22IOSStopScreenRecordingOptions stopScreenRecordingOptions = new IOSStopScreenRecordingOptions();23stopScreenRecordingOptions.withVideoType("mjpeg");24driver.stopRecordingScreen(stopScreenRecordingOptions);

Full Screen

Full Screen

IOSStopScreenRecordingOptions

Using AI Code Generation

copy

Full Screen

1IOSStopScreenRecordingOptions options = new IOSStopScreenRecordingOptions();2options.withVideoType("h264");3options.withVideoQuality("medium");4options.withVideoFps(10);5driver.stopRecordingScreen(options);6driver.stopRecordingScreen(options);7IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();8options.withVideoType("h264");9options.withVideoQuality("medium");10options.withVideoFps(10);11driver.startRecordingScreen(options);12IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();13options.withVideoType("h264");14options.withVideoQuality("medium");15options.withVideoFps(10);16driver.startRecordingScreen(options);17IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();18options.withVideoType("h264");19options.withVideoQuality("medium");20options.withVideoFps(10);21driver.startRecordingScreen(options);22IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();23options.withVideoType("h264");24options.withVideoQuality("medium");25options.withVideoFps(10);26driver.startRecordingScreen(options);27IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();28options.withVideoType("h264");29options.withVideoQuality("medium");30options.withVideoFps(10);31driver.startRecordingScreen(options);32IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();33options.withVideoType("h264");34options.withVideoQuality("medium");35options.withVideoFps(10);36driver.startRecordingScreen(options);

Full Screen

Full Screen

IOSStopScreenRecordingOptions

Using AI Code Generation

copy

Full Screen

1IOSStopScreenRecordingOptions options = new IOSStopScreenRecordingOptions();2options.withVideoType("mjpeg");3options.withVideoQuality("medium");4options.withVideoFps(10);5options.withTimeLimit("30");6driver.stopRecordingScreen(options);7IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();8options.withVideoType("mjpeg");9options.withVideoQuality("medium");10options.withVideoFps(10);11options.withTimeLimit("30");12driver.startRecordingScreen(options);13IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();14options.withVideoType("mjpeg");15options.withVideoQuality("medium");16options.withVideoFps(10);17options.withTimeLimit("30");18driver.startRecordingScreen(options);19IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();20options.withVideoType("mjpeg");21options.withVideoQuality("medium");22options.withVideoFps(10);23options.withTimeLimit("30");24driver.startRecordingScreen(options);25IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();26options.withVideoType("mjpeg");27options.withVideoQuality("medium");28options.withVideoFps(10);29options.withTimeLimit("30");30driver.startRecordingScreen(options);31IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();32options.withVideoType("mjpeg");33options.withVideoQuality("medium");34options.withVideoFps(10);35options.withTimeLimit("30");36driver.startRecordingScreen(options);37IOSStartScreenRecordingOptions options = new IOSStartScreenRecordingOptions();38options.withVideoType("mjpeg");39options.withVideoQuality("medium");40options.withVideoFps(10

Full Screen

Full Screen

IOSStopScreenRecordingOptions

Using AI Code Generation

copy

Full Screen

1IOSStopScreenRecordingOptions options = new IOSStopScreenRecordingOptions();2options.setVideoType("mjpeg");3options.setVideoQuality("medium");4options.setVideoFps(10);5options.setVideoScale(0.5);6options.setVideoFilter("scale=320:240");7options.setVideoFilters("crop=100:100:100:100,transpose=cclock");8driver.stopRecordingScreen(options);9options = IOSStopScreenRecordingOptions()10options.set_video_type("mjpeg")11options.set_video_quality("medium")12options.set_video_fps(10)13options.set_video_scale(0.5)14options.set_video_filter("scale=320:240")15options.set_video_filters("crop=100:100:100:100,transpose=cclock")16driver.stop_recording_screen(options)17driver.stop_recording_screen(options)18const options = new IOSStopScreenRecordingOptions();19options.setVideoType('mjpeg');20options.setVideoQuality('medium');21options.setVideoFps(10);22options.setVideoScale(0.5);23options.setVideoFilter('scale=320:240');24options.setVideoFilters('crop=100:100:100:100,transpose=cclock');25await driver.stopRecordingScreen(options);26var options = new IOSStopScreenRecordingOptions();27options.VideoType = "mjpeg";28options.VideoQuality = "medium";29options.VideoFps = 10;30options.VideoScale = 0.5;31options.VideoFilter = "scale=320:240";

Full Screen

Full Screen

IOSStopScreenRecordingOptions

Using AI Code Generation

copy

Full Screen

1IOSStopScreenRecordingOptions stopOptions = new IOSStopScreenRecordingOptions();2stopOptions.setVideoType("h264");3stopOptions.setVideoQuality("medium");4stopOptions.setVideoFps(30);5String localPath = System.getProperty("user.dir");6String videoName = "video.mp4";7String videoPath = localPath + File.separator + videoName;8stopOptions.setVideoSavePath(videoPath);9driver.stopRecordingScreen(stopOptions);10let stopOptions = new IOSStopScreenRecordingOptions();11stopOptions.setVideoType("h264");12stopOptions.setVideoQuality("medium");13stopOptions.setVideoFps(30);14let localPath = process.cwd();15let videoName = "video.mp4";16let videoPath = path.resolve(localPath, videoName);17stopOptions.setVideoSavePath(videoPath);18await driver.stopRecordingScreen(stopOptions);19stop_options = IOSStopScreenRecordingOptions()20stop_options.set_video_type("h264")21stop_options.set_video_quality("medium")22stop_options.set_video_fps(30)23local_path = os.getcwd()24video_path = os.path.join(local_path, video_name)25stop_options.set_video_save_path(video_path)26driver.stop_recording_screen(stop_options)27stop_options.set_video_type("h264")28stop_options.set_video_quality("medium")29stop_options.set_video_fps(30)30video_path = File.join(local_path, video_name)31stop_options.set_video_save_path(video_path)32driver.stop_recording_screen(stop_options)

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run io.appium automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Most used methods in IOSStopScreenRecordingOptions

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful