How to use XPathUtils method of com.consol.citrus.xml.xpath.XPathUtils class

Best Citrus code snippet using com.consol.citrus.xml.xpath.XPathUtils.XPathUtils

Source:JUnit4TestReportLoader.java Github

copy

Full Screen

...19import com.consol.citrus.admin.service.report.TestReportLoader;20import com.consol.citrus.exceptions.CitrusRuntimeException;21import com.consol.citrus.util.FileUtils;22import com.consol.citrus.util.XMLUtils;23import com.consol.citrus.xml.xpath.XPathUtils;24import org.slf4j.Logger;25import org.slf4j.LoggerFactory;26import org.springframework.beans.factory.annotation.Autowired;27import org.springframework.core.Ordered;28import org.springframework.core.annotation.Order;29import org.springframework.core.io.FileSystemResource;30import org.springframework.core.io.Resource;31import org.springframework.stereotype.Component;32import org.springframework.util.CollectionUtils;33import org.springframework.util.StringUtils;34import org.springframework.util.xml.DomUtils;35import org.w3c.dom.*;36import java.io.File;37import java.io.IOException;38import java.util.*;39/**40 * @author Christoph Deppisch41 */42@Component43@Order(Ordered.LOWEST_PRECEDENCE)44public class JUnit4TestReportLoader implements TestReportLoader {45 /** Logger */46 private static Logger log = LoggerFactory.getLogger(JUnit4TestReportLoader.class);47 @Autowired48 private TestCaseService testCaseService;49 @Override50 public TestReport getLatest(Project activeProject, Test test) {51 TestReport report = new TestReport();52 if (hasTestResults(activeProject)) {53 try {54 String testResultsContent = getTestResultsAsString(activeProject);55 if (StringUtils.hasText(testResultsContent)) {56 Document testResults = XMLUtils.parseMessagePayload(testResultsContent);57 Element testCase = (Element) XPathUtils.evaluateAsNode(testResults, "/testsuite/testcase[@classname = '" + test.getPackageName() + "." + test.getClassName() + "']", null);58 TestResult result = getResult(test, testCase);59 report.setTotal(1);60 if (result.getStatus().equals(TestStatus.PASS)) {61 report.setPassed(1L);62 } else if (result.getStatus().equals(TestStatus.FAIL)) {63 report.setFailed(1L);64 } else if (result.getStatus().equals(TestStatus.SKIP)) {65 report.setSkipped(1L);66 }67 report.getResults().add(result);68 }69 } catch (CitrusRuntimeException e) {70 log.warn("No results found for test: " + test.getPackageName() + "." + test.getClassName() + "#" + test.getMethodName());71 }72 }73 return report;74 }75 @Override76 public TestReport getLatest(Project activeProject) {77 TestReport report = new TestReport();78 if (hasTestResults(activeProject)) {79 String testResultsContent = getTestResultsAsString(activeProject);80 if (StringUtils.hasText(testResultsContent)) {81 Document testResults = XMLUtils.parseMessagePayload(testResultsContent);82 report.setProjectName(activeProject.getName());83 report.setSuiteName(XPathUtils.evaluateAsString(testResults, "/testsuite/@name", null));84 report.setDuration(Math.round(Double.valueOf(XPathUtils.evaluateAsString(testResults, "/testsuite/@time", null)) * 1000));85 report.setFailed(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testsuite/@failures", null)));86 report.setSkipped(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testsuite/@skipped", null)));87 report.setTotal(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testsuite/@tests", null)));88 report.setPassed(report.getTotal() - report.getSkipped() - report.getFailed());89 NodeList testCases = XPathUtils.evaluateAsNodeList(testResults, "/testsuite/testcase", null);90 for (int i = 0; i < testCases.getLength(); i++) {91 Element testCase = (Element) testCases.item(i);92 String className = testCase.getAttribute("classname");93 String methodName = testCase.getAttribute("name");94 String packageName;95 if (className.indexOf(':') > 0 || className.indexOf(' ') > 0) {96 // Cucumber BDD test97 packageName = report.getSuiteName().substring(0, report.getSuiteName().lastIndexOf('.'));98 String classFileName = report.getSuiteName().substring(packageName.length() + 1);99 Test test = testCaseService.findTest(activeProject, packageName, classFileName);100 TestResult result = getResult(test, testCase);101 result.getTest().setName(className + " - " + methodName);102 report.getResults().add(result);103 } else if (className.indexOf('.') > 0) {...

Full Screen

Full Screen

Source:TestNGTestReportLoader.java Github

copy

Full Screen

...19import com.consol.citrus.admin.service.report.TestReportLoader;20import com.consol.citrus.exceptions.CitrusRuntimeException;21import com.consol.citrus.util.FileUtils;22import com.consol.citrus.util.XMLUtils;23import com.consol.citrus.xml.xpath.XPathUtils;24import org.slf4j.Logger;25import org.slf4j.LoggerFactory;26import org.springframework.beans.factory.annotation.Autowired;27import org.springframework.core.Ordered;28import org.springframework.core.annotation.Order;29import org.springframework.core.io.FileSystemResource;30import org.springframework.core.io.Resource;31import org.springframework.stereotype.Component;32import org.springframework.util.xml.DomUtils;33import org.w3c.dom.*;34import java.io.IOException;35import java.io.InputStream;36import java.text.ParseException;37import java.text.SimpleDateFormat;38import java.util.List;39/**40 * @author Christoph Deppisch41 */42@Component43@Order(Ordered.HIGHEST_PRECEDENCE)44public class TestNGTestReportLoader implements TestReportLoader {45 /** Logger */46 private static Logger log = LoggerFactory.getLogger(TestNGTestReportLoader.class);47 /** Date format */48 private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");49 @Autowired50 private TestCaseService testCaseService;51 @Override52 public TestReport getLatest(Project activeProject, Test test) {53 TestReport report = new TestReport();54 if (hasTestResults(activeProject)) {55 try {56 Document testResults = XMLUtils.parseMessagePayload(getTestResultsAsString(activeProject));57 Node testClass = XPathUtils.evaluateAsNode(testResults, "/testng-results/suite[1]/test/class[@name = '" + test.getPackageName() + "." + test.getClassName() + "']", null);58 Element testMethod = (Element) XPathUtils.evaluateAsNode(testClass, "test-method[@name='" + test.getMethodName() + "']", null);59 TestResult result = getResult(test, testMethod);60 report.setTotal(1);61 if (result.getStatus().equals(TestStatus.PASS)) {62 report.setPassed(1L);63 } else if (result.getStatus().equals(TestStatus.FAIL)) {64 report.setFailed(1L);65 } else if (result.getStatus().equals(TestStatus.SKIP)) {66 report.setSkipped(1L);67 }68 report.getResults().add(result);69 } catch (CitrusRuntimeException e) {70 log.warn("No results found for test: " + test.getPackageName() + "." + test.getClassName() + "#" + test.getMethodName());71 } catch (IOException e) {72 log.error("Failed to read test results file", e);73 }74 }75 return report;76 }77 @Override78 public TestReport getLatest(Project activeProject) {79 TestReport report = new TestReport();80 if (hasTestResults(activeProject)) {81 try {82 Document testResults = XMLUtils.parseMessagePayload(getTestResultsAsString(activeProject));83 report.setProjectName(activeProject.getName());84 report.setSuiteName(XPathUtils.evaluateAsString(testResults, "/testng-results/suite[1]/@name", null));85 report.setDuration(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testng-results/suite[1]/@duration-ms", null)));86 try {87 report.setExecutionDate(dateFormat.parse(XPathUtils.evaluateAsString(testResults, "/testng-results/suite[1]/@started-at", null)));88 } catch (ParseException e) {89 log.warn("Unable to read test execution time", e);90 }91 report.setPassed(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testng-results/@passed", null)));92 report.setFailed(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testng-results/@failed", null)));93 report.setSkipped(Long.valueOf(XPathUtils.evaluateAsString(testResults, "/testng-results/@skipped", null)));94 report.setTotal(report.getPassed() + report.getFailed() + report.getSkipped());95 NodeList testClasses = XPathUtils.evaluateAsNodeList(testResults, "testng-results/suite[1]/test/class", null);96 for (int i = 0; i < testClasses.getLength(); i++) {97 Element testClass = (Element) testClasses.item(i);98 List<Element> testMethods = DomUtils.getChildElementsByTagName(testClass, "test-method");99 for (Element testMethod : testMethods) {100 if (!testMethod.hasAttribute("is-config") || testMethod.getAttribute("is-config").equals("false")) {101 String packageName = testClass.getAttribute("name").substring(0, testClass.getAttribute("name").lastIndexOf('.'));102 String className = testClass.getAttribute("name").substring(packageName.length() + 1);103 String methodName = testMethod.getAttribute("name");104 Test test = testCaseService.findTest(activeProject, packageName, className, methodName);105 TestResult result = getResult(test, testMethod);106 report.getResults().add(result);107 }108 }109 }...

Full Screen

Full Screen

Source:InboundXmlDataDictionary.java Github

copy

Full Screen

1package com.consol.citrus.simulator.dictionary;2import com.consol.citrus.context.TestContext;3import com.consol.citrus.simulator.config.SimulatorConfigurationProperties;4import com.consol.citrus.variable.dictionary.xml.XpathMappingDataDictionary;5import com.consol.citrus.xml.xpath.XPathUtils;6import org.springframework.beans.factory.annotation.Autowired;7import org.springframework.core.io.Resource;8import org.springframework.core.io.support.PathMatchingResourcePatternResolver;9import org.springframework.util.xml.SimpleNamespaceContext;10import org.w3c.dom.Node;11import org.w3c.dom.NodeList;12import javax.xml.xpath.XPathConstants;13import java.util.LinkedHashMap;14import java.util.Map;15/**16 * @author Christoph Deppisch17 */18public class InboundXmlDataDictionary extends XpathMappingDataDictionary {19 /**20 * Default constructor setting default mappings and mappings file.21 */22 @Autowired23 public InboundXmlDataDictionary(SimulatorConfigurationProperties simulatorConfiguration) {24 setMappings(new LinkedHashMap<>());25 Resource inboundMappingFile = new PathMatchingResourcePatternResolver().getResource(simulatorConfiguration.getInboundXmlDictionary());26 if (inboundMappingFile.exists()) {27 mappingFile = inboundMappingFile;28 }29 }30 @Override31 public <T> T translate(Node node, T value, TestContext context) {32 for (Map.Entry<String, String> expressionEntry : mappings.entrySet()) {33 String expression = expressionEntry.getKey();34 SimpleNamespaceContext namespaceContext = new SimpleNamespaceContext();35 namespaceContext.setBindings(context.getNamespaceContextBuilder().getNamespaceMappings());36 NodeList findings = (NodeList) XPathUtils.evaluateExpression(node.getOwnerDocument(), expression, namespaceContext, XPathConstants.NODESET);37 if (findings != null && containsNode(findings, node)) {38 return convertIfNecessary(context.replaceDynamicContentInString(expressionEntry.getValue()), value);39 }40 }41 return value;42 }43 /**44 * Checks if given node set contains node.45 * @param findings46 * @param node47 * @return48 */49 private boolean containsNode(NodeList findings, Node node) {50 for (int i = 0; i < findings.getLength(); i++) {...

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.xml.xpath;2import com.consol.citrus.context.TestContext;3import com.consol.citrus.exceptions.CitrusRuntimeException;4import com.consol.citrus.util.FileUtils;5import com.consol.citrus.xml.namespace.NamespaceContextBuilder;6import com.consol.citrus.xml.namespace.NamespaceContextBuilderSupport;7import com.consol.citrus.xml.namespace.SimpleNamespaceContextBuilder;8import org.springframework.core.io.Resource;9import org.springframework.util.Assert;10import org.springframework.util.CollectionUtils;11import org.springframework.util.StringUtils;12import org.w3c.dom.Document;13import org.xml.sax.InputSource;14import org.xml.sax.SAXException;15import javax.xml.XMLConstants;16import javax.xml.namespace.NamespaceContext;17import javax.xml.parsers.DocumentBuilder;18import javax.xml.parsers.DocumentBuilderFactory;19import javax.xml.parsers.ParserConfigurationException;20import javax.xml.xpath.*;21import java.io.*;22import java.util.*;23public class XPathUtils {24 private XPathUtils() {25 }26 public static String evaluateAsString(String expression, String message) {27 return evaluateAsString(expression, message, null);28 }29 public static String evaluateAsString(String expression, String message, TestContext context) {30 return evaluateAsString(expression, message, context, null);31 }32 public static String evaluateAsString(String expression, String message, TestContext context, Map<String, String> namespaces) {33 String result = evaluate(expression, message, context, namespaces);34 if (result == null) {35 return null;36 }37 return result.trim();38 }39 public static String evaluateAsString(String expression, Resource message) {

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.dsl.runner;2import com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner;3import com.consol.citrus.xml.xpath.XPathUtils;4import org.testng.annotations.Test;5public class XPathUtilsTest extends TestNGCitrusTestDesigner {6public void xpathUtilsTest() {7variable("xml", "<hello>world</hello>");8}9}

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.xml.xpath;2import org.springframework.context.ApplicationContext;3import org.springframework.context.support.ClassPathXmlApplicationContext;4import org.testng.Assert;5import org.testng.annotations.Test;6public class XPathUtilsTest {7 public void testXPathUtils() {8 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/com/consol/citrus/xml/xpath/xpathUtilsTest.xml");9 String result = XPathUtils.evaluateAsString(context, "xpathUtilsTest", "concat('Hello', 'World')");10 Assert.assertEquals(result, "HelloWorld");11 }12}

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.xml.xpath;2import java.util.List;3import java.util.Map;4import java.util.Properties;5import javax.xml.namespace.QName;6import javax.xml.xpath.XPathConstants;7import org.springframework.util.StringUtils;8import org.w3c.dom.Document;9import org.w3c.dom.Node;10import org.w3c.dom.NodeList;11import org.xmlunit.builder.DiffBuilder;12import org.xmlunit.builder.Input;13import org.xmlunit.diff.Diff;14import org.xmlunit.diff.Difference;15import org.xmlunit.diff.DifferenceEvaluators;16import org.xmlunit.diff.ElementSelectors;17import com.consol.citrus.exceptions.ValidationException;18import com.consol.citrus.util.FileUtils;19import com.consol.citrus.xml.XmlUtils;20import com.consol.citrus.xml.namespace.NamespaceContextBuilder;21import com.consol.citrus.xml.namespace.SimpleNamespaceContextBuilder;22import com.consol.citrus.xml.xpath.XPathUtils;23import com.consol.citrus.xml.xpath.XPathValidationContext;24public class XPathUtils {25 private XPathUtils() {26 super();27 }28 public static void validate(String payload, Map<String, Object> xPathExpressions) throws ValidationException {29 if (StringUtils.hasText(payload)) {30 Document doc = XmlUtils.parseMessagePayload(payload);31 validate(doc, xPathExpressions);32 } else {33 throw new ValidationException("Unable to validate empty XML payload against XPath expressions");34 }35 }36 public static void validate(String payload, Map<String, Object> xPathExpressions, Properties namespaces) throws ValidationException {37 if (StringUtils.hasText(payload)) {38 Document doc = XmlUtils.parseMessagePayload(payload);39 validate(doc, xPathExpressions, namespaces);40 } else {41 throw new ValidationException("Unable to validate empty XML payload against XPath expressions");42 }43 }

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1public class 4 {2 public static void main(String[] args) {3 String xml = "<root><a>1</a><b>2</b><c>3</c></root>";4 String xpath = "/root/a";5 String result = XPathUtils.evaluateAsString(xml, xpath);6 System.out.println(result);7 }8}9public class 5 {10 public static void main(String[] args) {11 String xml = "<root><a>1</a><b>2</b><c>3</c></root>";12 String xpath = "/root/a";13 List<String> result = XPathUtils.evaluateAsStringList(xml, xpath);14 System.out.println(result);15 }16}17public class 6 {18 public static void main(String[] args) {19 String xml = "<root><a>1</a><b>2</b><c>3</c></root>";20 String xpath = "/root/a";21 List<String> result = XPathUtils.evaluateAsStringList(xml, xpath);22 System.out.println(result);23 }24}25public class 7 {26 public static void main(String[] args) {27 String xml = "<root><a>1</a><b>2</b><c>3</c></root>";28 String xpath = "/root/a";29 List<String> result = XPathUtils.evaluateAsStringList(xml, xpath);30 System.out.println(result);31 }32}33public class 8 {34 public static void main(String[] args) {35 String xml = "<root><a>1</a><b>2</b><c>3</c></root>";36 String xpath = "/root/a";37 List<String> result = XPathUtils.evaluateAsStringList(xml, xpath);38 System.out.println(result);39 }40}

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1public class XPathUtilsExample {2 public static void main(String[] args) {3 XPathUtils xPathUtils = new XPathUtils();4 XPathExpression xPathExpression = xPathUtils.createExpression("/bookstore/book/title");5 Document document = xPathUtils.parseMessage("<bookstore> <book> <title>Harry Potter</title> </book> </bookstore>");6 String value = xPathUtils.evaluateAsString(xPathExpression, document);7 System.out.println(value);8 }9}10public class XPathUtilsExample {11 public static void main(String[] args) {12 XPathUtils xPathUtils = new XPathUtils();13 Document document = xPathUtils.parseMessage("<bookstore> <book> <title>Harry Potter</title> </book> </bookstore>");14 String value = xPathUtils.evaluateAsString("/bookstore/book/title", document);15 System.out.println(value);16 }17}18public class XPathUtilsExample {19 public static void main(String[] args) {20 XPathUtils xPathUtils = new XPathUtils();21 Document document = xPathUtils.parseMessage("<bookstore> <book> <title>Harry Potter</title> </book> </bookstore>");22 String value = xPathUtils.evaluateAsString("/bookstore/book/title", document);23 System.out.println(value);24 }25}26public class XPathUtilsExample {27 public static void main(String[] args) {

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1public class 4 {2public static void main(String[] args) {3System.out.println(value);4}5}6public class 5 {7public static void main(String[] args) {8System.out.println(value);9}10}11public class 6 {12public static void main(String[] args) {

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1import org.w3c.dom.Document;2import org.w3c.dom.Node;3import com.consol.citrus.xml.xpath.XPathUtils;4import org.springframework.core.io.ClassPathResource;5import org.springframework.util.xml.DomUtils;6public class 4 {7 public static void main(String[] args) throws Exception {8 ClassPathResource resource = new ClassPathResource("com/consol/citrus/xml/xpath/test.xml");9 Document document = DomUtils.parseXmlDocument(resource.getInputStream());10 System.out.println(value);11 }12}13import org.w3c.dom.Document;14import org.w3c.dom.Node;15import com.consol.citrus.xml.xpath.XPathUtils;16import org.springframework.core.io.ClassPathResource;17import org.springframework.util.xml.DomUtils;18public class 5 {19 public static void main(String[] args) throws Exception {20 ClassPathResource resource = new ClassPathResource("com/consol/citrus/xml/xpath/test.xml");21 Document document = DomUtils.parseXmlDocument(resource.getInputStream());22 System.out.println(value);23 }24}25import org.w3c.dom.Document;26import org.w3c.dom.Node;27import com.consol.citrus.xml.xpath.XPathUtils;28import org.springframework.core.io.ClassPathResource;29import org.springframework.util.xml.DomUtils;30public class 6 {31 public static void main(String[] args) throws Exception {32 ClassPathResource resource = new ClassPathResource("com/consol/citrus/xml/xpath/test.xml");33 Document document = DomUtils.parseXmlDocument(resource.getInputStream());34 System.out.println(value);35 }36}

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.xml.xpath;2import org.springframework.core.io.ClassPathResource;3import org.springframework.core.io.Resource;4import org.springframework.util.Assert;5import org.w3c.dom.Document;6import org.w3c.dom.NodeList;7import org.xml.sax.InputSource;8import javax.xml.namespace.NamespaceContext;9import javax.xml.parsers.DocumentBuilder;10import javax.xml.parsers.DocumentBuilderFactory;11import javax.xml.xpath.XPath;12import javax.xml.xpath.XPathConstants;13import javax.xml.xpath.XPathExpression;14import javax.xml.xpath.XPathExpressionException;15import javax.xml.xpath.XPathFactory;16import java.io.IOException;17import java.io.InputStream;18import java.io.StringReader;19import java.util.HashMap;20import java.util.Map;21public final class XPathUtils {22 private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance();23 private static final XPathFactory XPATH_FACTORY = XPathFactory.newInstance();24 private XPathUtils() {25 DOCUMENT_BUILDER_FACTORY.setNamespaceAware(true);26 DOCUMENT_BUILDER_FACTORY.setIgnoringComments(true);27 DOCUMENT_BUILDER_FACTORY.setIgnoringElementContentWhitespace(true);28 }29 public static String evaluateAsString(String xmlDocument, String xPathExpression) {30 return evaluateAsString(xmlDocument, xPathExpression, null);31 }32 public static String evaluateAsString(String xmlDocument, String xPathExpression, NamespaceContext namespaceContext) {33 try {34 XPathExpression expression = compileXPathExpression(xPathExpression, namespaceContext);35 return expression.evaluate(parseDocument(xmlDocument));36 } catch (XPathExpressionException e) {37 throw new IllegalArgumentException("Invalid XPath expression", e);38 }39 }

Full Screen

Full Screen

XPathUtils

Using AI Code Generation

copy

Full Screen

1package com.consol.citrus.samples;2import com.consol.citrus.annotations.CitrusTest;3import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;4import com.consol.citrus.xml.xpath.XPathUtils;5import org.testng.annotations.Test;6public class XPathUtilsTest extends TestNGCitrusTestRunner {7 public void xpathUtilsTest() {8 variable("result", XPathUtils.evaluateAsText("<message><body>Hello World!</body></message>", "/message/body"));9 }10}11package com.consol.citrus.samples;12import com.consol.citrus.annotations.CitrusTest;13import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;14import com.consol.citrus.xml.xpath.XPathUtils;15import org.testng.annotations.Test;16public class XPathUtilsTest extends TestNGCitrusTestRunner {17 public void xpathUtilsTest() {18 variable("result", XPathUtils.evaluateAsText("<message><body>Hello World!</body></message>", "/message/body"));19 }20}21package com.consol.citrus.samples;22import com.consol.citrus.annotations.CitrusTest;23import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;24import com.consol.citrus.xml.xpath.XPathUtils;25import org.testng.annotations.Test;26public class XPathUtilsTest extends TestNGCitrusTestRunner {27 public void xpathUtilsTest() {28 variable("result", XPathUtils.evaluateAsText("<message><body>Hello World!</body></message>", "/message/body"));29 }30}

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.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful