How to use submit method of com.intuit.karate.driver.DriverElement class

Best Karate code snippet using com.intuit.karate.driver.DriverElement.submit

Source:DevToolsDriver.java Github

copy

Full Screen

...67 protected String sessionId;68 protected boolean domContentEventFired;69 protected final Set<String> framesStillLoading = new HashSet();70 private final Map<String, String> frameSessions = new HashMap();71 private boolean submit;72 protected String currentDialogText;73 private int nextId;74 public int nextId() {75 return ++nextId;76 }77 private MockHandler mockHandler;78 protected final Logger logger;79 protected DevToolsDriver(DriverOptions options, Command command, String webSocketUrl) {80 logger = options.driverLogger;81 this.options = options;82 this.command = command;83 this.wait = new DevToolsWait(this, options);84 int pos = webSocketUrl.lastIndexOf('/');85 rootFrameId = webSocketUrl.substring(pos + 1);86 logger.debug("root frame id: {}", rootFrameId);87 wsOptions = new WebSocketOptions(webSocketUrl);88 wsOptions.setMaxPayloadSize(options.maxPayloadSize);89 wsOptions.setTextConsumer(text -> {90 if (logger.isTraceEnabled()) {91 logger.trace("<< {}", text);92 } else {93 // to avoid swamping the console when large base64 encoded binary responses happen94 logger.debug("<< {}", StringUtils.truncate(text, 1024, true));95 }96 Map<String, Object> map = Json.of(text).value();97 DevToolsMessage dtm = new DevToolsMessage(this, map);98 receive(dtm);99 });100 client = new WebSocketClient(wsOptions, logger);101 }102 public void reconnect(String url) {103 if (client != null) {104 client.close();105 }106 WebSocketOptions newWsOptions = new WebSocketOptions(url);107 newWsOptions.setMaxPayloadSize(wsOptions.getMaxPayloadSize());108 newWsOptions.setTextHandler(wsOptions.getTextHandler());109 wsOptions = newWsOptions;110 client = new WebSocketClient(wsOptions, logger);111 }112 @Override113 public Driver timeout(Integer millis) {114 options.setTimeout(millis);115 return this;116 }117 @Override118 public Driver timeout() {119 return timeout(null);120 }121 public DevToolsMessage method(String method) {122 return new DevToolsMessage(this, method);123 }124 // this can be used for exploring / sending any raw message !125 public Map<String, Object> send(Map<String, Object> map) {126 DevToolsMessage dtm = new DevToolsMessage(this, map);127 dtm.setId(nextId());128 return sendAndWait(dtm, null).toMap();129 }130 public void send(DevToolsMessage dtm) {131 String json = JsonUtils.toJson(dtm.toMap());132 logger.debug(">> {}", json);133 client.send(json);134 }135 public DevToolsMessage sendAndWait(DevToolsMessage dtm, Predicate<DevToolsMessage> condition) {136 boolean wasSubmit = submit;137 if (condition == null && submit) {138 submit = false;139 condition = DevToolsWait.ALL_FRAMES_LOADED;140 }141 // do stuff inside wait to avoid missing messages142 DevToolsMessage result = wait.send(dtm, condition);143 if (result == null && !wasSubmit) {144 throw new RuntimeException("failed to get reply for: " + dtm);145 }146 return result;147 }148 public void receive(DevToolsMessage dtm) {149 if (dtm.methodIs("Page.domContentEventFired")) {150 domContentEventFired = true;151 logger.trace("** set dom ready flag to true");152 }153 if (dtm.methodIs("Page.javascriptDialogOpening")) {154 currentDialogText = dtm.getParam("message");155 // this will stop waiting NOW156 wait.setCondition(DevToolsWait.DIALOG_OPENING);157 }158 if (dtm.methodIs("Page.frameStartedLoading")) {159 String frameLoadingId = dtm.getParam("frameId");160 if (rootFrameId.equals(frameLoadingId)) { // root page is loading161 domContentEventFired = false;162 framesStillLoading.clear();163 frameSessions.clear();164 logger.trace("** root frame started loading, cleared all page state: {}", frameLoadingId);165 } else {166 framesStillLoading.add(frameLoadingId);167 logger.trace("** frame started loading, added to in-progress list: {}", framesStillLoading);168 }169 }170 if (dtm.methodIs("Page.frameStoppedLoading")) {171 String frameLoadedId = dtm.getParam("frameId");172 framesStillLoading.remove(frameLoadedId);173 logger.trace("** frame stopped loading: {}, remaining in-progress: {}", frameLoadedId, framesStillLoading);174 }175 if (dtm.methodIs("Target.attachedToTarget")) {176 frameSessions.put(dtm.getParam("targetInfo.targetId"), dtm.getParam("sessionId"));177 logger.trace("** added frame session: {}", frameSessions);178 }179 if (dtm.methodIs("Fetch.requestPaused")) {180 handleInterceptedRequest(dtm);181 }182 // all needed state is set above before we get into conditional checks183 wait.receive(dtm);184 }185 private void handleInterceptedRequest(DevToolsMessage dtm) {186 String requestId = dtm.getParam("requestId");187 String requestUrl = dtm.getParam("request.url");188 if (mockHandler != null) {189 String method = dtm.getParam("request.method");190 Map<String, String> headers = dtm.getParam("request.headers");191 String postData = dtm.getParam("request.postData");192 logger.debug("intercepting request for url: {}", requestUrl);193 HttpRequest request = new HttpRequest();194 request.setUrl(requestUrl);195 request.setMethod(method);196 headers.forEach((k, v) -> request.putHeader(k, v));197 if (postData != null) {198 request.setBody(FileUtils.toBytes(postData));199 } else {200 request.setBody(Constants.ZERO_BYTES);201 }202 Response response = mockHandler.handle(request.toRequest());203 String responseBody = response.getBody() == null ? "" : Base64.getEncoder().encodeToString(response.getBody());204 List<Map> responseHeaders = new ArrayList();205 Map<String, List<String>> map = response.getHeaders();206 if (map != null) {207 map.forEach((k, v) -> {208 if (v != null && !v.isEmpty()) {209 Map<String, Object> nv = new HashMap(2);210 nv.put("name", k);211 nv.put("value", v.get(0));212 responseHeaders.add(nv);213 }214 });215 }216 method("Fetch.fulfillRequest")217 .param("requestId", requestId)218 .param("responseCode", response.getStatus())219 .param("responseHeaders", responseHeaders)220 .param("body", responseBody).sendWithoutWaiting();221 } else {222 logger.warn("no mock server, continuing paused request to url: {}", requestUrl);223 method("Fetch.continueRequest").param("requestId", requestId).sendWithoutWaiting();224 }225 }226 //==========================================================================227 //228 private DevToolsMessage evalOnce(String expression, boolean quickly, boolean fireAndForget) {229 DevToolsMessage toSend = method("Runtime.evaluate")230 .param("expression", expression).param("returnByValue", true);231 if (executionContextId != null) {232 toSend.param("contextId", executionContextId);233 }234 if (quickly) {235 toSend.setTimeout(options.getRetryInterval());236 }237 if (fireAndForget) {238 toSend.sendWithoutWaiting();239 return null;240 }241 return toSend.send();242 }243 protected DevToolsMessage eval(String expression) {244 return eval(expression, false);245 }246 private DevToolsMessage eval(String expression, boolean quickly) {247 DevToolsMessage dtm = evalOnce(expression, quickly, false);248 if (dtm.isResultError()) {249 String message = "js eval failed once:" + expression250 + ", error: " + dtm.getResult().getAsString();251 logger.warn(message);252 options.sleep();253 dtm = evalOnce(expression, quickly, false); // no wait condition for the re-try254 if (dtm.isResultError()) {255 message = "js eval failed twice:" + expression256 + ", error: " + dtm.getResult().getAsString();257 logger.error(message);258 throw new RuntimeException(message);259 }260 }261 return dtm;262 }263 protected void retryIfEnabled(String locator) {264 if (options.isRetryEnabled()) {265 waitFor(locator); // will throw exception if not found266 }267 if (options.highlight) {268 // highlight(locator, options.highlightDuration); // instead of this269 String highlightJs = options.highlight(locator, options.highlightDuration);270 evalOnce(highlightJs, true, true); // do it safely, i.e. fire and forget271 }272 }273 protected int getRootNodeId() {274 return method("DOM.getDocument").param("depth", 0).send().getResult("root.nodeId", Integer.class);275 }276 @Override277 public Integer elementId(String locator) {278 DevToolsMessage dtm = method("DOM.querySelector")279 .param("nodeId", getRootNodeId())280 .param("selector", locator).send();281 if (dtm.isResultError()) {282 return null;283 }284 return dtm.getResult("nodeId").getAsInt();285 }286 @Override287 public List elementIds(String locator) {288 if (locator.startsWith("/")) { // special handling for xpath289 getRootNodeId(); // just so that DOM.getDocument is called else DOM.performSearch fails290 DevToolsMessage dtm = method("DOM.performSearch").param("query", locator).send();291 String searchId = dtm.getResult("searchId", String.class);292 int resultCount = dtm.getResult("resultCount", Integer.class);293 dtm = method("DOM.getSearchResults")294 .param("searchId", searchId)295 .param("fromIndex", 0).param("toIndex", resultCount).send();296 return dtm.getResult("nodeIds", List.class);297 }298 DevToolsMessage dtm = method("DOM.querySelectorAll")299 .param("nodeId", getRootNodeId())300 .param("selector", locator).send();301 if (dtm.isResultError()) {302 return Collections.EMPTY_LIST;303 }304 return dtm.getResult("nodeIds").getValue();305 }306 @Override307 public DriverOptions getOptions() {308 return options;309 }310 @Override311 public void activate() {312 method("Target.activateTarget").param("targetId", rootFrameId).send();313 }314 protected void initWindowIdAndState() {315 DevToolsMessage dtm = method("Browser.getWindowForTarget").param("targetId", rootFrameId).send();316 if (!dtm.isResultError()) {317 windowId = dtm.getResult("windowId").getValue();318 windowState = (String) dtm.getResult("bounds").<Map> getValue().get("windowState");319 }320 }321 @Override322 public Map<String, Object> getDimensions() {323 DevToolsMessage dtm = method("Browser.getWindowForTarget").param("targetId", rootFrameId).send();324 Map<String, Object> map = dtm.getResult("bounds").getValue();325 Integer x = (Integer) map.remove("left");326 Integer y = (Integer) map.remove("top");327 map.put("x", x);328 map.put("y", y);329 return map;330 }331 @Override332 public void setDimensions(Map<String, Object> map) {333 Integer left = (Integer) map.remove("x");334 Integer top = (Integer) map.remove("y");335 map.put("left", left);336 map.put("top", top);337 Map temp = getDimensions();338 temp.putAll(map);339 temp.remove("windowState");340 method("Browser.setWindowBounds")341 .param("windowId", windowId)342 .param("bounds", temp).send();343 }344 public void emulateDevice(int width, int height, String userAgent) {345 logger.info("Setting deviceMetrics width={}, height={}, userAgent={}", width, height, userAgent);346 method("Network.setUserAgentOverride").param("userAgent", userAgent).send();347 method("Emulation.setDeviceMetricsOverride")348 .param("width", width)349 .param("height", height)350 .param("deviceScaleFactor", 1)351 .param("mobile", true)352 .send();353 }354 @Override355 public void close() {356 method("Page.close").sendWithoutWaiting();357 }358 @Override359 public void quit() {360 if (terminated) {361 return;362 }363 terminated = true;364 // don't wait, may fail and hang365 method("Target.closeTarget").param("targetId", rootFrameId).sendWithoutWaiting();366 // method("Browser.close").send();367 client.close();368 if (command != null) {369 command.close(true);370 }371 }372 @Override373 public boolean isTerminated() {374 return terminated;375 }376 @Override377 public void setUrl(String url) {378 method("Page.navigate").param("url", url)379 .send(DevToolsWait.ALL_FRAMES_LOADED);380 }381 @Override382 public void refresh() {383 method("Page.reload").send(DevToolsWait.ALL_FRAMES_LOADED);384 }385 @Override386 public void reload() {387 method("Page.reload").param("ignoreCache", true).send();388 }389 private void history(int delta) {390 DevToolsMessage dtm = method("Page.getNavigationHistory").send();391 int currentIndex = dtm.getResult("currentIndex").getValue();392 List<Map> list = dtm.getResult("entries").getValue();393 int targetIndex = currentIndex + delta;394 if (targetIndex < 0 || targetIndex == list.size()) {395 return;396 }397 Map<String, Object> entry = list.get(targetIndex);398 Integer id = (Integer) entry.get("id");399 method("Page.navigateToHistoryEntry").param("entryId", id).send(DevToolsWait.ALL_FRAMES_LOADED);400 }401 @Override402 public void back() {403 history(-1);404 }405 @Override406 public void forward() {407 history(1);408 }409 private void setWindowState(String state) {410 if (!"normal".equals(windowState)) {411 method("Browser.setWindowBounds")412 .param("windowId", windowId)413 .param("bounds", Collections.singletonMap("windowState", "normal"))414 .send();415 windowState = "normal";416 }417 if (!state.equals(windowState)) {418 method("Browser.setWindowBounds")419 .param("windowId", windowId)420 .param("bounds", Collections.singletonMap("windowState", state))421 .send();422 windowState = state;423 }424 }425 @Override426 public void maximize() {427 setWindowState("maximized");428 }429 @Override430 public void minimize() {431 setWindowState("minimized");432 }433 @Override434 public void fullscreen() {435 setWindowState("fullscreen");436 }437 @Override438 public Element click(String locator) {439 retryIfEnabled(locator);440 eval(DriverOptions.selector(locator) + ".click()");441 return DriverElement.locatorExists(this, locator);442 }443 @Override444 public Element select(String locator, String text) {445 retryIfEnabled(locator);446 eval(options.optionSelector(locator, text));447 return DriverElement.locatorExists(this, locator);448 }449 @Override450 public Element select(String locator, int index) {451 retryIfEnabled(locator);452 eval(options.optionSelector(locator, index));453 return DriverElement.locatorExists(this, locator);454 }455 @Override456 public Driver submit() {457 submit = true;458 return this;459 }460 @Override461 public Element focus(String locator) {462 retryIfEnabled(locator);463 eval(options.focusJs(locator));464 return DriverElement.locatorExists(this, locator);465 }466 @Override467 public Element clear(String locator) {468 eval(DriverOptions.selector(locator) + ".value = ''");469 return DriverElement.locatorExists(this, locator);470 }471 private void sendKey(char c, int modifiers, String type, Integer keyCode) {472 DevToolsMessage dtm = method("Input.dispatchKeyEvent")473 .param("modifiers", modifiers)474 .param("type", type);475 if (keyCode == null) {476 dtm.param("text", c + "");477 } else {478 switch (keyCode) {479 case 13:480 dtm.param("text", "\r"); // important ! \n does NOT work for chrome481 break;482 case 9: // TAB483 if ("char".equals(type)) {484 return; // special case485 }486 dtm.param("text", "");487 break;488 case 46: // DOT489 if ("rawKeyDown".equals(type)) {490 dtm.param("type", "keyDown"); // special case491 }492 dtm.param("text", ".");493 break;494 default:495 dtm.param("text", c + "");496 }497 dtm.param("windowsVirtualKeyCode", keyCode);498 }499 dtm.send();500 }501 @Override502 public Element input(String locator, String value) {503 retryIfEnabled(locator);504 // focus505 eval(options.focusJs(locator));506 Input input = new Input(value);507 while (input.hasNext()) {508 char c = input.next();509 int modifiers = input.getModifierFlags();510 Integer keyCode = Keys.code(c);511 if (keyCode != null) {512 sendKey(c, modifiers, "rawKeyDown", keyCode);513 sendKey(c, modifiers, "char", keyCode);514 sendKey(c, modifiers, "keyUp", keyCode);515 } else {516 logger.warn("unknown character / key code: {}", c);517 sendKey(c, modifiers, "char", null);518 }519 }520 return DriverElement.locatorExists(this, locator);521 }522 protected int currentMouseXpos;523 protected int currentMouseYpos;524 @Override525 public void actions(List<Map<String, Object>> sequence) {526 boolean submitRequested = submit;527 submit = false; // make sure only LAST action is handled as a submit()528 for (Map<String, Object> map : sequence) {529 List<Map<String, Object>> actions = (List) map.get("actions");530 if (actions == null) {531 logger.warn("no actions property found: {}", sequence);532 return;533 }534 Iterator<Map<String, Object>> iterator = actions.iterator();535 while (iterator.hasNext()) {536 Map<String, Object> action = iterator.next();537 String type = (String) action.get("type");538 if (type == null) {539 logger.warn("no type property found: {}", action);540 continue;541 }542 String chromeType;543 switch (type) {544 case "pointerMove":545 chromeType = "mouseMoved";546 break;547 case "pointerDown":548 chromeType = "mousePressed";549 break;550 case "pointerUp":551 chromeType = "mouseReleased";552 break;553 default:554 logger.warn("unexpected action type: {}", action);555 continue;556 }557 Integer x = (Integer) action.get("x");558 Integer y = (Integer) action.get("y");559 if (x != null) {560 currentMouseXpos = x;561 }562 if (y != null) {563 currentMouseYpos = y;564 }565 Integer duration = (Integer) action.get("duration");566 DevToolsMessage toSend = method("Input.dispatchMouseEvent")567 .param("type", chromeType)568 .param("x", currentMouseXpos).param("y", currentMouseYpos);569 if ("mousePressed".equals(chromeType) || "mouseReleased".equals(chromeType)) {570 toSend.param("button", "left").param("clickCount", 1);571 }572 if (!iterator.hasNext() && submitRequested) {573 submit = true;574 }575 toSend.send();576 if (duration != null) {577 options.sleep(duration);578 }579 }580 }581 }582 @Override583 public String text(String id) {584 return property(id, "textContent");585 }586 @Override587 public String html(String id) {588 return property(id, "outerHTML");589 }590 @Override591 public String value(String locator) {592 return property(locator, "value");593 }594 @Override595 public Element value(String locator, String value) {596 retryIfEnabled(locator);597 eval(DriverOptions.selector(locator) + ".value = '" + value + "'");598 return DriverElement.locatorExists(this, locator);599 }600 @Override601 public String attribute(String id, String name) {602 retryIfEnabled(id);603 DevToolsMessage dtm = eval(DriverOptions.selector(id) + ".getAttribute('" + name + "')");604 return dtm.getResult().getAsString();605 }606 @Override607 public String property(String id, String name) {608 retryIfEnabled(id);609 DevToolsMessage dtm = eval(DriverOptions.selector(id) + "['" + name + "']");610 return dtm.getResult().getAsString();611 }612 @Override613 public boolean enabled(String id) {614 retryIfEnabled(id);615 DevToolsMessage dtm = eval(DriverOptions.selector(id) + ".disabled");616 return !dtm.getResult().isTrue();617 }618 @Override619 public boolean waitUntil(String expression) {620 return options.retry(() -> {621 try {622 return eval(expression, true).getResult().isTrue();623 } catch (Exception e) {624 logger.warn("waitUntil evaluate failed: {}", e.getMessage());625 return false;626 }627 }, b -> b, "waitUntil (js)", true);628 }629 @Override630 public Object script(String expression) {631 return eval(expression).getResult().getValue();632 }633 @Override634 public String getTitle() {635 return eval("document.title").getResult().getAsString();636 }637 @Override638 public String getUrl() {639 return eval("document.location.href").getResult().getAsString();640 }641 @Override642 public List<Map> getCookies() {643 DevToolsMessage dtm = method("Network.getAllCookies").send();644 return dtm.getResult("cookies").getValue();645 }646 @Override647 public Map<String, Object> cookie(String name) {648 List<Map> list = getCookies();649 if (list == null) {650 return null;651 }652 for (Map<String, Object> map : list) {653 if (map != null && name.equals(map.get("name"))) {654 return map;655 }656 }657 return null;658 }659 @Override660 public void cookie(Map<String, Object> cookie) {661 if (cookie.get("url") == null && cookie.get("domain") == null) {662 cookie = new HashMap(cookie); // don't mutate test663 cookie.put("url", getUrl());664 }665 method("Network.setCookie").params(cookie).send();666 }667 @Override668 public void deleteCookie(String name) {669 method("Network.deleteCookies").param("name", name).param("url", getUrl()).send();670 }671 @Override672 public void clearCookies() {673 method("Network.clearBrowserCookies").send();674 }675 @Override676 public void dialog(boolean accept) {677 dialog(accept, null);678 }679 @Override680 public void dialog(boolean accept, String text) {681 DevToolsMessage temp = method("Page.handleJavaScriptDialog").param("accept", accept);682 if (text == null) {683 temp.send();684 } else {685 temp.param("promptText", text).send();686 }687 }688 @Override689 public String getDialogText() {690 return currentDialogText;691 }692 @Override693 public byte[] pdf(Map<String, Object> options) {694 DevToolsMessage dtm = method("Page.printToPDF").params(options).send();695 String temp = dtm.getResult("data").getAsString();696 return Base64.getDecoder().decode(temp);697 }698 @Override699 public byte[] screenshot(boolean embed) {700 return screenshot(null, embed);701 }702 @Override703 public Map<String, Object> position(String locator) {704 boolean submitTemp = submit; // in case we are prepping for a submit().mouse(locator).click()705 submit = false;706 retryIfEnabled(locator);707 Map<String, Object> map = eval(DriverOptions.getPositionJs(locator)).getResult().getValue();708 submit = submitTemp;709 return map;710 }711 @Override712 public byte[] screenshot(String id, boolean embed) {713 DevToolsMessage dtm;714 if (id == null) {715 dtm = method("Page.captureScreenshot").send();716 } else {717 Map<String, Object> map = position(id);718 map.put("scale", 1);719 dtm = method("Page.captureScreenshot").param("clip", map).send();720 }721 String temp = dtm.getResult("data").getAsString();722 byte[] bytes = Base64.getDecoder().decode(temp);...

Full Screen

Full Screen

Source:PlaywrightDriver.java Github

copy

Full Screen

...60 private final Command command;61 private final WebSocketClient client;62 private final PlaywrightWait wait;63 private final Logger logger;64 private boolean submit;65 private boolean initialized;66 private boolean terminated;67 private String browserGuid;68 private String browserContextGuid;69 private final Object LOCK = new Object();70 private void lockAndWait() {71 synchronized (LOCK) {72 try {73 LOCK.wait();74 } catch (Exception e) {75 throw new RuntimeException(e);76 }77 }78 }79 protected void unlockAndProceed() {80 initialized = true;81 synchronized (LOCK) {82 LOCK.notify();83 }84 }85 private int nextId;86 public int nextId() {87 return ++nextId;88 }89 public void waitSync() {90 client.waitSync();91 }92 public static PlaywrightDriver start(Map<String, Object> map, ScenarioRuntime sr) {93 DriverOptions options = new DriverOptions(map, sr, 4444, "playwright");94 String playwrightUrl;95 Command command;96 if (options.start) {97 Map<String, Object> pwOptions = options.playwrightOptions == null ? Collections.EMPTY_MAP : options.playwrightOptions;98 options.arg(options.port + "");99 String browserType = (String) pwOptions.get("browserType");100 if (browserType == null) {101 browserType = "chromium";102 }103 options.arg(browserType);104 if (options.headless) {105 options.arg("true");106 }107 CompletableFuture<String> future = new CompletableFuture();108 command = options.startProcess(s -> {109 int pos = s.indexOf("ws://");110 if (pos != -1) {111 s = s.substring(pos).trim();112 pos = s.indexOf(' ');113 if (pos != -1) {114 s = s.substring(0, pos);115 }116 future.complete(s);117 }118 });119 try {120 playwrightUrl = future.get();121 } catch (Exception e) {122 throw new RuntimeException(e);123 }124 options.processLogger.debug("playwright server url ready: {}", playwrightUrl);125 } else {126 command = null;127 playwrightUrl = options.playwrightUrl;128 if (playwrightUrl == null) {129 throw new RuntimeException("playwrightUrl is mandatory if start == false");130 }131 }132 return new PlaywrightDriver(options, command, playwrightUrl);133 }134 public PlaywrightDriver(DriverOptions options, Command command, String webSocketUrl) {135 this.options = options;136 logger = options.driverLogger;137 this.command = command;138 wait = new PlaywrightWait(this, options);139 WebSocketOptions wsOptions = new WebSocketOptions(webSocketUrl);140 wsOptions.setMaxPayloadSize(options.maxPayloadSize);141 wsOptions.setTextConsumer(text -> {142 if (logger.isTraceEnabled()) {143 logger.trace("<< {}", text);144 } else {145 // to avoid swamping the console when large base64 encoded binary responses happen146 logger.debug("<< {}", StringUtils.truncate(text, 1024, true));147 }148 Map<String, Object> map = Json.of(text).value();149 PlaywrightMessage pwm = new PlaywrightMessage(this, map);150 receive(pwm);151 });152 client = new WebSocketClient(wsOptions, logger);153 lockAndWait();154 logger.debug("contexts ready, frame: {}, page: {}, browser-context: {}, browser: {}",155 currentFrame, currentPage, browserContextGuid, browserGuid);156 }157 private PlaywrightMessage method(String method, String guid) {158 return new PlaywrightMessage(this, method, guid);159 }160 public void send(PlaywrightMessage pwm) {161 String json = JsonUtils.toJson(pwm.toMap());162 logger.debug(">> {}", json);163 client.send(json);164 }165 private String currentDialog;166 private String currentDialogText;167 private String currentDialogType;168 private boolean dialogAccept = true;169 private String dialogInput = "";170 private String currentFrame;171 private String currentPage;172 private final Map<String, Set<String>> pageFrames = new LinkedHashMap();173 private final Map<String, Frame> frameInfo = new HashMap();174 private PlaywrightMessage page(String method) {175 return method(method, currentPage);176 }177 private PlaywrightMessage frame(String method) {178 return method(method, currentFrame);179 }180 private static class Frame {181 final String frameGuid;182 final String url;183 final String name;184 Frame(String frameGuid, String url, String name) {185 this.frameGuid = frameGuid;186 this.url = url;187 this.name = name;188 }189 }190 public void receive(PlaywrightMessage pwm) {191 if (pwm.methodIs("frameAttached")) {192 String pageGuid = pwm.getGuid();193 String frameGuid = pwm.getParam("frame.guid");194 Set<String> frames = pageFrames.get(pageGuid);195 if (frames == null) {196 frames = new LinkedHashSet(); // order important !!197 pageFrames.put(pageGuid, frames);198 }199 frames.add(frameGuid);200 } else if (pwm.methodIs("frameDetached")) {201 String pageGuid = pwm.getGuid();202 String frameGuid = pwm.getParam("frame.guid");203 frameInfo.remove(frameGuid);204 Set<String> frames = pageFrames.get(pageGuid);205 frames.remove(frameGuid);206 } else if (pwm.methodIs("navigated")) {207 String frameGuid = pwm.getGuid();208 String url = pwm.getParam("url");209 String name = pwm.getParam("name");210 frameInfo.put(frameGuid, new Frame(frameGuid, url, name));211 } else if (pwm.methodIs("__create__")) {212 if (pwm.paramHas("type", "Page")) {213 String pageGuid = pwm.getParam("guid");214 String frameGuid = pwm.getParam("initializer.mainFrame.guid");215 Set<String> frames = pageFrames.get(pageGuid);216 if (frames == null) {217 frames = new LinkedHashSet(); // order important !!218 pageFrames.put(pageGuid, frames);219 }220 frames.add(frameGuid);221 if (!initialized) {222 currentPage = pageGuid;223 currentFrame = frameGuid;224 unlockAndProceed();225 }226 } else if (pwm.paramHas("type", "Dialog")) {227 currentDialog = pwm.getParam("guid");228 currentDialogText = pwm.getParam("initializer.message");229 currentDialogType = pwm.getParam("initializer.type");230 if ("alert".equals(currentDialogType)) {231 method("dismiss", currentDialog).sendWithoutWaiting();232 } else {233 if (dialogInput == null) {234 dialogInput = "";235 }236 method(dialogAccept ? "accept" : "dismiss", currentDialog)237 .param("promptText", dialogInput).sendWithoutWaiting();238 }239 } else if (pwm.paramHas("type", "Browser")) {240 browserGuid = pwm.getParam("guid");241 Map<String, Object> map = new HashMap();242 map.put("sdkLanguage", "javascript");243 if (!options.headless) {244 map.put("noDefaultViewport", false);245 }246 if (options.playwrightOptions != null) {247 Map<String, Object> temp = (Map) options.playwrightOptions.get("context");248 if (temp != null) {249 map.putAll(temp);250 }251 }252 method("newContext", browserGuid).params(map).sendWithoutWaiting();253 } else if (pwm.paramHas("type", "BrowserContext")) {254 browserContextGuid = pwm.getParam("guid");255 method("newPage", browserContextGuid).sendWithoutWaiting();256 } else {257 logger.trace("ignoring __create__: {}", pwm);258 }259 } else {260 wait.receive(pwm);261 }262 }263 public PlaywrightMessage sendAndWait(PlaywrightMessage pwm, Predicate<PlaywrightMessage> condition) {264 boolean wasSubmit = submit;265 if (condition == null && submit) {266 submit = false;267 condition = PlaywrightWait.DOM_CONTENT_LOADED;268 }269 // do stuff inside wait to avoid missing messages270 PlaywrightMessage result = wait.send(pwm, condition);271 if (result == null && !wasSubmit) {272 throw new RuntimeException("failed to get reply for: " + pwm);273 }274 return result;275 }276 @Override277 public DriverOptions getOptions() {278 return options;279 }280 @Override281 public Driver timeout(Integer millis) {282 options.setTimeout(millis);283 return this;284 }285 @Override286 public Driver timeout() {287 return timeout(null);288 }289 private static final Map<String, Object> NO_ARGS = Json.of("{ value: { v: 'undefined' }, handles: [] }").value();290 private PlaywrightMessage evalOnce(String expression, boolean quickly, boolean fireAndForget) {291 PlaywrightMessage toSend = frame("evaluateExpression")292 .param("expression", expression)293 .param("isFunction", false)294 .param("arg", NO_ARGS);295 if (quickly) {296 toSend.setTimeout(options.getRetryInterval());297 }298 if (fireAndForget) {299 toSend.sendWithoutWaiting();300 return null;301 }302 return toSend.send();303 }304 private PlaywrightMessage eval(String expression) {305 return eval(expression, false);306 }307 private PlaywrightMessage eval(String expression, boolean quickly) {308 PlaywrightMessage pwm = evalOnce(expression, quickly, false);309 if (pwm.isError()) {310 String message = "js eval failed once:" + expression311 + ", error: " + pwm.getResult();312 logger.warn(message);313 options.sleep();314 pwm = evalOnce(expression, quickly, false); // no wait condition for the re-try315 if (pwm.isError()) {316 message = "js eval failed twice:" + expression317 + ", error: " + pwm.getResult();318 logger.error(message);319 throw new RuntimeException(message);320 }321 }322 return pwm;323 }324 @Override325 public Object script(String expression) {326 return eval(expression).getResultValue();327 }328 @Override329 public String elementId(String locator) {330 return frame("querySelector").param("selector", locator).send().getResult("element.guid");331 }332 @Override333 public List<String> elementIds(String locator) {334 throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.335 }336 private void retryIfEnabled(String locator) {337 if (options.isRetryEnabled()) {338 waitFor(locator); // will throw exception if not found339 }340 if (options.highlight) {341 // highlight(locator, options.highlightDuration); // instead of this342 String highlightJs = options.highlight(locator, options.highlightDuration);343 evalOnce(highlightJs, true, true); // do it safely, i.e. fire and forget344 }345 }346 @Override347 public void setUrl(String url) {348 frame("goto").param("url", url).param("waitUntil", "load").send();349 }350 @Override351 public void activate() {352 page("bringToFront").send();353 }354 @Override355 public void refresh() {356 page("reload").param("waitUntil", "load").send();357 }358 @Override359 public void reload() {360 refresh(); // TODO ignore cache ?361 }362 @Override363 public void back() {364 page("goBack").param("waitUntil", "load").send();365 }366 @Override367 public void forward() {368 page("goForward").param("waitUntil", "load").send();369 }370 @Override371 public void maximize() {372 // https://github.com/microsoft/playwright/issues/1086373 }374 @Override375 public void minimize() {376 // see maximize()377 }378 @Override379 public void fullscreen() {380 // TODO JS381 }382 @Override383 public void close() {384 page("close").send();385 }386 @Override387 public void quit() {388 if (terminated) {389 return;390 }391 terminated = true;392 method("close", browserGuid).sendWithoutWaiting();393 client.close();394 if (command != null) {395 // cannot force else node process does not terminate gracefully396 command.close(false);397 }398 }399 @Override400 public String property(String id, String name) {401 retryIfEnabled(id);402 return eval(DriverOptions.selector(id) + "['" + name + "']").getResultValue();403 }404 @Override405 public String html(String id) {406 return property(id, "outerHTML");407 }408 @Override409 public String text(String id) {410 return property(id, "textContent");411 }412 @Override413 public String value(String locator) {414 return property(locator, "value");415 }416 @Override417 public String getUrl() {418 return eval("document.location.href").getResultValue();419 }420 @Override421 public void setDimensions(Map<String, Object> map) {422 // todo423 }424 @Override425 public String getTitle() {426 return eval("document.title").getResultValue();427 }428 @Override429 public Element click(String locator) {430 retryIfEnabled(locator);431 eval(DriverOptions.selector(locator) + ".click()");432 return DriverElement.locatorExists(this, locator);433 }434 @Override435 public Element value(String locator, String value) {436 retryIfEnabled(locator);437 eval(DriverOptions.selector(locator) + ".value = '" + value + "'");438 return DriverElement.locatorExists(this, locator);439 }440 @Override441 public String attribute(String id, String name) {442 retryIfEnabled(id);443 return eval(DriverOptions.selector(id) + ".getAttribute('" + name + "')").getResultValue();444 }445 @Override446 public boolean enabled(String id) {447 retryIfEnabled(id);448 PlaywrightMessage pwm = eval(DriverOptions.selector(id) + ".disabled");449 Boolean disabled = pwm.getResultValue();450 return !disabled;451 }452 @Override453 public boolean waitUntil(String expression) {454 return options.retry(() -> {455 try {456 return eval(expression, true).getResultValue();457 } catch (Exception e) {458 logger.warn("waitUntil evaluate failed: {}", e.getMessage());459 return false;460 }461 }, b -> b, "waitUntil (js)", true);462 }463 @Override464 public Driver submit() {465 submit = true;466 return this;467 }468 @Override469 public Element focus(String locator) {470 retryIfEnabled(locator);471 eval(options.focusJs(locator));472 return DriverElement.locatorExists(this, locator);473 }474 @Override475 public Element clear(String locator) {476 eval(DriverOptions.selector(locator) + ".value = ''");477 return DriverElement.locatorExists(this, locator);478 }479 @Override480 public Map<String, Object> position(String locator) {481 return position(locator, false);482 }483 @Override484 public Map<String, Object> position(String locator, boolean relative) {485 boolean submitTemp = submit; // in case we are prepping for a submit().mouse(locator).click()486 submit = false;487 retryIfEnabled(locator);488 Map<String, Object> map = eval(relative ? DriverOptions.getRelativePositionJs(locator) : DriverOptions.getPositionJs(locator)).getResultValue();489 submit = submitTemp;490 return map;491 }492 private PlaywrightMessage evalFrame(String frameGuid, String expression) {493 return method("evaluateExpression", frameGuid)494 .param("expression", expression)495 .param("isFunction", false)496 .param("arg", NO_ARGS).send();497 }498 @Override499 public void switchPage(String titleOrUrl) {500 if (titleOrUrl == null) {501 return;502 }503 for (String pageGuid : pageFrames.keySet()) {504 String frameGuid = pageFrames.get(pageGuid).iterator().next();505 String title = evalFrame(frameGuid, "document.title").getResultValue();506 if (title != null && title.contains(titleOrUrl)) {507 currentPage = pageGuid;508 currentFrame = frameGuid;509 activate();510 return;511 }512 String url = evalFrame(frameGuid, "document.location.href").getResultValue();513 if (url != null && url.contains(titleOrUrl)) {514 currentPage = pageGuid;515 currentFrame = frameGuid;516 activate();517 return;518 }519 }520 logger.warn("failed to find page by title / url: {}", titleOrUrl);521 }522 @Override523 public void switchPage(int index) {524 if (index == -1 || index >= pageFrames.size()) {525 logger.warn("not switching page for size {}: {}", pageFrames.size(), index);526 return;527 }528 List<String> temp = getPages();529 currentPage = temp.get(index);530 currentFrame = pageFrames.get(currentPage).iterator().next();531 activate();532 }533 private void waitForFrame(String previousFrame) {534 String previousFrameUrl = frameInfo.get(previousFrame).url;535 logger.debug("waiting for frame url to switch from: {} - {}", previousFrame, previousFrameUrl);536 Integer retryInterval = options.getRetryInterval();537 options.setRetryInterval(1000); // reduce retry interval for this special case538 options.retry(() -> evalFrame(currentFrame, "document.location.href"),539 pwm -> !pwm.isError() && !pwm.getResultValue().equals(previousFrameUrl), "waiting for frame context", false);540 options.setRetryInterval(retryInterval); // restore541 }542 @Override543 public void switchFrame(int index) {544 String previousFrame = currentFrame;545 List<String> temp = new ArrayList(pageFrames.get(currentPage));546 index = index + 1; // the root frame is always zero, api here is consistent with webdriver etc547 if (index < temp.size()) {548 currentFrame = temp.get(index);549 logger.debug("switched to frame: {} - pages: {}", currentFrame, pageFrames);550 waitForFrame(previousFrame);551 } else {552 logger.warn("not switching frame for size {}: {}", temp.size(), index);553 }554 }555 @Override556 public void switchFrame(String locator) {557 String previousFrame = currentFrame;558 if (locator == null) {559 switchFrame(-1);560 } else {561 if (locator.startsWith("#")) { // TODO get reference to frame element via locator562 locator = locator.substring(1);563 }564 for (Frame frame : frameInfo.values()) {565 if (frame.url.contains(locator) || frame.name.contains(locator)) {566 currentFrame = frame.frameGuid;567 logger.debug("switched to frame: {} - pages: {}", currentFrame, pageFrames);568 waitForFrame(previousFrame);569 return;570 }571 }572 }573 }574 @Override575 public Map<String, Object> getDimensions() {576 logger.warn("getDimensions() not supported");577 return Collections.EMPTY_MAP;578 }579 @Override580 public List<String> getPages() {581 return new ArrayList(pageFrames.keySet());582 }583 @Override584 public String getDialogText() {585 return currentDialogText;586 }587 @Override588 public byte[] screenshot(boolean embed) {589 return screenshot(null, embed);590 }591 @Override592 public Map<String, Object> cookie(String name) {593 List<Map> list = getCookies();594 if (list == null) {595 return null;596 }597 for (Map<String, Object> map : list) {598 if (map != null && name.equals(map.get("name"))) {599 return map;600 }601 }602 return null;603 }604 @Override605 public void cookie(Map<String, Object> cookie) {606 if (cookie.get("url") == null && cookie.get("domain") == null) {607 cookie = new HashMap(cookie); // don't mutate test608 cookie.put("url", getUrl());609 }610 method("addCookies", browserContextGuid).param("cookies", Collections.singletonList(cookie)).send();611 }612 @Override613 public void deleteCookie(String name) {614 List<Map> cookies = getCookies();615 List<Map> filtered = new ArrayList(cookies.size());616 for (Map m : cookies) {617 if (!name.equals(m.get("name"))) {618 filtered.add(m);619 }620 }621 clearCookies();622 method("addCookies", browserContextGuid).param("cookies", filtered).send();623 }624 @Override625 public void clearCookies() {626 method("clearCookies", browserContextGuid).send();627 }628 @Override629 public List<Map> getCookies() {630 return method("cookies", browserContextGuid).param("urls", Collections.EMPTY_LIST).send().getResult("cookies", List.class);631 }632 @Override633 public void dialog(boolean accept) {634 dialog(accept, null);635 }636 @Override637 public void dialog(boolean accept, String input) {638 this.dialogAccept = accept;639 this.dialogInput = input;640 }641 @Override642 public Element input(String locator, String value) {643 retryIfEnabled(locator);644 // focus645 eval(options.focusJs(locator));646 Input input = new Input(value);647 Set<String> pressed = new HashSet();648 while (input.hasNext()) {649 char c = input.next();650 String keyValue = Keys.keyValue(c);651 if (keyValue != null) {652 if (Keys.isModifier(c)) {653 pressed.add(keyValue);654 page("keyboardDown").param("key", keyValue).send();655 } else {656 page("keyboardPress").param("key", keyValue).send();657 }658 } else {659 page("keyboardType").param("text", c + "").send();660 }661 }662 for (String keyValue : pressed) {663 page("keyboardUp").param("key", keyValue).send();664 }665 return DriverElement.locatorExists(this, locator);666 }667 protected int currentMouseXpos;668 protected int currentMouseYpos;669 @Override670 public void actions(List<Map<String, Object>> sequence) {671 boolean submitRequested = submit;672 submit = false; // make sure only LAST action is handled as a submit()673 for (Map<String, Object> map : sequence) {674 List<Map<String, Object>> actions = (List) map.get("actions");675 if (actions == null) {676 logger.warn("no actions property found: {}", sequence);677 return;678 }679 Iterator<Map<String, Object>> iterator = actions.iterator();680 while (iterator.hasNext()) {681 Map<String, Object> action = iterator.next();682 String type = (String) action.get("type");683 if (type == null) {684 logger.warn("no type property found: {}", action);685 continue;686 }687 String pageAction;688 switch (type) {689 case "pointerMove":690 pageAction = "mouseMove";691 break;692 case "pointerDown":693 pageAction = "mouseDown";694 break;695 case "pointerUp":696 pageAction = "mouseUp";697 break;698 default:699 logger.warn("unexpected action type: {}", action);700 continue;701 }702 Integer x = (Integer) action.get("x");703 Integer y = (Integer) action.get("y");704 if (x != null) {705 currentMouseXpos = x;706 }707 if (y != null) {708 currentMouseYpos = y;709 }710 Integer duration = (Integer) action.get("duration");711 PlaywrightMessage toSend = page(pageAction);712 if ("mouseMove".equals(pageAction) && x != null && y != null) {713 toSend.param("x", x).param("y", y);714 } else {715 toSend.params(Collections.EMPTY_MAP);716 }717 if (!iterator.hasNext() && submitRequested) {718 submit = true;719 }720 toSend.send();721 if (duration != null) {722 options.sleep(duration);723 }724 }725 }726 }727 @Override728 public Element select(String locator, String text) {729 retryIfEnabled(locator);730 eval(options.optionSelector(locator, text));731 return DriverElement.locatorExists(this, locator);732 }...

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