selenium-state-machine
Version:
Write Selenium tests using state machines
93 lines (92 loc) • 2.75 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValueDependency = exports.StaleDependencyReferenceError = void 0;
const selenium_webdriver_1 = require("selenium-webdriver");
const Error_1 = require("./Error");
/**
* Stale dependency has become stale. It extends StaleElementReferenceError but it tracks which
* element is stale.
*/
class StaleDependencyReferenceError extends selenium_webdriver_1.error.StaleElementReferenceError {
constructor(dependency) {
super();
this.dependency = dependency;
}
}
exports.StaleDependencyReferenceError = StaleDependencyReferenceError;
/**
* Generic dependency type.
*/
class ValueDependency {
constructor(config) {
this._value = config?.value;
this._name = config?.name;
this.invalidate = this.invalidate.bind(this);
}
invalidate() {
this._value = undefined;
throw new StaleDependencyReferenceError(this);
}
/**
* Get who provides the dependency.
*/
get provider() {
return this._provider;
}
/**
* Set new dependency provider. Must be first in invalid state before assigning.
*/
set provider(v) {
if (this._provider !== undefined && this._provider.name !== v?.name) {
throw new Error_1.CriticalError(`provider cannot be set more than once, "${this.name}" has conflicting providers.`);
}
this._provider = v;
}
/**
* Check if dependency is in ok state.
*/
get ready() {
return this._value !== undefined;
}
get name() {
if (this._name === undefined) {
throw new Error_1.CriticalError('dependency is missing name');
}
return this._name;
}
set name(v) {
this._name = v;
}
get id() {
return this.name;
}
get value() {
if (this._value === undefined) {
throw new Error_1.CriticalError(`${this._name ? `[${this._name}] ` : ''}dependency not set.`);
}
return this._value;
}
/**
* Assign new value to dependency. This is immutable method.
* @param value new value
* @param provider new provider
* @returns new Dependency with new values
*/
set(value, provider) {
return this.clone({ value, provider });
}
/**
* Make clone of the dependency.
* @param newValues optional new values
* @returns new Dependency
*/
clone(newValues) {
const dep = new ValueDependency({
name: newValues?.name ?? this._name,
value: newValues?.value ?? this._value
});
dep.provider = newValues.provider;
return dep;
}
}
exports.ValueDependency = ValueDependency;