How to use ByNumberPageElementsFilter method of org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter class

Best Webtau code snippet using org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter.ByNumberPageElementsFilter

Source:GenericPageElement.java Github

copy

Full Screen

...22import org.testingisdocumenting.webtau.browser.handlers.PageElementGetSkipValue;23import org.testingisdocumenting.webtau.browser.page.path.PageElementPath;24import org.testingisdocumenting.webtau.browser.page.path.PageElementsFilter;25import org.testingisdocumenting.webtau.browser.page.path.PageElementsFinder;26import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;27import org.testingisdocumenting.webtau.browser.page.path.filter.ByRegexpPageElementsFilter;28import org.testingisdocumenting.webtau.browser.page.path.filter.ByTextPageElementsFilter;29import org.testingisdocumenting.webtau.browser.page.path.finder.ByCssFinderPage;30import org.testingisdocumenting.webtau.browser.handlers.PageElementGetSetValueHandlers;31import org.testingisdocumenting.webtau.expectation.ActualPath;32import org.testingisdocumenting.webtau.reporter.StepReportOptions;33import org.testingisdocumenting.webtau.reporter.TokenizedMessage;34import org.testingisdocumenting.webtau.reporter.WebTauStepInput;35import org.testingisdocumenting.webtau.reporter.WebTauStepInputKeyValue;36import java.util.*;37import java.util.function.Function;38import java.util.function.Supplier;39import java.util.regex.Pattern;40import java.util.stream.Collectors;41import java.util.stream.IntStream;42import static org.testingisdocumenting.webtau.WebTauCore.*;43import static org.testingisdocumenting.webtau.browser.page.stale.StaleElementHandler.*;44import static org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder.*;45import static org.testingisdocumenting.webtau.reporter.WebTauStep.createAndExecuteStep;46import static org.testingisdocumenting.webtau.reporter.TokenizedMessage.tokenizedMessage;47public class GenericPageElement implements PageElement {48 private final WebDriver driver;49 private final AdditionalBrowserInteractions additionalBrowserInteractions;50 private final PageElementPath path;51 private final TokenizedMessage pathDescription;52 private final PageElementValue<Object> elementValue;53 private final PageElementValue<Integer> countValue;54 private final PageElementValue<Integer> scrollTopValue;55 private final PageElementValue<Integer> scrollLeftValue;56 private final PageElementValue<Integer> scrollHeight;57 private final PageElementValue<Integer> scrollWidth;58 private final PageElementValue<Integer> offsetHeight;59 private final PageElementValue<Integer> offsetWidth;60 private final PageElementValue<Integer> clientHeight;61 private final PageElementValue<Integer> clientWidth;62 private final boolean isMarkedAsAll;63 public GenericPageElement(WebDriver driver,64 AdditionalBrowserInteractions additionalBrowserInteractions,65 PageElementPath path,66 boolean isMarkedAsAll) {67 this.driver = driver;68 this.additionalBrowserInteractions = additionalBrowserInteractions;69 this.path = path;70 this.pathDescription = path.describe();71 this.isMarkedAsAll = isMarkedAsAll;72 this.elementValue = new PageElementValue<>(this, "value", this::getUnderlyingValue);73 this.countValue = new PageElementValue<>(this, "count", this::getNumberOfElements);74 this.scrollTopValue = new PageElementValue<>(this, "scrollTop", fetchIntElementPropertyFunc("scrollTop"));75 this.scrollLeftValue = new PageElementValue<>(this, "scrollLeft", fetchIntElementPropertyFunc("scrollLeft"));76 this.scrollHeight = new PageElementValue<>(this, "scrollHeight", fetchIntElementPropertyFunc("scrollHeight"));77 this.scrollWidth = new PageElementValue<>(this, "scrollWidth", fetchIntElementPropertyFunc("scrollWidth"));78 this.offsetHeight = new PageElementValue<>(this, "offsetHeight", fetchIntElementPropertyFunc("offsetHeight"));79 this.offsetWidth = new PageElementValue<>(this, "offsetWidth", fetchIntElementPropertyFunc("offsetWidth"));80 this.clientHeight = new PageElementValue<>(this, "clientHeight", fetchIntElementPropertyFunc("clientHeight"));81 this.clientWidth = new PageElementValue<>(this, "clientWidth", fetchIntElementPropertyFunc("clientWidth"));82 }83 @Override84 public PageElementValue<Integer> getCount() {85 return countValue;86 }87 @Override88 public PageElementValue<Integer> getScrollTop() {89 return scrollTopValue;90 }91 @Override92 public PageElementValue<Integer> getScrollLeft() {93 return scrollLeftValue;94 }95 @Override96 public PageElementValue<Integer> getScrollHeight() {97 return scrollHeight;98 }99 @Override100 public PageElementValue<Integer> getScrollWidth() {101 return scrollWidth;102 }103 @Override104 public PageElementValue<Integer> getOffsetHeight() {105 return offsetHeight;106 }107 @Override108 public PageElementValue<Integer> getOffsetWidth() {109 return offsetWidth;110 }111 @Override112 public PageElementValue<Integer> getClientHeight() {113 return clientHeight;114 }115 @Override116 public PageElementValue<Integer> getClientWidth() {117 return clientWidth;118 }119 @Override120 public ActualPath actualPath() {121 return createActualPath("pageElement");122 }123 @Override124 public TokenizedMessage describe() {125 return pathDescription;126 }127 @Override128 public void highlight() {129 additionalBrowserInteractions.flashWebElements(findElements());130 }131 public void click() {132 execute(tokenizedMessage(action("clicking")).add(pathDescription),133 () -> tokenizedMessage(action("clicked")).add(pathDescription),134 () -> findElement().click());135 }136 @Override137 public void shiftClick() {138 clickWithKey("shift", Keys.SHIFT);139 }140 @Override141 public void controlClick() {142 clickWithKey("control", Keys.CONTROL);143 }144 @Override145 public void commandClick() {146 clickWithKey("command", Keys.COMMAND);147 }148 @Override149 public void altClick() {150 clickWithKey("alt", Keys.ALT);151 }152 @Override153 public void rightClick() {154 execute(tokenizedMessage(action("right clicking")).add(pathDescription),155 () -> tokenizedMessage(action("right clicked")).add(pathDescription),156 () -> performActions("right click", Actions::contextClick));157 }158 @Override159 public void doubleClick() {160 execute(tokenizedMessage(action("double clicking")).add(pathDescription),161 () -> tokenizedMessage(action("double clicked")).add(pathDescription),162 () -> performActions("double click", Actions::doubleClick));163 }164 @Override165 public void hover() {166 execute(tokenizedMessage(action("moving mouse over")).add(pathDescription),167 () -> tokenizedMessage(action("moved mouse over")).add(pathDescription),168 () -> performActions("hover", Actions::moveToElement));169 }170 public WebElement findElement() {171 List<WebElement> webElements = findElements();172 return webElements.isEmpty() ? createNullElement() : webElements.get(0);173 }174 @Override175 public List<WebElement> findElements() {176 return path.find(driver);177 }178 @Override179 public PageElementValue<Object> elementValue() {180 return elementValue;181 }182 @Override183 public PageElementValue<List<Object>> elementValues() {184 return new PageElementValue<>(this, "all values", this::extractValues);185 }186 @Override187 public PageElement all() {188 return new GenericPageElement(driver, additionalBrowserInteractions, path, true);189 }190 @Override191 public boolean isMarkedAsAll() {192 return isMarkedAsAll;193 }194 @Override195 public void setValue(Object value) {196 execute(tokenizedMessage(action("setting value"), stringValue(value), TO).add(pathDescription),197 () -> tokenizedMessage(action("set value"), stringValue(value), TO).add(pathDescription),198 () -> setValueBasedOnType(value));199 }200 @Override201 public void sendKeys(CharSequence keys) {202 String renderedKeys = BrowserKeysRenderer.renderKeys(keys);203 execute(tokenizedMessage(action("sending keys"), stringValue(renderedKeys), TO).add(pathDescription),204 () -> tokenizedMessage(action("sent keys"), stringValue(renderedKeys), TO).add(pathDescription),205 () -> findElement().sendKeys(keys));206 }207 @Override208 public void clear() {209 execute(tokenizedMessage(action("clearing")).add(pathDescription),210 () -> tokenizedMessage(action("cleared")).add(pathDescription),211 () -> findElement().clear());212 }213 @Override214 public void dragAndDropOver(PageElement target) {215 execute(tokenizedMessage(action("dragging")).add(pathDescription).add(OVER).add(target.locationDescription()),216 () -> tokenizedMessage(action("dropped")).add(pathDescription).add(OVER).add(target.locationDescription()),217 () -> dragAndDropOverStep(target));218 }219 @Override220 public void dragAndDropBy(int offsetX, int offsetY) {221 execute(tokenizedMessage(action("dragging")).add(pathDescription),222 aMapOf("offsetX", offsetX, "offsetY", offsetY),223 () -> tokenizedMessage(action("dropped")).add(pathDescription),224 () -> dragAndDropByStep(offsetX, offsetY));225 }226 @Override227 public PageElement find(String css) {228 return find(new ByCssFinderPage(css));229 }230 @Override231 public PageElement find(PageElementsFinder finder) {232 return withFinder(finder);233 }234 @Override235 public PageElement get(String text) {236 return withFilter(new ByTextPageElementsFilter(additionalBrowserInteractions, text));237 }238 @Override239 public PageElement get(int number) {240 return withFilter(new ByNumberPageElementsFilter(number));241 }242 @Override243 public PageElement get(Pattern regexp) {244 return withFilter(new ByRegexpPageElementsFilter(additionalBrowserInteractions, regexp));245 }246 @Override247 public boolean isVisible() {248 return getValueForStaleElement(() -> findElement().isDisplayed(), false);249 }250 @Override251 public boolean isEnabled() {252 return getValueForStaleElement(() -> findElement().isEnabled(), false);253 }254 @Override...

Full Screen

Full Screen

Source:ByNumberPageElementsFilter.java Github

copy

Full Screen

...22import java.util.List;23import static org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder.selectorType;24import static org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder.selectorValue;25import static org.testingisdocumenting.webtau.reporter.TokenizedMessage.tokenizedMessage;26public class ByNumberPageElementsFilter implements PageElementsFilter {27 private final int number;28 public ByNumberPageElementsFilter(int number) {29 this.number = number;30 }31 @Override32 public List<WebElement> filter(List<WebElement> original) {33 return (number > 0 && number <= original.size()) ?34 Collections.singletonList(original.get(number - 1)):35 Collections.emptyList();36 }37 @Override38 public TokenizedMessage description() {39 return tokenizedMessage(selectorType("element number"), selectorValue(String.valueOf(number)));40 }41}...

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1package org.testingisdocumenting.webtau.browser.page.path.filter;2import org.testingisdocumenting.webtau.Ddjt;3import org.testingisdocumenting.webtau.browser.Browser;4import org.testingisdocumenting.webtau.browser.page.PageElement;5import org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder;6import org.testingisdocumenting.webtau.reporter.TokenizedMessage;7import java.util.List;8public class ByNumberPageElementsFilter implements PageElementsFilter {9 private final int number;10 public ByNumberPageElementsFilter(int number) {11 this.number = number;12 }13 public List<PageElement> filter(List<PageElement> elements) {14 if (number < 0 || number >= elements.size()) {15 throw new RuntimeException("number is out of bounds: " + number + ", size: " + elements.size());16 }17 return List.of(elements.get(number));18 }19 public TokenizedMessage describe() {20 return IntegrationTestsMessageBuilder.createMessage()21 .token("by number: ")22 .token(number)23 .build();24 }25}26package org.testingisdocumenting.webtau.browser.page.path.filter;27import org.testingisdocumenting.webtau.Ddjt;28import org.testingisdocumenting.webtau.browser.Browser;29import org.testingisdocumenting.webtau.browser.page.PageElement;30import org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder;31import org.testingisdocumenting.webtau.reporter.TokenizedMessage;32import java.util.List;33import java.util.stream.Collectors;34public class ByTextPageElementsFilter implements PageElementsFilter {35 private final String text;36 public ByTextPageElementsFilter(String text) {37 this.text = text;38 }39 public List<PageElement> filter(List<PageElement> elements) {40 return elements.stream()41 .filter(e -> e.text().equals(text))42 .collect(Collectors.toList());43 }44 public TokenizedMessage describe() {45 return IntegrationTestsMessageBuilder.createMessage()46 .token("by text: ")47 .token(text)48 .build();49 }50}

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1package org.testingisdocumenting.webtau.tutorials;2import org.testingisdocumenting.webtau.Ddjt;3import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;4import org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder;5public class ByNumberPageElementsFilterExample {6 public static void main(String[] args) {7 IntegrationTestsMessageBuilder messageBuilder = Ddjt.messageBuilder();8 messageBuilder.put("all links", Ddjt.page().links().all());9 messageBuilder.put("first link", Ddjt.page().links().byNumber(0));10 messageBuilder.put("second link", Ddjt.page().links().byNumber(1));11 messageBuilder.put("last link", Ddjt.page().links().byNumber(-1));12 messageBuilder.put("second last link", Ddjt.page().links().byNumber(-2));13 messageBuilder.put("third last link", Ddjt.page().links().byNumber(-3));14 messageBuilder.put("third link", Ddjt.page().links().byNumber(2));15 messageBuilder.put("third last link", Ddjt.page().links().byNumber(-3));16 messageBuilder.put("fourth last link", Ddjt.page().links().byNumber(-4));17 messageBuilder.put("fifth last link", Ddjt.page().links().byNumber(-5));18 messageBuilder.put("sixth last link", Ddjt.page().links().byNumber(-6));19 messageBuilder.put("seventh last link", Ddjt.page().links().byNumber(-7));20 messageBuilder.put("eighth last link", Ddjt.page().links().byNumber(-8));21 messageBuilder.put("ninth last link", Ddjt.page().links().byNumber(-9));22 messageBuilder.put("tenth last link", Ddjt.page().links().byNumber(-10));23 messageBuilder.put("tenth link", Ddjt.page().links().byNumber(9));24 messageBuilder.put("eleventh link", Ddjt.page().links().byNumber(10));25 messageBuilder.put("twelfth link", Ddjt.page().links().byNumber(11));26 messageBuilder.put("thirteenth link", Ddjt.page().links().byNumber

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1import org.junit.Test;2import org.testingisdocumenting.webtau.Ddjt;3import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;4public class ByNumberPageElementsFilterTest {5 public void byNumberPageElementsFilterTest() {6 Ddjt.page("iframe").click();7 Ddjt.page("select").select(ByNumberPageElementsFilter.byNumber(2), "Volvo");8 Ddjt.page("select").select(ByNumberPageElementsFilter.byNumber(3), "Saab");9 Ddjt.page("select").select(ByNumberPageElementsFilter.byNumber(4), "Mercedes");10 Ddjt.page("select").select(ByNumberPageElementsFilter.byNumber(5), "Audi");11 }12}13import org.junit.Test;14import org.testingisdocumenting.webtau.Ddjt;15import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;16public class ByNumberPageElementsFilterTest {17 public void byNumberPageElementsFilterTest() {18 Ddjt.page("iframe").click();19 Ddjt.page("select").select(ByNumberPageElementsFilter.byNumber(2, 3, 4, 5), "Volvo", "Saab", "Mercedes", "Audi");20 }21}22import org.junit.Test;23import org.testingisdocumenting.webtau.Ddjt;24import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;25public class ByNumberPageElementsFilterTest {26 public void byNumberPageElementsFilterTest() {

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;2import org.testingisdocumenting.webtau.Ddjt;3import org.testingisdocumenting.webtau.browser.page.PageElement;4import org.testingisdocumenting.webtau.browser.page.PageElementLocation;5import org.testingisdocumenting.webtau.browser.page.PageElementLocationType;6import org.testingisdocumenting.webtau.browser.page.PageElements;7import org.testingisdocumenting.webtau.browser.page.PageLocation;8import org.testingisdocumenting.webtau.browser.page.PageLocationType;9import org.testingisdocumenting.webtau.browser.page.PageLocationValue;10import org.testingisdocumenting.webtau.browser.page.PageLocationValueList;11import org.testingisdocumenting.webtau.browser.page.PageLocationValueMap;12import org.testingisdocumenting.webtau.browser.page.PageLocationValueType;13import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueType;14import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueType;15import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueType;16import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueValueType;17import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueValueValueType;18import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueValueValueValueType;19import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueValueValueValueValueType;20import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueValueValueValueValueValueType;21import org.testingisdocumenting.webtau.browser.page.PageLocationValueValueValueValueValueValueValueValueValueValueType;22import org.testingisdocumenting.webtau.browser.page.PageLocationVal

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1package com.webtau;2import org.testingisdocumenting.webtau.Ddjt;3import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;4import org.testingisdocumenting.webtau.http.Http;5import org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder;6public class WebTau {7 public static void main(String[] args) {8 IntegrationTestsMessageBuilder messageBuilder = Ddjt.createMessageBuilder();9 messageBuilder.addActual("actual", ByNumberPageElementsFilter.byNumber(1).filter(Ddjt.page().get("/html/body/div/div[2]/div/div[1]/div")));10 messageBuilder.addActual("actual", ByNumberPageElementsFilter.byNumber(2).filter(Ddjt.page().get("/html/body/div/div[2]/div/div[1]/div")));11 messageBuilder.addActual("actual", ByNumberPageElementsFilter.byNumber(3).filter(Ddjt.page().get("/html/body/div/div[2]/div/div[1]/div")));12 Ddjt.report(messageBuilder);13 }14}15Filter page elements by their number. For example, to select the second element from the list of elements, use ByNumberPageElementsFilter.byNumber(2)16public static class ByNumberPageElementsFilter implements PageElementsFilter {17 private final int number;18 public static ByNumberPageElementsFilter byNumber(int number) {19 return new ByNumberPageElementsFilter(number);20 }21 private ByNumberPageElementsFilter(int number) {22 this.number = number;23 }24 public List<PageElement> filter(List<PageElement> elements) {25 return elements.stream()26 .filter(e -> e.getNumber() == number)27 .collect(Collectors.toList());28 }29}30ByNumberPageElementsFilter.byNumber(int number) method31public static ByNumberPageElementsFilter byNumber(int number) {32 return new ByNumberPageElementsFilter(number);33}34ByNumberPageElementsFilter(int number) constructor35private ByNumberPageElementsFilter(int number) {36 this.number = number;37}

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1import org.testingisdocumenting.webtau.browser.page.path.filter.ByNumberPageElementsFilter;2import org.testingisdocumenting.webtau.Ddjt;3import org.testingisdocumenting.webtau.expectation.ActualPathValueExpectationHandler;4import org.testingisdocumenting.webtau.expectation.ActualValueExpectationHandler;5import org.testingisdocumenting.webtau.expectation.PathValueExpectationHandler;6import org.testingisdocumenting.webtau.expectation.ValueExpectationHandler;7import org.testingisdocumenting.webtau.expectation.ActualPathValueExpectationHandler;8import org.testingisdocumenting.webtau.expectation.PathValueExpectationHandler;9import org.testingisdocumenting.webtau.expectation.ActualValueExpectationHandler;10import org.testingisdocumenting.webtau.expectation.ValueExpectationHandler;11import org.testingisdocumenting.webtau.reporter.IntegrationTestsMessageBuilder;12import org.testingisdocumenting.webtau.reporter.TokenizedMessage;13import org.testingisdocumenting.webtau.reporter.WebTauStep;14import org.testingisdocumenting.webtau.reporter.WebTauStepInput;15import org.testingisdocumenting.webtau.reporter.WebTauStepOutput;16import org.testingisdocumenting.webtau.reporter.WebTauStepPayload;17import org.testingisdocumenting.webtau.reporter.WebTauStepPayloadEntry;18import org.testingisdocumenting.webtau.reporter.WebTauStepPayloadEntryType;19import org.testingisdocumenting.webtau.reporter.WebTauStepPayloadType;20import org.testingisdocumenting.webtau.reporter.WebTauStepPayloadValue;21import org.testingisdocumenting.webtau.reporter.WebTauStepReportOptions;22import org.testingisdocumenting.webtau.reporter.WebTauStepReportOptionsBuilder;23import org.testingisdocumenting.webtau.reporter.WebTauStepReporter;24import org.testingisdocumenting.webtau.reporter.WebTauStepReporterOptions;25import

Full Screen

Full Screen

ByNumberPageElementsFilter

Using AI Code Generation

copy

Full Screen

1public class ByNumberPageElementsFilterExample {2 public static void main(String[] args) {3 BrowserPage page = browser.page();4 BrowserPageElement button = page.get("button", ByNumberPageElementsFilter.byNumber(2));5 button.click();6 BrowserPageElement paragraph = page.get("p", ByNumberPageElementsFilter.byNumber(3));7 paragraph.click();8 }9}10public class ByTextPageElementsFilterExample {11 public static void main(String[] args) {12 BrowserPage page = browser.page();13 BrowserPageElement button = page.get("button", ByTextPageElementsFilter.byText("Click Me"));14 button.click();15 BrowserPageElement paragraph = page.get("p", ByTextPageElementsFilter.byText("I am a paragraph"));16 paragraph.click();17 }18}19public class ByTextPageElementsFilterExample {20 public static void main(String[] args) {21 BrowserPage page = browser.page();22 BrowserPageElement button = page.get("button", ByTextPageElementsFilter.byTextContaining("Click"));23 button.click();24 BrowserPageElement paragraph = page.get("p", ByTextPageElementsFilter.byTextContaining("paragraph"));25 paragraph.click();26 }27}28public class ByTextPageElementsFilterExample {29 public static void main(String[] args) {

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 Webtau automation tests on LambdaTest cloud grid

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

Most used method in ByNumberPageElementsFilter

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful