Covering an assortment of tools and frameworks for a range of testing written in a few different languages.
{{tab.selects[0].description}}
Languages: {{tab.selects[0].languages}}
describe("SERVICES & FACTORIES - authenticator Test Suite", function() {
"use strict";
// *******************************
// AUTHENTICATOR ANGULAR MODULE
// *******************************
var authenticatedTokenService,myCookies,authenticatorService,httpBackend,$window;
beforeEach(module('authenticator'));
beforeEach(module('ngCookies'));
beforeEach(module(function($provide) {
$window = {location: { replace: jasmine.createSpy()} };
$provide.value('$window', $window);
}));
beforeEach(inject(function($injector) {
authenticatedTokenService = $injector.get('AuthenticatedToken',[myCookies]);
authenticatorService = $injector.get('Authenticator',['$http', authenticatedTokenService, $window]);
myCookies = $injector.get('$cookieStore',[]);
httpBackend = $injector.get('$httpBackend');
}));
// ***********************
// AUTHENTICATOR FACTORY
// ***********************
describe('Authenticator Factory',function() {
// *********
// LOGIN
// *********
describe('login',function() {
it('Check that the login method is defined.',function() {
expect(authenticatorService.login).not.toEqual(undefined);
});
it('Check that when the login method is executed with valid credentials, the successCallback is called.',function() {
var creds, successCallbackSpy, errorCallbackSpy;
creds = {"userName":"administrator","password":"admin"};
successCallbackSpy = jasmine.createSpy();
errorCallbackSpy = jasmine.createSpy();
httpBackend.expectPOST('/tokens/', creds, function(headers) {
return headers['Content-Type'] === 'application/json';
}).respond(200, 'HELLO');
authenticatorService.login(creds, successCallbackSpy, errorCallbackSpy);
httpBackend.flush();
expect(successCallbackSpy).toHaveBeenCalled();
});
it('Check that when the login method is executed with invalid credentials, the errorCallback is called.',function() {
var invalidcreds, successCallbackSpy, errorCallbackSpy;
invalidcreds = {"userName":"admin2","password":"admin2"};
successCallbackSpy = jasmine.createSpy();
errorCallbackSpy = jasmine.createSpy();
httpBackend.expectPOST('/tokens/', invalidcreds, function(headers) {
return headers['Content-Type'] === 'application/json';
}).respond(500, 'BOO');
authenticatorService.login(invalidcreds, successCallbackSpy, errorCallbackSpy);
httpBackend.flush();
expect(errorCallbackSpy).toHaveBeenCalled();
});
});
});
});
{{tab.selects[0].example1}}
describe('CONTROLLERS - Settings Admin Test Cases', function() {
"use strict";
// **********************************************
// MYAPP CONTROLLER ANGULAR MODULE
// **********************************************
var scope,myAppCtrl,toaster,$window,loaderState,state,event;
beforeEach(module(
'myappctrl',
'toaster',
'flow',
'loaderstate',
));
beforeEach(module(function($provide) {
$window = {open: function(url) { return url;} };
$provide.value('$window', $window);
}));
beforeEach(inject(function($injector,$controller,$rootScope) {
scope = $rootScope.$new();
state = { go: function() {}};
event = {"bubbles":true,"cancelBubble":false,"isTrusted":true,"returnValue":true,"type":"change"};
toaster = $injector.get('toaster',[]);
loaderState = $injector.get('LoaderState');
myAppCtrl = $controller('MyAppCtrl',{
$scope:scope,
LoaderState:loaderState,
toaster:toaster,
$window:$window,
$state:state
});
}));
// ********
// added
// ********
describe('added',function() {
it('Check that execution of the added method returns true if getExtension returns txt.',function() {
var $flow = {"support":true,"supportDirectory":true,"files":[],"defaults":{"chunkSize":1048576,"forceChunkSize":false,"simultaneousUploads":3,"singleFile":false,"fileParameterName":"file","progressCallbacksInterval":500,"speedSmoothingFactor":0.1,"query":{},"headers":{},"withCredentials":false,"preprocess":null,"method":"multipart","testMethod":"GET","uploadMethod":"POST","prioritizeFirstAndLastChunk":false,"target":"/","testChunks":true,"generateUniqueIdentifier":null,"maxChunkRetries":0,"chunkRetryInterval":null,"permanentErrors":[404,415,500,501],"successStatuses":[200,201,202],"onDropStopPropagation":false},"opts":{"chunkSize":209715200,"forceChunkSize":false,"simultaneousUploads":3,"singleFile":true,"fileParameterName":"file","progressCallbacksInterval":500,"speedSmoothingFactor":0.1,"query":{},"headers":{},"withCredentials":false,"preprocess":null,"method":"octet","testMethod":"GET","uploadMethod":"PUT","prioritizeFirstAndLastChunk":false,"testChunks":false,"generateUniqueIdentifier":null,"maxChunkRetries":0,"chunkRetryInterval":null,"permanentErrors":[404,500,501],"successStatuses":[200,201,202],"onDropStopPropagation":false,"minFileSize":0},"events":{"catchall":[null]}};
var flowFile = {"name":"myFakeFile.txt","getExtension":function() {return "txt"}};
var toasterSpy = spyOn(toaster,'pop');
expect(scope.added(event, $flow, flowFile)).toBe(true);
expect(toasterSpy).not.toHaveBeenCalled();
});
});
});
{{tab.selects[0].example2}}
{{tab.selects[1].description}}
Languages: {{tab.selects[1].languages}}
// Import the methods.
var myServiceMethods = require("./libs/my-service-methods.js");
// Import the objects
var homePage = require("./pageobjs/homePage.js");
var commonBase;
describe("First Test Suite", function() {
"use strict";
beforeEach(function() {
myServiceMethods.login("admin","admin");
commonBase= new Date().getTime();
});
it('Check that the content of both tabs is correct.',function() {
// Add a new tree node.
myServiceMethods.createNewNode(commonBase + "_rootNode", commonBase + "_baseNode", "New_"
+ commonBase + "_testNode", true);
// Check that both tabs are shown.
expect(homePage.tab1.isDisplayed() && homePage.tab2.isDisplayed()).toBeTruthy();
// Click on tab1
homePage.tab1.click();
// Check that description and title stuff are shown.
expect(homePage.titleInputField.isDisplayed()
&& homePage.descriptionInputField.isDisplayed()).toBeTruthy();
// Click on tab2
homePage.tab2.click();
// Check that the root node part is shown.
expect(homePage.treeRoot().isDisplayed()).toBeTruthy();
});
});
{{tab.selects[1].example1}}
{{tab.selects[2].description}}
Languages: {{tab.selects[2].languages}}
public class TestClass {
// Set up general variables
private static WebDriver driver;
private static AuthenticationFlow authenticationFlow;
private static HomePage homePage;
private String commonBase;
private static MyMethods myMethods;
// Add test specific variables
private final Date d = new Date();
@Rule
public final TestRule watcher = new TestWatcher() {
@Override
protected void starting(Description description) {
System.out.println("Starting test: " + description.getMethodName());
TabPageTree.setTestName(description.getMethodName());
}
@Override
protected void failed(Throwable e, Description description) {
myMethods.takeAScreenShot(TabPageTree.getTestName());
}
};
@Before
public void initializeDriver() {
// Go to the index page.
authenticationFlow.getToStartPosition();
commonBase = String.valueOf(d.getTime());
}
@BeforeClass
public static void installService() {
// Create the driver
driver = CreateDriver.setupDriver(AuthenticationFlow.runOnBrowser);
// Login
authenticationFlow = new AuthenticationFlow(driver);
authenticationFlow.login(AuthenticationFlow.USERNAME, AuthenticationFlow.PASSWORD);
homePage = new HomePage(driver);
myMethods = new MyMethods(driver);
// Wait for the page to load.
WebDriverWait wait = new WebDriverWait(driver, 6);
wait.until(ExpectedConditions.titleIs("My Web Service"));
new HTTPRequests(driver).addWorkingServicesAndSchemas();
}
@AfterClass
public static void closeTheDriver() {
driver.quit();
}
@After
public void killContent() {
HTTPRequests chris = new HTTPRequests(driver);
chris.deleteResource("/appconfig/content");
}
@Test
public void checkContentOfBothTabs() {
// Add a new node.
myMethods.createNewNode(commonBase + "_rootNode", commonBase + "_baseNode", "New_"
+ commonBase + "_testNode", true);
// Check that both tabs are shown.
assertTrue(homePage.tab1.isDisplayed() && homePage.tab2.isDisplayed());
// Click on tab1
homePage.tab1.click();
// Check that description and title stuff are shown.
assertTrue(homePage.titleInputField.isDisplayed()
&& homePage.descriptionInputField.isDisplayed());
// Click on tab2
homePage.tab2.click();
// Check that the root node part is shown.
assertTrue(homePage.treeRoot().isDisplayed());
}
}
{{tab.selects[2].example1}}
public void login(String username, String password) {
webDriver.get(LOGIN_URL);
webDriver.manage().window().setSize(new Dimension(1040,744));
if(runOnBrowser.equals("ie") && !webDriver.getTitle().contains("My WebPage")) {
// Needed for IE certification issue only.
webDriver.get("javascript:document.getElementById('overridelink').click();");
}
assertThat(webDriver.getTitle(), is("My WebPage - Login"));
loginPage.setUserName(username);
loginPage.setPassword(password);
loginPage.clickLogin();
}
{{tab.selects[2].example2}}
# CREATE DRIVER #
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import *
from selenium.webdriver.support import expected_conditions
class CreateDriver(object):
def __init__(self):
print "new CreateDriver"
@staticmethod
def setupdriver(browser):
###############
# FIREFOX SETUP
##############
if browser == "firefox":
ffprofile = webdriver.FirefoxProfile()
ffprofile.set_preference("browser.helperApps.neverAsk.saveToDisk",
"application/zip,text/json")
ffprofile.set_preference("browser.download.folderList", 2)
ffprofile.set_preference("app.update.enabled", False)
driver = webdriver.Firefox(ffprofile)
##############
# CHROME SETUP
##############
else:
prefs = {"download.default_directory": "C:\\Chrome_Download_Dir"}
chromeopts = webdriver.ChromeOptions()
chromeopts.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome("C:\\chromedriver.exe", chrome_options=chromeopts)
return driver
def main():
driver = CreateDriver().setupdriver("chrome")
driver.get("//www.google.com")
search_button = WebDriverWait(driver, 5).until(
expected_conditions.visibility_of_element_located((By.XPATH, "//input[contains(@value, 'Feeling Lucky')]")))
search_button.click()
WebDriverWait(driver, 10).until(expected_conditions.title_is("Google Doodles"))
if __name__ == "__main__":
main()
{{tab.selects[2].pythondriver}}
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import *
from selenium.webdriver.support import expected_conditions
class AuthenticationObjects(object):
def __init__(self, driver):
self.driver = driver
def username_text_box(self):
return WebDriverWait(self.driver, 10).until(
expected_conditions.presence_of_element_located((By.XPATH, "//input[@placeholder='username']")))
def password_text_box(self):
return WebDriverWait(self.driver, 10).until(
expected_conditions.presence_of_element_located((By.XPATH, "//input[@placeholder='password']")))
def submit_button(self):
return WebDriverWait(self.driver, 10).until(
expected_conditions.presence_of_element_located((By.XPATH, "//button[@type='submit']")))
def fail_popup(self):
return WebDriverWait(self.driver, 10).until(
expected_conditions.presence_of_element_located((By.XPATH,
"//div[contains(@class,'pop-up-box')][contains(text(),'Invalid Credentials.')]")))
from AuthenticationObjects import AuthenticationObjects
import time
class LoginFlow(object):
def __init__(self, driver):
self.driver = driver
def send_user_name(self, username_string):
AuthenticationObjects(self.driver).username_text_box().send_keys(username_string)
def send_password(self, password_string):
AuthenticationObjects(self.driver).password_text_box().send_keys(password_string)
def click_submit(self):
AuthenticationObjects(self.driver).submit_button().click()
def check_for_popup(self, fail_bool):
if fail_bool:
AuthenticationObjects(self.driver).fail_popup().click()
else:
pass
def wait_for_string_to_be_url(self, url_string, time_to_wait):
count = 0
while url_string not in self.driver.current_url:
if count != time_to_wait:
time.sleep(1)
count = + 1
else:
raise Exception("Test failed because", url_string,
"was not found after ", time_to_wait, "seconds.")
import unittest
from Libs.Methods.create_driver import CreateDriver
from Libs.Methods.login_flow import *
class AuthenticationTestSuite(unittest.TestCase):
def setUp(self):
self.driver = CreateDriver().setupdriver("firefox")
self.login_flow = LoginFlow(self.driver)
self.login_address = "//chrisp1985.ddns.net:9998/login.html"
def tearDown(self):
self.driver.quit()
def login_succeeds_if_password_and_user_are_correct_test(self):
# Get the login page.
self.driver.get(self.login_address)
# Send the user/password and press submit.
self.login_flow.send_user_name("admin")
self.login_flow.send_password("admin")
self.login_flow.click_submit()
# Wait for the url to contain the search string.
self.login_flow.wait_for_string_to_be_url("index", 10)
# Check that the title of the page is correct.
self.assertIn("Chris Parsons Website", self.driver.title)
def login_fails_if_password_is_incorrect_test(self):
# Get the login page.
self.driver.get(self.login_address)
# Send the user/password and press submit.
self.login_flow.send_user_name("admin")
self.login_flow.send_password("noob")
self.login_flow.click_submit()
# Check for the error popup
self.login_flow.check_for_popup(True)
def login_fails_if_username_is_incorrect_test(self):
self.driver.get(self.login_address)
self.login_flow.send_user_name("noob")
self.login_flow.send_password("admin")
self.login_flow.click_submit()
# Check for the error popup
self.login_flow.check_for_popup(True)
def login_fails_if_username_and_password_are_incorrect_test(self):
# Get the login page.
self.driver.get(self.login_address)
# Send the user/password and press submit.
self.login_flow.send_user_name("noob")
self.login_flow.send_password("noob")
self.login_flow.click_submit()
# Check for the error popup
self.login_flow.check_for_popup(True)
{{tab.selects[2].python1}}
{{tab.selects[3].description}}
Languages: {{tab.selects[3].languages}}
/**
* *** WAIT FOR AN OBJECT ***
* This waits for an object to appear in the application by constantly polling the available objects.
*
* @param winRoot
* The AutomationElement from which to start the search. If it's left blank, it'll query objects from the very top level.
*
* @param node
* A blank treenode to fill out the childTreeNode stuff.
*
* @param timeToWait
* The time to wait for the object to appear. If the timer exceeds this time, the method will fail.
*
* @param elementName
* The name of the element by the Page Objects method. Eg, to find the completion of the progress bar, this is 'progressBarComplete'.
*
* @param args
* The arguments required by the element as in the Page Objects.
*
* @return
* Returns the found object.
*/
public AutomationElement waitForObject(AutomationElement winRoot, TreeNode node, double timeToWait, String elementName, object[] args)
{
// Set the time.
DateTime timeAtStart = DateTime.Now;
DateTime now = new DateTime(1985, 10, 26, 13, 15, 00); // Back to the Future Day - Oct 26th 1985.
// Set the returned element to be null (so if the element isn't found, null is returned).
AutomationElement returnedEle = null;
// While the timer hasn't expired...
while (now.Subtract(timeAtStart).TotalSeconds < timeToWait)
{
try
{
// Create the object here.
MethodInfo method = typeof(PageObjects).GetMethod(elementName);
AutomationElement root = null;
if (winRoot == null)
{
root = AutomationElement.RootElement.FindChildByProcessId(AutomationMethods.processId);
}
else
{
root = winRoot;
}
// Invoke the element through reflection.
AutomationElement newEle = (AutomationElement)method.Invoke(new PageObjects(), args);
if (newEle.GetCurrentPropertyValue(AutomationElement.IsEnabledProperty).Equals(true))
{
// OMG, you found the element.
returnedEle = newEle;
break;
}
}
catch
{
// Just carry on.
}
// Reset the time.
now = DateTime.Now;
}
// Has the timer expired?
if (now.Subtract(timeAtStart).TotalSeconds > timeToWait)
{
Assert.Fail("Wait time was exceeded for element so test failed.");
}
// Return the element.
return returnedEle;
}
{{tab.selects[3].example1}}
/*
* *** STOP A SERVICE ***
* This can stop the process to allow for checking that valid errors are displayed when a connection is lost.
*
* @param stop
* If stop is true, the service is stopped. If it's false, it's started.
*
* @param service
* This is the name of the service to stop.
*/
public void stopASpecificService(bool stop, String serviceName)
{
// Set services, and then get them.
ServiceController[] scServices;
scServices = ServiceController.GetServices();
// Iterate over the available services until...
foreach (ServiceController scTemp in scServices)
{
// ... you have found metadata service!
if (scTemp.ServiceName.Equals(serviceName))
{
if (stop)
{
// Stop the service and wait until it's stopped.
scTemp.Stop();
scTemp.WaitForStatus(ServiceControllerStatus.Stopped);
}
else
{
// Start the service and wait until it's started.
scTemp.Start();
scTemp.WaitForStatus(ServiceControllerStatus.Running);
}
// Wait until the service has stopped/started.
Thread.Sleep(2000);
}
}
}
{{tab.selects[3].example2}}
[Test]
public void Test1()
{
/*
* SUMMARY: Disconnect the service and check that valid error messages are displayed to the user when attempting to use the service.
*
* Test Steps
* 1. Add data to the application.
* 2. Disconnect the service.
* 3. Attempt to execute the run task.
*
* Expected Outcomes
* 1. The data is added successfully and all of the nodes are populated in the application.
* 2. The service is disconnected.
* 3. A popup is displayed, informing the user that the request cannot be processed.
*/
Console.WriteLine("Starting Test 1");
// Run the stuff before the test.
beforeTest();
int processId = MyApp_AutomationMethods.processId;
// Set the Main Window.
TreeNode node = new TreeNode();
MyApp_AutomationMethods ext = new MyApp_AutomationMethods();
UIAutomationMethods meths = new UIAutomationMethods();
// 2. Disconnect the service.
try {
meths.stopASpecificService(true, "MyCompany:MyApplication");
// 3. Attempt to execute the ‘Run’ task.
AutomationElement mainWindow = AutomationElement.RootElement.FindChildByProcessId(processId);
ext.clickRun();
// Check for the error and dismiss it.
new MyApp_AutomationMethods().readAndDismissError(AutomationElement.RootElement.FindChildByProcessId(processId),
node, "Could not execute the task. Please check if the application is running.");
Console.WriteLine("Test 1 Passed!");
}
finally
{
// Restart the service.
meths.stopASpecificService(false, "MyCompany:MyApplication");
}
}
{{tab.selects[3].example3}}
{{tab.selects[4].description}}
Languages: {{tab.selects[4].languages}}
/**
* *** GET TOKEN VIA REST-ASSURED ***
* This creates a request for a token, and returns the string response.
*
* @param username
* The user of the service.
* @param password
* The password of the user of the service.
* @return A string of the token response to use embedded in cookies.
*/
public String getTokenRestAssured(String username, String password)
{
return RestAssured.given().relaxedHTTPSValidation().contentType(ContentType.JSON).request()
.body("{\n" + " userName:\"" + username + "\",\n" + " password:\"" + password + "\"\n" + " }")
.when().post("//localhost:7753/tokenPath/").asString();
}
/**
* *** GET REQUEST VIA REST-ASSURED ***
* This creates a request to a resource location, and returns the response.
*
* @param resourceLocation
* The resource location to get.
* @return The response as a Rest Assured response, allowing further
* querying of status codes, messages etc.
*/
public Response getRequest(String resourceLocation)
{
return RestAssured.given().relaxedHTTPSValidation()
.cookie("customAuthToken", getTokenRestAssured("administrator", "admin")).when().get(resourceLocation);
}
/**
* *** PUT REQUEST VIA REST-ASSURED ***
* This creates a PUT request for a resource, and returns the response.
*
* @param bodyText
* The body of text to add to the request.
* @param resourceLocation
* The resource location to get.
* @return The response as a Rest Assured response, allowing further
* querying of status codes, messages etc.
*/
public Response putRequest(String bodyText, String resourceLocation)
{
return RestAssured.given().relaxedHTTPSValidation()
.cookie("customAuthToken", getTokenRestAssured("administrator", "admin")).request().body(bodyText).when()
.put(resourceLocation);
}
@Test
public void validGetRequestRestAssured()
{
// Add the resource
putRequest(
"trialText",
credsBasedRequest.URLString + "path/to/my/content/" + commonBase
+ "_validGetRequest").then().assertThat().statusCode(200);
// Check the contents
assertTrue(getRequest(
credsBasedRequest.URLString + "path/to/my/content/" + commonBase
+ "_validGetRequest").asString().contains("trialText"));
}
@Test
public void getInvalidURLRestAssured()
{
getRequest(credsBasedRequest.URLString + "path/to/my/con").then()
.assertThat().statusCode(404);
}
{{tab.selects[4].restassured}}
* *** GET THE TOKEN ***
* Executes a 'POST' command to get a token string back, which can then be used in cookies for further requests.
*
* @param userName
* This is the name of the ... user... for the metadata service.
*
* @param passWord
* This is the password that the user logs into the web service with.
*/
public String getAToken(String userName, String passWord)
{
// This needs to be set to avoid SSL issues.
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
// Set the Client and the Request.
var client = new RestClient("//localhost:7753");
var request = new RestRequest("tokens", Method.POST);
// Add the details and get the token string.
request.AddParameter("application/json", "{userName:\"" + userName + "\",password:\"" + passWord + "\"}", ParameterType.RequestBody);
return client.Execute(request).Content;
}
/**
* *** GET WHATEVER ***
* Executes a 'GET' command for the request path supplied.
*
* @param requestPath
* This is the URI for the request.
*
* @return
* This is the returned content from the response as a string.
*/
public String getWhatever(String requestPath)
{
// This needs to be set to avoid SSL issues.
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
// Set the Client and the Request.
RestClient client = new RestClient("//localhost:7753");
RestRequest request = new RestRequest(requestPath, Method.GET);
// Add the token and the pathToFile to the request.
request.AddCookie("customAuthToken", getAToken("administrator","admin"));
// Execute and return the response as a string.
return client.Execute(request).Content;
}
{{tab.selects[4].restsharp}}
var should = require('C:\\Users\\parsonsc\\AppData\\Roaming\\npm\\node_modules\\should');
var request = require('C:\\Users\\parsonsc\\AppData\\Roaming\\npm\\node_modules\\supertest');
describe('Mocha Tests', function() {
// GENERAL
var url = '//mylocalservice:7753';
// USERS
var testUser = 'admin';
describe('2.3.1.2 PUT /path/to/user/{username}', function() {
it('PUTUSER-1', function(done) {
// *******************************************************
// Summary
// Confirm that the API accepts HTTP PUT requests for creating users when all mandatory fields are set in the body.
// Preconditions
// Fully Operable WebService is available.
// WebService is fully licensed.
// *******************************************************
request(url)
.put('/path/to/user/'+testUser) // Set the URI you're trying to PUT.
.set('Authorization', 'Basic c2VwdXJhLW9wZW5pZDpwYXNzd29yZA==') // set the Custom Header.
.set('Content-Type', 'application/json') // Set the Content Type header.
.send({
'authtype':'oauth2',
'id':testUser,
'password':testUser,
'name':testUser,
'type':'admin',
'role':'Manager',
'description':'TRIAL USER',
'defaultlanguage':'en'
}) // Send the Data that is contained within the body of the command.
.end(function(err, res) {
if (err) {
throw err;
}
// console.log(res.body);
res.status.should.be.equal(200); // Check the HTTP Status is 200 (OK)
res.should.have.properties("user","status");
res.body.status.should.have.property("success",true);
done();
});
});
});
{{tab.selects[4].mocha}}
//gateway.marvel.com/v1/public/characters?apikey=085672cb3bc7ad07244dbd1a1690eac3&ts=45&hash=0a3cf7d92c54f1e5f062c299f3bab34c&name=Deadpool
{
"code": 200,
"status": "Ok",
"copyright": "© 2016 MARVEL",
"attributionText": "Data provided by Marvel. © 2016 MARVEL",
"attributionHTML": "Data provided by Marvel. © 2016 MARVEL",
"etag": "152f2c29b03e5d4f3338cbf1221822349e9c08d0",
"data": {
"offset": 0,
"limit": 20,
"total": 1,
"count": 1,
"results": [
{
"id": 1009268,
"name": "Deadpool",
"description": "",
"modified": "2013-10-18T17:33:26-0400",
"thumbnail": {
"path": "//i.annihil.us/u/prod/marvel/i/mg/9/90/5261a86cacb99",
"extension": "jpg"
},
"resourceURI": "//gateway.marvel.com/v1/public/characters/1009268",
"comics": {
"available": 420,
"collectionURI": "//gateway.marvel.com/v1/public/characters/1009268/comics",
"items": [
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/41112",
"name": "5 Ronin (Hardcover)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/36160",
"name": "5 Ronin (2010) #5"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/38751",
"name": "5 Ronin (2010) #5 (MCGUINNESS COVER)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/394",
"name": "Agent X (2002) #15"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/24418",
"name": "Amazing Spider-Man (1999) #611"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/31556",
"name": "Amazing Spider-Man (1999) #620 (DEADPOOL VARIANT)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/31560",
"name": "Avengers: The Initiative (2007) #33 (DEADPOOL VARIANT)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/41349",
"name": "Battle Scars (2011) #3"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/41348",
"name": "Battle Scars (2011) #4"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/23971",
"name": "Cable (2008) #13"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/23972",
"name": "Cable (2008) #13 (OLIVETTI (MW, 50/50 COVER))"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/24171",
"name": "Cable (2008) #14"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/24172",
"name": "Cable (2008) #14 (OLIVETTI MW, 50/50 COVER)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/24631",
"name": "Cable (2008) #15"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/24632",
"name": "Cable (2008) #15 (OLIVETTI (MW, 50/50 COVER))"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/430",
"name": "Cable & Deadpool (2004) #1"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/479",
"name": "Cable & Deadpool (2004) #2"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/644",
"name": "Cable & Deadpool (2004) #3"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/706",
"name": "Cable & Deadpool (2004) #4"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/comics/548",
"name": "Cable & Deadpool (2004) #5"
}
],
"returned": 20
},
"series": {
"available": 102,
"collectionURI": "//gateway.marvel.com/v1/public/characters/1009268/series",
"items": [
{
"resourceURI": "//gateway.marvel.com/v1/public/series/15276",
"name": "5 Ronin (2011)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/12429",
"name": "5 Ronin (2010)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/459",
"name": "Agent X (2002 - 2004)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/454",
"name": "Amazing Spider-Man (1999 - 2013)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1945",
"name": "Avengers: The Initiative (2007 - 2010)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/15370",
"name": "Battle Scars (2011 - 2012)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/4002",
"name": "Cable (2008 - 2010)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/693",
"name": "Cable & Deadpool (2004 - 2008)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/13886",
"name": "Cable & Deadpool MGC (2011)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1209",
"name": "Cable & Deadpool Vol. 1: If Looks Could Kill (2007)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1338",
"name": "Cable & Deadpool Vol. 2: The Burnt Offering (2007)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1488",
"name": "Cable & Deadpool Vol. 3: The Human Race (2005)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1578",
"name": "Cable & Deadpool Vol. 4: Bosom Buddies (2006)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1676",
"name": "Cable & Deadpool Vol. 5: Living Legends (2006)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1960",
"name": "Cable & Deadpool Vol. 6: Paved with Good Intentions (2007)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/2710",
"name": "Cable & Deadpool Vol. 7: Separation Anxiety (2007)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1487",
"name": "Cable/Deadpool Vol. 3: The Human Race (2005)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1577",
"name": "Cable/Deadpool Vol. 4: Bosom Buddies (2006)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/10105",
"name": "Civil War: X-Men (2011)"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/series/1962",
"name": "Civil War: X-Men Universe (2007)"
}
],
"returned": 20
},
"stories": {
"available": 600,
"collectionURI": "//gateway.marvel.com/v1/public/characters/1009268/stories",
"items": [
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/1135",
"name": "Cover #1135",
"type": "cover"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/1619",
"name": "Interior #1619",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2464",
"name": "3 of 6 - The Passion of the Cable",
"type": "cover"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2465",
"name": "3 of 6 - The Passion of the Cable",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2467",
"name": "Interior #2467",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2469",
"name": "Interior #2469",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2471",
"name": "Interior #2471",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2473",
"name": "Interior #2473",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2475",
"name": "Interior #2475",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2477",
"name": "Interior #2477",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2479",
"name": "Interior #2479",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2481",
"name": "4 of 6 - The Passion of the Cable",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2483",
"name": "5 of 6 - The Passion of the Cable",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2484",
"name": "2 of 2 - Thirty Pieces",
"type": "cover"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2485",
"name": "2 of 2 - Thirty Pieces",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2487",
"name": "1 of 2 - A Murder in Paradise",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2488",
"name": "2 of 2 - A Murder in Paradise",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2489",
"name": "1 of 4 - Enema of the State",
"type": "cover"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2490",
"name": "1 of 4 - Enema of the State",
"type": "interiorStory"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/stories/2492",
"name": "2 of 4 - Enema of the State",
"type": "interiorStory"
}
],
"returned": 20
},
"events": {
"available": 9,
"collectionURI": "//gateway.marvel.com/v1/public/characters/1009268/events",
"items": [
{
"resourceURI": "//gateway.marvel.com/v1/public/events/227",
"name": "Age of Apocalypse"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/238",
"name": "Civil War"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/318",
"name": "Dark Reign"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/251",
"name": "House of M"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/298",
"name": "Messiah War"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/269",
"name": "Secret Invasion"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/309",
"name": "Shattered Heroes"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/308",
"name": "X-Men: Regenesis"
},
{
"resourceURI": "//gateway.marvel.com/v1/public/events/306",
"name": "X-Men: Schism"
}
],
"returned": 9
},
"urls": [
{
"type": "detail",
"url": "//marvel.com/comics/characters/1009268/deadpool?utm_campaign=apiRef&utm_source=085672cb3bc7ad07244dbd1a1690eac3"
},
{
"type": "wiki",
"url": "//marvel.com/universe/Deadpool_(Wade_Wilson)?utm_campaign=apiRef&utm_source=085672cb3bc7ad07244dbd1a1690eac3"
},
{
"type": "comiclink",
"url": "//marvel.com/comics/characters/1009268/deadpool?utm_campaign=apiRef&utm_source=085672cb3bc7ad07244dbd1a1690eac3"
}
]
}
]
}
}
{{tab.selects[4].marvel}}
{{tab.selects[5].description}}
Languages: {{tab.selects[5].languages}}
{{tab.selects[5].jmxexample}}
{{tab.selects[6].description}}
Languages: {{tab.selects[6].languages}}
{{tab.selects[6].testcomplete}}
{{tab.selects[6].sikuli}}
{{tab.selects[6].robotframework}}