diff --git a/msportalfx-test/msportalfx-test-tests.ts b/msportalfx-test/msportalfx-test-tests.ts
new file mode 100644
index 000000000..4bf402d1b
--- /dev/null
+++ b/msportalfx-test/msportalfx-test-tests.ts
@@ -0,0 +1,81 @@
+
+///
+
+import testFx = require('MsPortalFx-Test');
+
+var galleryPackageName = "My.Package";
+var bladeTitle = "A Service";
+var resourceProvider = 'My.Provider';
+var resourceType = 'myResourceType';
+var resourceName = 'myResource';
+var userName = 'johndoe@johndoe.com';
+var password = '123';
+var resourceId = '/subscriptions/123/resourceGroups/456/providers/My.Provider/myResourceType/myResource';
+var extensionName = 'LocalExtension';
+var label = 'Field label';
+var extensionUrl = 'https://localhost:44300/';
+var voidPromise: Q.Promise;
+var boolPromise: Q.Promise;
+var anyPromise: Q.Promise;
+
+var summaryBlade = new testFx.Blades.Blade(resourceName);
+
+function TestPortal() {
+
+ testFx.portal.portalContext.signInEmail = userName;
+ testFx.portal.portalContext.signInPassword = password;
+ testFx.portal.portalContext.features = [{ name: "greatfeature", value: "true" }];
+ testFx.portal.portalContext.testExtensions = [{ name: extensionName, uri: extensionUrl }];
+
+ anyPromise = testFx.portal.waitForElementLocated(summaryBlade.getLocator(), 30000);
+ anyPromise = testFx.portal.quit();
+ var createBladePromise = testFx.portal.openGalleryCreateBlade(galleryPackageName, bladeTitle, 20000);
+ var browseResourcePromise = testFx.portal.openBrowseBlade(resourceProvider, resourceType, bladeTitle, 20000);
+ var bladePromise = testFx.portal.openResourceBlade(resourceId, summaryBlade.title, 20000)
+ var stringPromise = testFx.portal.takeScreenshot("TestPortal");
+ var stringArrayPromise = testFx.portal.getBrowserLogs(testFx.LogLevel.All);
+}
+
+function TestBlades() {
+ var blade = new testFx.Blades.Blade(resourceName);
+ blade.clickCommand('Delete');
+
+ var createBlade = new testFx.Blades.CreateBlade(bladeTitle);
+ voidPromise = createBlade.actionBar.clickCreate();
+ voidPromise = createBlade.actionBar.clickDelete();
+
+ var browseBlade = new testFx.Blades.BrowseResourceBlade(bladeTitle);
+ voidPromise = browseBlade.selectResource(resourceName);
+
+ var pickerBlade = new testFx.Blades.PickerBlade(bladeTitle);
+ pickerBlade.pickItem('abc');
+}
+
+function TestParts() {
+ var part = new testFx.Parts.Part(summaryBlade.getLocator(), "Roles");
+ voidPromise = part.click();
+ boolPromise = part.isSelected();
+ boolPromise = part.waitUntilLoaded();
+ boolPromise = part.isLoaded();
+
+ var resourceSummary = new testFx.Parts.ResourceSummaryPart(summaryBlade.getLocator());
+ var count = resourceSummary.properties.length;
+}
+
+function TestControls() {
+ var selector = new testFx.Controls.SelectorField(summaryBlade.getLocator(), label);
+ voidPromise = selector.openPicker();
+
+ var creatorAndSelector = new testFx.Controls.CreatorAndSelectorField(summaryBlade.getLocator(), label, label);
+ var creatorAndSelectorPromise = creatorAndSelector.clickCreateNew();
+ creatorAndSelectorPromise = creatorAndSelector.enterNewValue('XYZ');
+
+ var textField = new testFx.Controls.TextField(summaryBlade.getLocator(), "Resource name");
+ var textFieldPromise = textField.sendKeys(resourceName);
+}
+
+function TestActionBars() {
+ var bar = new testFx.ActionBars.ActionBar(summaryBlade.getLocator());
+ voidPromise = bar.clickCreate();
+ voidPromise = bar.clickDelete();
+}
\ No newline at end of file
diff --git a/msportalfx-test/msportalfx-test.d.ts b/msportalfx-test/msportalfx-test.d.ts
new file mode 100644
index 000000000..cb0d6de41
--- /dev/null
+++ b/msportalfx-test/msportalfx-test.d.ts
@@ -0,0 +1,224 @@
+// Type definitions for msportalfx-test
+// Project: https://msazure.visualstudio.com/DefaultCollection/AzureUX/_git/portalfx-msportalfx-test
+// Definitions by: Julio Casal
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module MsPortalTestFx {
+
+ export module Locators {
+ export class Locator {
+ seleniumLocator: any;
+ findElements(context: any): any;
+ toString(): string;
+ }
+
+ export class ContentLocator extends Locator {
+ locators: Array;
+ constructor(innerLocators: Locator[]);
+ findElements(context: any): any;
+ toString(): string;
+ }
+
+ export class ChainedLocator extends Locator {
+ locators: Array;
+ constructor(innerLocators: Locator[]);
+ findElements(context: any): any;
+ toString(): string;
+ }
+
+ export class By {
+ static className(value: string): Locator;
+ static css(value: string): Locator;
+ static id(value: string): Locator;
+ static js(script: any, ...var_args: any[]): Locator;
+ static linkText(value: string): Locator;
+ static name(value: string): Locator;
+ static partialLinkText(value: string): Locator;
+ static tagName(value: string): Locator;
+ static xpath(value: string): Locator;
+ static chained(...values: Locator[]): Locator;
+ static content(...values: Locator[]): Locator;
+ }
+ }
+
+ export module ActionBars {
+ export class ActionBar extends MsPortalTestFx.PortalElement {
+ constructor(parentLocator?: Locators.Locator);
+ clickCreate(): Q.Promise;
+ clickDelete(): Q.Promise;
+ }
+ }
+
+ export module Blades {
+ export class Blade extends MsPortalTestFx.PortalElement {
+ public title: string;
+
+ constructor(title: string);
+ clickCommand(commandText: string): Q.Promise;
+ }
+
+ export class CreateBlade extends Blade {
+ public actionBar: ActionBars.ActionBar;
+ }
+
+ export class BrowseResourceBlade extends Blade {
+ constructor(title: string);
+ selectResource(resourceName: string): Q.Promise;
+ filterItems(filter: string): Q.Promise;
+ }
+
+ export class PickerBlade extends Blade {
+ constructor(title: string);
+ pickItem(item: string): Q.Promise;
+ }
+ }
+
+ export module Controls {
+ export class FormElement extends MsPortalTestFx.PortalElement {
+ protected label: string;
+
+ constructor(baseLocator: Locators.Locator, parentLocator?: Locators.Locator, label?: string);
+ }
+
+ export class CheckBoxField extends FormElement {
+ constructor(parentLocator?: Locators.Locator, label?: string);
+ }
+
+ export class SelectorField extends FormElement {
+ constructor(parentLocator?: Locators.Locator, label?: string);
+ openPicker(): Q.Promise;
+ }
+
+ export class CreatorAndSelectorField extends FormElement {
+ constructor(parentLocator?: Locators.Locator, selectModeLabel?: string, createModeLabel?: string);
+ openPicker(): Q.Promise;
+ clickCreateNew(): Q.Promise;
+ enterNewValue(...var_args: string[]): Q.Promise;
+ }
+
+ export class GridCell extends MsPortalTestFx.PortalElement {
+ constructor(text: string, parentLocator?: Locators.Locator);
+ getLocator(): Locators.Locator;
+ }
+
+ export class TextField extends FormElement {
+ constructor(parentLocator?: Locators.Locator, label?: string, baseLocator?: Locators.Locator);
+ sendKeys(...var_args: string[]): Q.Promise;
+ }
+
+ export class ResourceFilterTextField extends TextField {
+ constructor(parentLocator?: Locators.Locator);
+ }
+ }
+
+ export module Parts {
+ export class Part extends MsPortalTestFx.PortalElement {
+ public innerText: string;
+
+ constructor(parentLocator?: Locators.Locator, innerText?: string, baseLocator?: Locators.Locator);
+ isSelected(): Q.Promise;
+ isLoaded(): Q.Promise;
+ waitUntilLoaded(timeout?: number): Q.Promise;
+ }
+
+ export class PartProperty extends MsPortalTestFx.PortalElement {
+ public name: string;
+
+ constructor(name: string, parentLocator?: Locators.Locator);
+ getValue(): Q.Promise;
+ }
+
+ export class ResourceSummaryPart extends Part {
+ public properties: Array;
+ public resourceGroupProperty: PartProperty;
+
+ constructor(parentLocator?: Locators.Locator);
+ }
+
+ export class Tile extends MsPortalTestFx.PortalElement {
+ public progressLocator: Locators.Locator;
+
+ constructor(parentLocator?: Locators.Locator);
+ }
+ }
+
+ export class PortalElement {
+ protected baseLocator: Locators.Locator;
+ protected parentLocator: Locators.Locator;
+
+ constructor(baseLocator: Locators.Locator, parentLocator?: Locators.Locator);
+ getLocator(): Locators.Locator;
+ click(): Q.Promise;
+ getAttribute(attributeName: string): Q.Promise;
+ }
+
+ export interface TestExtension {
+ name: string;
+ uri: string;
+ }
+
+ export interface Feature {
+ name: string;
+ value: string;
+ }
+
+ export interface PortalContext {
+ capabilities: {
+ browserName: string;
+ chromeOptions: {
+ args: string[]
+ }
+ },
+ chromeDriverPath?: string,
+ portalUrl: string;
+ signInUrl?: string;
+ signInEmail?: string;
+ signInPassword?: string;
+ features?: Feature[];
+ testExtensions?: TestExtension[];
+ }
+
+ export enum LogLevel {
+ All,
+ Debug,
+ Info,
+ Warning,
+ Severe,
+ Off
+ }
+
+ export class Portal {
+ portalContext: PortalContext;
+ click(locator: Locators.Locator): Q.Promise;
+ sendKeys(locator: Locators.Locator, ...var_args: string[]): Q.Promise
+ getText(locator: Locators.Locator): Q.Promise;
+ openGalleryCreateBlade(galleryPackageName: string, bladeTitle: string, timeout?: number): Q.Promise;
+ openBrowseBlade(resourceProvider: string, resourceType: string, bladeTitle: string, timeout?: number): Q.Promise;
+ openResourceBlade(resourceId: string, bladeTitle: string, timeout?: number): Q.Promise;
+ navigateToDeepLink(deepLink: string, timeout?: number): Q.Promise;
+ getAttribute(locator: Locators.Locator, attributeName: string, timeout?: number): Q.Promise;
+ waitForElementNotVisible(locator: Locators.Locator, timeout?: number): Q.Promise;
+ waitUntilElementContainsAttribute(locator: Locators.Locator, attributeName: string, attributeValue: string, timeout?: number): Q.Promise;
+ waitForElementLocated(locator: Locators.Locator, timeout?: number): Q.Promise;
+ takeScreenshot(filePrefix?: string): Q.Promise;
+ goHome(timeout?: number): Q.Promise;
+ getBrowserLogs(level: LogLevel): Q.Promise;
+ applyFeature(name: string, value: string): void;
+ executeScript(script: string): Q.Promise;
+ quit(): Q.Promise;
+ }
+
+ export class SplashScreen extends PortalElement {
+ clickUntrustedExtensionsOkButton(): Q.Promise;
+ }
+
+ export var portal: Portal;
+}
+
+
+
+declare module "MsPortalFx-Test" {
+ export = MsPortalTestFx;
+}
\ No newline at end of file