123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- const selenium_webdriver_1 = require("selenium-webdriver");
- const util_1 = require("./util");
- /**
- * Represents a library of canned expected conditions that are useful for
- * protractor, especially when dealing with non-angular apps.
- *
- * Each condition returns a function that evaluates to a promise. You may mix
- * multiple conditions using `and`, `or`, and/or `not`. You may also
- * mix these conditions with any other conditions that you write.
- *
- * See ExpectedCondition Class in Selenium WebDriver codebase.
- * http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
- *
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * var button = $('#xyz');
- * var isClickable = EC.elementToBeClickable(button);
- *
- * browser.get(URL);
- * browser.wait(isClickable, 5000); //wait for an element to become clickable
- * button.click();
- *
- * // You can define your own expected condition, which is a function that
- * // takes no parameter and evaluates to a promise of a boolean.
- * var urlChanged = function() {
- * return browser.getCurrentUrl().then(function(url) {
- * return url === 'http://www.angularjs.org';
- * });
- * };
- *
- * // You can customize the conditions with EC.and, EC.or, and EC.not.
- * // Here's a condition to wait for url to change, $('abc') element to contain
- * // text 'bar', and button becomes clickable.
- * var condition = EC.and(urlChanged, EC.textToBePresentInElement($('abc'),
- * 'bar'), isClickable);
- * browser.get(URL);
- * browser.wait(condition, 5000); //wait for condition to be true.
- * button.click();
- *
- * @alias ExpectedConditions
- * @constructor
- */
- class ProtractorExpectedConditions {
- constructor(browser) {
- this.browser = browser;
- }
- ;
- /**
- * Negates the result of a promise.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * var titleIsNotFoo = EC.not(EC.titleIs('Foo'));
- * // Waits for title to become something besides 'foo'.
- * browser.wait(titleIsNotFoo, 5000);
- *
- * @alias ExpectedConditions.not
- * @param {!function} expectedCondition
- *
- * @returns {!function} An expected condition that returns the negated value.
- */
- not(expectedCondition) {
- return () => {
- return expectedCondition().then((bool) => {
- return !bool;
- });
- };
- }
- /**
- * Helper function that is equivalent to the logical_and if defaultRet==true,
- * or logical_or if defaultRet==false
- *
- * @private
- * @param {boolean} defaultRet
- * @param {Array.<Function>} fns An array of expected conditions to chain.
- *
- * @returns {!function} An expected condition that returns a promise which
- * evaluates to the result of the logical chain.
- */
- logicalChain_(defaultRet, fns) {
- let self = this;
- return () => {
- if (fns.length === 0) {
- return defaultRet;
- }
- let fn = fns[0];
- return fn().then((bool) => {
- if (bool === defaultRet) {
- return self.logicalChain_(defaultRet, fns.slice(1))();
- }
- else {
- return !defaultRet;
- }
- });
- };
- }
- /**
- * Chain a number of expected conditions using logical_and, short circuiting
- * at the first expected condition that evaluates to false.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * var titleContainsFoo = EC.titleContains('Foo');
- * var titleIsNotFooBar = EC.not(EC.titleIs('FooBar'));
- * // Waits for title to contain 'Foo', but is not 'FooBar'
- * browser.wait(EC.and(titleContainsFoo, titleIsNotFooBar), 5000);
- *
- * @alias ExpectedConditions.and
- * @param {Array.<Function>} fns An array of expected conditions to 'and'
- * together.
- *
- * @returns {!function} An expected condition that returns a promise which
- * evaluates to the result of the logical and.
- */
- and(...args) {
- return this.logicalChain_(true, args);
- }
- /**
- * Chain a number of expected conditions using logical_or, short circuiting
- * at the first expected condition that evaluates to true.
- *
- * @alias ExpectedConditions.or
- * @example
- * var EC = protractor.ExpectedConditions;
- * var titleContainsFoo = EC.titleContains('Foo');
- * var titleContainsBar = EC.titleContains('Bar');
- * // Waits for title to contain either 'Foo' or 'Bar'
- * browser.wait(EC.or(titleContainsFoo, titleContainsBar), 5000);
- *
- * @param {Array.<Function>} fns An array of expected conditions to 'or'
- * together.
- *
- * @returns {!function} An expected condition that returns a promise which
- * evaluates to the result of the logical or.
- */
- or(...args) {
- return this.logicalChain_(false, args);
- }
- /**
- * Expect an alert to be present.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for an alert pops up.
- * browser.wait(EC.alertIsPresent(), 5000);
- *
- * @alias ExpectedConditions.alertIsPresent
- * @returns {!function} An expected condition that returns a promise
- * representing whether an alert is present.
- */
- alertIsPresent() {
- return () => {
- return this.browser.driver.switchTo().alert().then(() => {
- return true;
- }, (err) => {
- if (err instanceof selenium_webdriver_1.error.NoSuchAlertError) {
- return false;
- }
- else {
- throw err;
- }
- });
- };
- }
- /**
- * An Expectation for checking an element is visible and enabled such that you
- * can click it.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'abc' to be clickable.
- * browser.wait(EC.elementToBeClickable($('#abc')), 5000);
- *
- * @alias ExpectedConditions.elementToBeClickable
- * @param {!ElementFinder} elementFinder The element to check
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the element is clickable.
- */
- elementToBeClickable(elementFinder) {
- return this.and(this.visibilityOf(elementFinder), () => {
- return elementFinder.isEnabled().then(util_1.passBoolean, util_1.falseIfMissing);
- });
- }
- /**
- * An expectation for checking if the given text is present in the
- * element. Returns false if the elementFinder does not find an element.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'abc' to contain the text 'foo'.
- * browser.wait(EC.textToBePresentInElement($('#abc'), 'foo'), 5000);
- *
- * @alias ExpectedConditions.textToBePresentInElement
- * @param {!ElementFinder} elementFinder The element to check
- * @param {!string} text The text to verify against
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the text is present in the element.
- */
- textToBePresentInElement(elementFinder, text) {
- let hasText = () => {
- return elementFinder.getText().then((actualText) => {
- // MSEdge does not properly remove newlines, which causes false
- // negatives
- return actualText.replace(/\r?\n|\r/g, '').indexOf(text) > -1;
- }, util_1.falseIfMissing);
- };
- return this.and(this.presenceOf(elementFinder), hasText);
- }
- /**
- * An expectation for checking if the given text is present in the element’s
- * value. Returns false if the elementFinder does not find an element.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'myInput' to contain the input 'foo'.
- * browser.wait(EC.textToBePresentInElementValue($('#myInput'), 'foo'), 5000);
- *
- * @alias ExpectedConditions.textToBePresentInElementValue
- * @param {!ElementFinder} elementFinder The element to check
- * @param {!string} text The text to verify against
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the text is present in the element's value.
- */
- textToBePresentInElementValue(elementFinder, text) {
- let hasText = () => {
- return elementFinder.getAttribute('value').then((actualText) => {
- return actualText.indexOf(text) > -1;
- }, util_1.falseIfMissing);
- };
- return this.and(this.presenceOf(elementFinder), hasText);
- }
- /**
- * An expectation for checking that the title contains a case-sensitive
- * substring.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the title to contain 'foo'.
- * browser.wait(EC.titleContains('foo'), 5000);
- *
- * @alias ExpectedConditions.titleContains
- * @param {!string} title The fragment of title expected
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the title contains the string.
- */
- titleContains(title) {
- return () => {
- return this.browser.driver.getTitle().then((actualTitle) => {
- return actualTitle.indexOf(title) > -1;
- });
- };
- }
- /**
- * An expectation for checking the title of a page.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the title to be 'foo'.
- * browser.wait(EC.titleIs('foo'), 5000);
- *
- * @alias ExpectedConditions.titleIs
- * @param {!string} title The expected title, which must be an exact match.
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the title equals the string.
- */
- titleIs(title) {
- return () => {
- return this.browser.driver.getTitle().then((actualTitle) => {
- return actualTitle === title;
- });
- };
- }
- /**
- * An expectation for checking that the URL contains a case-sensitive
- * substring.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the URL to contain 'foo'.
- * browser.wait(EC.urlContains('foo'), 5000);
- *
- * @alias ExpectedConditions.urlContains
- * @param {!string} url The fragment of URL expected
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the URL contains the string.
- */
- urlContains(url) {
- return () => {
- return this.browser.driver.getCurrentUrl().then((actualUrl) => {
- return actualUrl.indexOf(url) > -1;
- });
- };
- }
- /**
- * An expectation for checking the URL of a page.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the URL to be 'foo'.
- * browser.wait(EC.urlIs('foo'), 5000);
- *
- * @alias ExpectedConditions.urlIs
- * @param {!string} url The expected URL, which must be an exact match.
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the url equals the string.
- */
- urlIs(url) {
- return () => {
- return this.browser.driver.getCurrentUrl().then((actualUrl) => {
- return actualUrl === url;
- });
- };
- }
- /**
- * An expectation for checking that an element is present on the DOM
- * of a page. This does not necessarily mean that the element is visible.
- * This is the opposite of 'stalenessOf'.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'abc' to be present on the dom.
- * browser.wait(EC.presenceOf($('#abc')), 5000);
- *
- * @alias ExpectedConditions.presenceOf
- * @param {!ElementFinder} elementFinder The element to check
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the element is present.
- */
- presenceOf(elementFinder) {
- return elementFinder.isPresent.bind(elementFinder);
- }
- ;
- /**
- * An expectation for checking that an element is not attached to the DOM
- * of a page. This is the opposite of 'presenceOf'.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'abc' to be no longer present on the dom.
- * browser.wait(EC.stalenessOf($('#abc')), 5000);
- *
- * @alias ExpectedConditions.stalenessOf
- * @param {!ElementFinder} elementFinder The element to check
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the element is stale.
- */
- stalenessOf(elementFinder) {
- return this.not(this.presenceOf(elementFinder));
- }
- /**
- * An expectation for checking that an element is present on the DOM of a
- * page and visible. Visibility means that the element is not only displayed
- * but also has a height and width that is greater than 0. This is the
- * opposite
- * of 'invisibilityOf'.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'abc' to be visible on the dom.
- * browser.wait(EC.visibilityOf($('#abc')), 5000);
- *
- * @alias ExpectedConditions.visibilityOf
- * @param {!ElementFinder} elementFinder The element to check
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the element is visible.
- */
- visibilityOf(elementFinder) {
- return this.and(this.presenceOf(elementFinder), () => {
- return elementFinder.isDisplayed().then(util_1.passBoolean, util_1.falseIfMissing);
- });
- }
- /**
- * An expectation for checking that an element is either invisible or not
- * present on the DOM. This is the opposite of 'visibilityOf'.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'abc' to be no longer visible on the dom.
- * browser.wait(EC.invisibilityOf($('#abc')), 5000);
- *
- * @alias ExpectedConditions.invisibilityOf
- * @param {!ElementFinder} elementFinder The element to check
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the element is invisible.
- */
- invisibilityOf(elementFinder) {
- return this.not(this.visibilityOf(elementFinder));
- }
- /**
- * An expectation for checking the selection is selected.
- *
- * @example
- * var EC = protractor.ExpectedConditions;
- * // Waits for the element with id 'myCheckbox' to be selected.
- * browser.wait(EC.elementToBeSelected($('#myCheckbox')), 5000);
- *
- * @alias ExpectedConditions.elementToBeSelected
- * @param {!ElementFinder} elementFinder The element to check
- *
- * @returns {!function} An expected condition that returns a promise
- * representing whether the element is selected.
- */
- elementToBeSelected(elementFinder) {
- return this.and(this.presenceOf(elementFinder), () => {
- return elementFinder.isSelected().then(util_1.passBoolean, util_1.falseIfMissing);
- });
- }
- }
- exports.ProtractorExpectedConditions = ProtractorExpectedConditions;
- //# sourceMappingURL=expectedConditions.js.map
|