Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* The MIT License
*
* Copyright 2018 Intuit Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.intuit.karate.driver;
import com.intuit.karate.JsonUtils;
import com.intuit.karate.Logger;
import com.intuit.karate.ScriptValue;
import com.intuit.karate.netty.WebSocketClient;
import com.intuit.karate.shell.CommandThread;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
/**
*
* @author pthomas3
*/
public abstract class DevToolsDriver implements Driver {
protected final Logger logger;
protected final DriverOptions options;
protected final CommandThread command;
protected final WebSocketClient client;
private final WaitState waitState;
protected final String pageId;
private Integer windowId;
private String windowState;
protected String currentUrl;
protected String currentDialogText;
private int nextId;
public int getNextId() {
return ++nextId;
}
protected DevToolsDriver(DriverOptions options, CommandThread command, String webSocketUrl) {
this.options = options;
this.logger = options.driverLogger;
this.command = command;
this.waitState = new WaitState(options);
int pos = webSocketUrl.lastIndexOf('/');
pageId = webSocketUrl.substring(pos + 1);
logger.debug("page id: {}", pageId);
client = new WebSocketClient(webSocketUrl, text -> {
logger.debug("<< {}", text);
Map map = JsonUtils.toJsonDoc(text).read("$");
DevToolsMessage dtm = new DevToolsMessage(this, map);
receive(dtm);
});
}
public int waitSync() {
return command.waitSync();
}
public DevToolsMessage method(String method) {
return new DevToolsMessage(this, method);
}
public DevToolsMessage sendAndWait(String text) {
Map map = JsonUtils.toJsonDoc(text).read("$");
DevToolsMessage dtm = new DevToolsMessage(this, map);
if (dtm.getId() == null) {
dtm.setId(getNextId());
}
return sendAndWait(dtm, null);
}
public DevToolsMessage sendAndWait(DevToolsMessage dtm, Predicate condition) {
String json = JsonUtils.toJson(dtm.toMap());
logger.debug(">> {}", json);
client.send(json);
return waitState.waitAfterSend(dtm, condition);
}
public void receive(DevToolsMessage dtm) {
waitState.receive(dtm);
if (dtm.isMethod("Page.javascriptDialogOpening")) {
currentDialogText = dtm.getParam("message").getAsString();
}
if (dtm.isMethod("Page.frameNavigated") && dtm.getFrameUrl().startsWith("http")) {
currentUrl = dtm.getFrameUrl();
}
}
//==========================================================================
//
protected DevToolsMessage evaluate(String expression, Predicate condition) {
int count = 0;
DevToolsMessage dtm;
do {
if (count > 0) {
logger.debug("evaluate attempt #{}", count + 1);
}
dtm = method("Runtime.evaluate")
.param("expression", expression).send(condition);
condition = null; // retries don't care about user-condition, e.g. page on-load
} while (dtm != null && dtm.isResultError() && count++ < 3);
return dtm;
}
protected DevToolsMessage evaluateAndGetResult(String expression, Predicate condition) {
DevToolsMessage dtm = evaluate(expression, condition);
String objectId = dtm.getResult("objectId").getAsString();
return method("Runtime.getProperties").param("objectId", objectId).param("accessorPropertiesOnly", true).send();
}
@Override
public void activate() {
method("Target.activateTarget").param("targetId", pageId).send();
}
protected void initWindowIdAndState() {
DevToolsMessage dtm = method("Browser.getWindowForTarget").param("targetId", pageId).send();
windowId = dtm.getResult("windowId").getValue(Integer.class);
windowState = (String) dtm.getResult("bounds").getAsMap().get("windowState");
}
@Override
public Map getDimensions() {
DevToolsMessage dtm = method("Browser.getWindowForTarget").param("targetId", pageId).send();
return dtm.getResult("bounds").getAsMap();
}
@Override
public void setDimensions(Map map) {
Map temp = getDimensions();
temp.putAll(map);
temp.remove("windowState");
method("Browser.setWindowBounds")
.param("windowId", windowId)
.param("bounds", temp).send();
}
@Override
public void close() {
method("Page.close").send();
}
@Override
public void quit() {
if (!options.headless) {
method("Browser.close").send(WaitState.CHROME_INSPECTOR_DETACHED);
}
if (command != null) {
command.close();
}
}
@Override
public void setLocation(String url) {
method("Page.navigate").param("url", url).send(WaitState.CHROME_DOM_CONTENT);
}
@Override
public void refresh() {
method("Page.reload").send(WaitState.CHROME_DOM_CONTENT);
}
@Override
public void reload() {
method("Page.reload").param("ignoreCache", true).send();
}
private void history(int delta) {
DevToolsMessage dtm = method("Page.getNavigationHistory").send();
int currentIndex = dtm.getResult("currentIndex").getValue(Integer.class);
List