element.d.ts 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871
  1. import { By, promise as wdpromise, WebElement, WebElementPromise } from 'selenium-webdriver';
  2. import { ElementHelper, ProtractorBrowser } from './browser';
  3. import { Locator } from './locators';
  4. export declare class WebdriverWebElement {
  5. }
  6. export interface WebdriverWebElement extends WebElement {
  7. [key: string]: any;
  8. }
  9. /**
  10. * ElementArrayFinder is used for operations on an array of elements (as opposed
  11. * to a single element).
  12. *
  13. * The ElementArrayFinder is used to set up a chain of conditions that identify
  14. * an array of elements. In particular, you can call all(locator) and
  15. * filter(filterFn) to return a new ElementArrayFinder modified by the
  16. * conditions, and you can call get(index) to return a single ElementFinder at
  17. * position 'index'.
  18. *
  19. * Similar to jquery, ElementArrayFinder will search all branches of the DOM
  20. * to find the elements that satisfy the conditions (i.e. all, filter, get).
  21. * However, an ElementArrayFinder will not actually retrieve the elements until
  22. * an action is called, which means it can be set up in helper files (i.e.
  23. * page objects) before the page is available, and reused as the page changes.
  24. *
  25. * You can treat an ElementArrayFinder as an array of WebElements for most
  26. * purposes, in particular, you may perform actions (i.e. click, getText) on
  27. * them as you would an array of WebElements. The action will apply to
  28. * every element identified by the ElementArrayFinder. ElementArrayFinder
  29. * extends Promise, and once an action is performed on an ElementArrayFinder,
  30. * the latest result can be accessed using then, and will be returned as an
  31. * array of the results; the array has length equal to the length of the
  32. * elements found by the ElementArrayFinder and each result represents the
  33. * result of performing the action on the element. Unlike a WebElement, an
  34. * ElementArrayFinder will wait for the angular app to settle before
  35. * performing finds or actions.
  36. *
  37. * @alias element.all(locator)
  38. * @view
  39. * <ul class="items">
  40. * <li>First</li>
  41. * <li>Second</li>
  42. * <li>Third</li>
  43. * </ul>
  44. *
  45. * @example
  46. * element.all(by.css('.items li')).then(function(items) {
  47. * expect(items.length).toBe(3);
  48. * expect(items[0].getText()).toBe('First');
  49. * });
  50. *
  51. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  52. *
  53. * $$('.items li').then(function(items) {
  54. * expect(items.length).toBe(3);
  55. * expect(items[0].getText()).toBe('First');
  56. * });
  57. *
  58. * @constructor
  59. * @param {ProtractorBrowser} browser A browser instance.
  60. * @param {function(): Array.<webdriver.WebElement>} getWebElements A function
  61. * that returns a list of the underlying Web Elements.
  62. * @param {webdriver.Locator} locator The most relevant locator. It is only
  63. * used for error reporting and ElementArrayFinder.locator.
  64. * @param {Array.<webdriver.promise.Promise>} opt_actionResults An array
  65. * of promises which will be retrieved with then. Resolves to the latest
  66. * action result, or null if no action has been called.
  67. * @returns {ElementArrayFinder}
  68. */
  69. export declare class ElementArrayFinder extends WebdriverWebElement {
  70. browser_: ProtractorBrowser;
  71. getWebElements: () => wdpromise.Promise<WebElement[]>;
  72. locator_: any;
  73. actionResults_: wdpromise.Promise<any>;
  74. constructor(browser_: ProtractorBrowser, getWebElements?: () => wdpromise.Promise<WebElement[]>, locator_?: any, actionResults_?: wdpromise.Promise<any>);
  75. /**
  76. * Create a shallow copy of ElementArrayFinder.
  77. *
  78. * @returns {!ElementArrayFinder} A shallow copy of this.
  79. */
  80. clone(): ElementArrayFinder;
  81. /**
  82. * Calls to ElementArrayFinder may be chained to find an array of elements
  83. * using the current elements in this ElementArrayFinder as the starting
  84. * point. This function returns a new ElementArrayFinder which would contain
  85. * the children elements found (and could also be empty).
  86. *
  87. * @alias element.all(locator).all(locator)
  88. * @view
  89. * <div id='id1' class="parent">
  90. * <ul>
  91. * <li class="foo">1a</li>
  92. * <li class="baz">1b</li>
  93. * </ul>
  94. * </div>
  95. * <div id='id2' class="parent">
  96. * <ul>
  97. * <li class="foo">2a</li>
  98. * <li class="bar">2b</li>
  99. * </ul>
  100. * </div>
  101. *
  102. * @example
  103. * let foo = element.all(by.css('.parent')).all(by.css('.foo'));
  104. * expect(foo.getText()).toEqual(['1a', '2a']);
  105. * let baz = element.all(by.css('.parent')).all(by.css('.baz'));
  106. * expect(baz.getText()).toEqual(['1b']);
  107. * let nonexistent = element.all(by.css('.parent'))
  108. * .all(by.css('.NONEXISTENT'));
  109. * expect(nonexistent.getText()).toEqual(['']);
  110. *
  111. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  112. *
  113. * let foo = $$('.parent').$$('.foo');
  114. * expect(foo.getText()).toEqual(['1a', '2a']);
  115. * let baz = $$('.parent').$$('.baz');
  116. * expect(baz.getText()).toEqual(['1b']);
  117. * let nonexistent = $$('.parent').$$('.NONEXISTENT');
  118. * expect(nonexistent.getText()).toEqual(['']);
  119. *
  120. * @param {webdriver.Locator} subLocator
  121. * @returns {ElementArrayFinder}
  122. */
  123. all(locator: Locator): ElementArrayFinder;
  124. /**
  125. * Apply a filter function to each element within the ElementArrayFinder.
  126. * Returns a new ElementArrayFinder with all elements that pass the filter
  127. * function. The filter function receives the ElementFinder as the first
  128. * argument and the index as a second arg. This does not actually retrieve
  129. * the underlying list of elements, so it can be used in page objects.
  130. *
  131. * @alias element.all(locator).filter(filterFn)
  132. * @view
  133. * <ul class="items">
  134. * <li class="one">First</li>
  135. * <li class="two">Second</li>
  136. * <li class="three">Third</li>
  137. * </ul>
  138. *
  139. * @example
  140. * element.all(by.css('.items li')).filter(function(elem, index) {
  141. * return elem.getText().then(function(text) {
  142. * return text === 'Third';
  143. * });
  144. * }).first().click();
  145. *
  146. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  147. *
  148. * $$('.items li').filter(function(elem, index) {
  149. * return elem.getText().then(function(text) {
  150. * return text === 'Third';
  151. * });
  152. * }).first().click();
  153. *
  154. * @param {function(ElementFinder, number): webdriver.WebElement.Promise}
  155. * filterFn
  156. * Filter function that will test if an element should be returned.
  157. * filterFn can either return a boolean or a promise that resolves to a
  158. * boolean
  159. * @returns {!ElementArrayFinder} A ElementArrayFinder that represents an
  160. * array
  161. * of element that satisfy the filter function.
  162. */
  163. filter(filterFn: (element: ElementFinder, index?: number) => boolean | wdpromise.Promise<boolean>): ElementArrayFinder;
  164. /**
  165. * Get an element within the ElementArrayFinder by index. The index starts at 0.
  166. * Negative indices are wrapped (i.e. -i means ith element from last)
  167. * This does not actually retrieve the underlying element.
  168. *
  169. * @alias element.all(locator).get(index)
  170. * @view
  171. * <ul class="items">
  172. * <li>First</li>
  173. * <li>Second</li>
  174. * <li>Third</li>
  175. * </ul>
  176. *
  177. * @example
  178. * let list = element.all(by.css('.items li'));
  179. * expect(list.get(0).getText()).toBe('First');
  180. * expect(list.get(1).getText()).toBe('Second');
  181. *
  182. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  183. *
  184. * let list = $$('.items li');
  185. * expect(list.get(0).getText()).toBe('First');
  186. * expect(list.get(1).getText()).toBe('Second');
  187. *
  188. * @param {number|webdriver.promise.Promise} index Element index.
  189. * @returns {ElementFinder} finder representing element at the given index.
  190. */
  191. get(index: number | wdpromise.Promise<number>): ElementFinder;
  192. /**
  193. * Get the first matching element for the ElementArrayFinder. This does not
  194. * actually retrieve the underlying element.
  195. *
  196. * @alias element.all(locator).first()
  197. * @view
  198. * <ul class="items">
  199. * <li>First</li>
  200. * <li>Second</li>
  201. * <li>Third</li>
  202. * </ul>
  203. *
  204. * @example
  205. * let first = element.all(by.css('.items li')).first();
  206. * expect(first.getText()).toBe('First');
  207. *
  208. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  209. *
  210. * let first = $$('.items li').first();
  211. * expect(first.getText()).toBe('First');
  212. *
  213. * @returns {ElementFinder} finder representing the first matching element
  214. */
  215. first(): ElementFinder;
  216. /**
  217. * Get the last matching element for the ElementArrayFinder. This does not
  218. * actually retrieve the underlying element.
  219. *
  220. * @alias element.all(locator).last()
  221. * @view
  222. * <ul class="items">
  223. * <li>First</li>
  224. * <li>Second</li>
  225. * <li>Third</li>
  226. * </ul>
  227. *
  228. * @example
  229. * let last = element.all(by.css('.items li')).last();
  230. * expect(last.getText()).toBe('Third');
  231. *
  232. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  233. *
  234. * let last = $$('.items li').last();
  235. * expect(last.getText()).toBe('Third');
  236. *
  237. * @returns {ElementFinder} finder representing the last matching element
  238. */
  239. last(): ElementFinder;
  240. /**
  241. * Shorthand function for finding arrays of elements by css.
  242. * `element.all(by.css('.abc'))` is equivalent to `$$('.abc')`
  243. *
  244. * @alias $$(cssSelector)
  245. * @view
  246. * <div class="count">
  247. * <span class="one">First</span>
  248. * <span class="two">Second</span>
  249. * </div>
  250. *
  251. * @example
  252. * // The following two blocks of code are equivalent.
  253. * let list = element.all(by.css('.count span'));
  254. * expect(list.count()).toBe(2);
  255. * expect(list.get(0).getText()).toBe('First');
  256. * expect(list.get(1).getText()).toBe('Second');
  257. *
  258. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  259. *
  260. * let list = $$('.count span');
  261. * expect(list.count()).toBe(2);
  262. * expect(list.get(0).getText()).toBe('First');
  263. * expect(list.get(1).getText()).toBe('Second');
  264. *
  265. * @param {string} selector a css selector
  266. * @returns {ElementArrayFinder} which identifies the
  267. * array of the located {@link webdriver.WebElement}s.
  268. */
  269. $$(selector: string): ElementArrayFinder;
  270. /**
  271. * Returns an ElementFinder representation of ElementArrayFinder. It ensures
  272. * that the ElementArrayFinder resolves to one and only one underlying
  273. * element.
  274. *
  275. * @returns {ElementFinder} An ElementFinder representation
  276. * @private
  277. */
  278. toElementFinder_(): ElementFinder;
  279. /**
  280. * Count the number of elements represented by the ElementArrayFinder.
  281. *
  282. * @alias element.all(locator).count()
  283. * @view
  284. * <ul class="items">
  285. * <li>First</li>
  286. * <li>Second</li>
  287. * <li>Third</li>
  288. * </ul>
  289. *
  290. * @example
  291. * let list = element.all(by.css('.items li'));
  292. * expect(list.count()).toBe(3);
  293. *
  294. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  295. *
  296. * let list = $$('.items li');
  297. * expect(list.count()).toBe(3);
  298. *
  299. * @returns {!webdriver.promise.Promise} A promise which resolves to the
  300. * number of elements matching the locator.
  301. */
  302. count(): wdpromise.Promise<number>;
  303. /**
  304. * Returns true if there are any elements present that match the finder.
  305. *
  306. * @alias element.all(locator).isPresent()
  307. *
  308. * @example
  309. * expect($('.item').isPresent()).toBeTruthy();
  310. *
  311. * @returns {Promise<boolean>}
  312. */
  313. isPresent(): wdpromise.Promise<boolean>;
  314. /**
  315. * Returns the most relevant locator.
  316. *
  317. * @example
  318. * // returns by.css('#ID1')
  319. * $('#ID1').locator();
  320. *
  321. * // returns by.css('#ID2')
  322. * $('#ID1').$('#ID2').locator();
  323. *
  324. * // returns by.css('#ID1')
  325. * $$('#ID1').filter(filterFn).get(0).click().locator();
  326. *
  327. * @returns {webdriver.Locator}
  328. */
  329. locator(): Locator;
  330. /**
  331. * Apply an action function to every element in the ElementArrayFinder,
  332. * and return a new ElementArrayFinder that contains the results of the
  333. * actions.
  334. *
  335. * @param {function(ElementFinder)} actionFn
  336. *
  337. * @returns {ElementArrayFinder}
  338. * @private
  339. */
  340. private applyAction_(actionFn);
  341. /**
  342. * Represents the ElementArrayFinder as an array of ElementFinders.
  343. *
  344. * @returns {Array.<ElementFinder>} Return a promise, which resolves to a list
  345. * of ElementFinders specified by the locator.
  346. */
  347. asElementFinders_(): wdpromise.Promise<ElementFinder[]>;
  348. /**
  349. * Retrieve the elements represented by the ElementArrayFinder. The input
  350. * function is passed to the resulting promise, which resolves to an
  351. * array of ElementFinders.
  352. *
  353. * @alias element.all(locator).then(thenFunction)
  354. * @view
  355. * <ul class="items">
  356. * <li>First</li>
  357. * <li>Second</li>
  358. * <li>Third</li>
  359. * </ul>
  360. *
  361. * @example
  362. * element.all(by.css('.items li')).then(function(arr) {
  363. * expect(arr.length).toEqual(3);
  364. * });
  365. *
  366. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  367. *
  368. * $$('.items li').then(function(arr) {
  369. * expect(arr.length).toEqual(3);
  370. * });
  371. *
  372. * @param {function(Array.<ElementFinder>)} fn
  373. * @param {function(Error)} errorFn
  374. *
  375. * @returns {!webdriver.promise.Promise} A promise which will resolve to
  376. * an array of ElementFinders represented by the ElementArrayFinder.
  377. */
  378. then<T>(fn?: (value: ElementFinder[] | any[]) => T | wdpromise.IThenable<T>, errorFn?: (error: any) => any): wdpromise.Promise<T>;
  379. /**
  380. * Calls the input function on each ElementFinder represented by the
  381. * ElementArrayFinder.
  382. *
  383. * @alias element.all(locator).each(eachFunction)
  384. * @view
  385. * <ul class="items">
  386. * <li>First</li>
  387. * <li>Second</li>
  388. * <li>Third</li>
  389. * </ul>
  390. *
  391. * @example
  392. * element.all(by.css('.items li')).each(function(element, index) {
  393. * // Will print 0 First, 1 Second, 2 Third.
  394. * element.getText().then(function (text) {
  395. * console.log(index, text);
  396. * });
  397. * });
  398. *
  399. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  400. *
  401. * $$('.items li').each(function(element, index) {
  402. * // Will print 0 First, 1 Second, 2 Third.
  403. * element.getText().then(function (text) {
  404. * console.log(index, text);
  405. * });
  406. * });
  407. *
  408. * @param {function(ElementFinder)} fn Input function
  409. *
  410. * @returns {!webdriver.promise.Promise} A promise that will resolve when the
  411. * function has been called on all the ElementFinders. The promise will
  412. * resolve to null.
  413. */
  414. each(fn: (elementFinder?: ElementFinder, index?: number) => any): wdpromise.Promise<any>;
  415. /**
  416. * Apply a map function to each element within the ElementArrayFinder. The
  417. * callback receives the ElementFinder as the first argument and the index as
  418. * a second arg.
  419. *
  420. * @alias element.all(locator).map(mapFunction)
  421. * @view
  422. * <ul class="items">
  423. * <li class="one">First</li>
  424. * <li class="two">Second</li>
  425. * <li class="three">Third</li>
  426. * </ul>
  427. *
  428. * @example
  429. * let items = element.all(by.css('.items li')).map(function(elm, index) {
  430. * return {
  431. * index: index,
  432. * text: elm.getText(),
  433. * class: elm.getAttribute('class')
  434. * };
  435. * });
  436. * expect(items).toEqual([
  437. * {index: 0, text: 'First', class: 'one'},
  438. * {index: 1, text: 'Second', class: 'two'},
  439. * {index: 2, text: 'Third', class: 'three'}
  440. * ]);
  441. *
  442. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  443. *
  444. * let items = $$('.items li').map(function(elm, index) {
  445. * return {
  446. * index: index,
  447. * text: elm.getText(),
  448. * class: elm.getAttribute('class')
  449. * };
  450. * });
  451. * expect(items).toEqual([
  452. * {index: 0, text: 'First', class: 'one'},
  453. * {index: 1, text: 'Second', class: 'two'},
  454. * {index: 2, text: 'Third', class: 'three'}
  455. * ]);
  456. *
  457. * @param {function(ElementFinder, number)} mapFn Map function that
  458. * will be applied to each element.
  459. * @returns {!webdriver.promise.Promise} A promise that resolves to an array
  460. * of values returned by the map function.
  461. */
  462. map<T>(mapFn: (elementFinder?: ElementFinder, index?: number) => T | any): wdpromise.Promise<T[]>;
  463. /**
  464. * Apply a reduce function against an accumulator and every element found
  465. * using the locator (from left-to-right). The reduce function has to reduce
  466. * every element into a single value (the accumulator). Returns promise of
  467. * the accumulator. The reduce function receives the accumulator, current
  468. * ElementFinder, the index, and the entire array of ElementFinders,
  469. * respectively.
  470. *
  471. * @alias element.all(locator).reduce(reduceFn)
  472. * @view
  473. * <ul class="items">
  474. * <li class="one">First</li>
  475. * <li class="two">Second</li>
  476. * <li class="three">Third</li>
  477. * </ul>
  478. *
  479. * @example
  480. * let value = element.all(by.css('.items li')).reduce(function(acc, elem) {
  481. * return elem.getText().then(function(text) {
  482. * return acc + text + ' ';
  483. * });
  484. * }, '');
  485. *
  486. * expect(value).toEqual('First Second Third ');
  487. *
  488. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  489. *
  490. * let value = $$('.items li').reduce(function(acc, elem) {
  491. * return elem.getText().then(function(text) {
  492. * return acc + text + ' ';
  493. * });
  494. * }, '');
  495. *
  496. * expect(value).toEqual('First Second Third ');
  497. *
  498. * @param {function(number, ElementFinder, number, Array.<ElementFinder>)}
  499. * reduceFn Reduce function that reduces every element into a single
  500. * value.
  501. * @param {*} initialValue Initial value of the accumulator.
  502. * @returns {!webdriver.promise.Promise} A promise that resolves to the final
  503. * value of the accumulator.
  504. */
  505. reduce(reduceFn: Function, initialValue: any): wdpromise.Promise<any>;
  506. /**
  507. * Evaluates the input as if it were on the scope of the current underlying
  508. * elements.
  509. *
  510. * @view
  511. * <span class="foo">{{letiableInScope}}</span>
  512. *
  513. * @example
  514. * let value = element.all(by.css('.foo')).evaluate('letiableInScope');
  515. *
  516. * // Or using the shortcut $$() notation instead of element.all(by.css()):
  517. *
  518. * let value = $$('.foo').evaluate('letiableInScope');
  519. *
  520. * @param {string} expression
  521. *
  522. * @returns {ElementArrayFinder} which resolves to the
  523. * evaluated expression for each underlying element.
  524. * The result will be resolved as in
  525. * {@link webdriver.WebDriver.executeScript}. In summary - primitives will
  526. * be resolved as is, functions will be converted to string, and elements
  527. * will be returned as a WebElement.
  528. */
  529. evaluate(expression: string): ElementArrayFinder;
  530. /**
  531. * Determine if animation is allowed on the current underlying elements.
  532. * @param {string} value
  533. *
  534. * @example
  535. * // Turns off ng-animate animations for all elements in the <body>
  536. * element(by.css('body')).allowAnimations(false);
  537. *
  538. * // Or using the shortcut $() notation instead of element(by.css()):
  539. *
  540. * $('body').allowAnimations(false);
  541. *
  542. * @returns {ElementArrayFinder} which resolves to whether animation is
  543. * allowed.
  544. */
  545. allowAnimations(value: boolean): ElementArrayFinder;
  546. }
  547. /**
  548. * The ElementFinder simply represents a single element of an
  549. * ElementArrayFinder (and is more like a convenience object). As a result,
  550. * anything that can be done with an ElementFinder, can also be done using
  551. * an ElementArrayFinder.
  552. *
  553. * The ElementFinder can be treated as a WebElement for most purposes, in
  554. * particular, you may perform actions (i.e. click, getText) on them as you
  555. * would a WebElement. Once an action is performed on an ElementFinder, the
  556. * latest result from the chain can be accessed using the then method.
  557. * Unlike a WebElement, an ElementFinder will wait for angular to settle before
  558. * performing finds or actions.
  559. *
  560. * ElementFinder can be used to build a chain of locators that is used to find
  561. * an element. An ElementFinder does not actually attempt to find the element
  562. * until an action is called, which means they can be set up in helper files
  563. * before the page is available.
  564. *
  565. * @alias element(locator)
  566. * @view
  567. * <span>{{person.name}}</span>
  568. * <span ng-bind="person.email"></span>
  569. * <input type="text" ng-model="person.name"/>
  570. *
  571. * @example
  572. * // Find element with {{scopelet}} syntax.
  573. * element(by.binding('person.name')).getText().then(function(name) {
  574. * expect(name).toBe('Foo');
  575. * });
  576. *
  577. * // Find element with ng-bind="scopelet" syntax.
  578. * expect(element(by.binding('person.email')).getText()).toBe('foo@bar.com');
  579. *
  580. * // Find by model.
  581. * let input = element(by.model('person.name'));
  582. * input.sendKeys('123');
  583. * expect(input.getAttribute('value')).toBe('Foo123');
  584. *
  585. * @constructor
  586. * @extends {webdriver.WebElement}
  587. * @param {ProtractorBrowser} browser_ A browser instance.
  588. * @param {ElementArrayFinder} elementArrayFinder The ElementArrayFinder
  589. * that this is branched from.
  590. * @returns {ElementFinder}
  591. */
  592. export declare class ElementFinder extends WebdriverWebElement {
  593. browser_: ProtractorBrowser;
  594. parentElementArrayFinder: ElementArrayFinder;
  595. elementArrayFinder_: ElementArrayFinder;
  596. then?: (fn: (value: any) => any | wdpromise.IThenable<any>, errorFn?: (error: any) => any) => wdpromise.Promise<any>;
  597. constructor(browser_: ProtractorBrowser, elementArrayFinder: ElementArrayFinder);
  598. static fromWebElement_(browser: ProtractorBrowser, webElem: WebElement, locator?: Locator): ElementFinder;
  599. /**
  600. * Create a shallow copy of ElementFinder.
  601. *
  602. * @returns {!ElementFinder} A shallow copy of this.
  603. */
  604. clone(): ElementFinder;
  605. /**
  606. * @see ElementArrayFinder.prototype.locator
  607. *
  608. * @returns {webdriver.Locator}
  609. */
  610. locator(): any;
  611. /**
  612. * Returns the WebElement represented by this ElementFinder.
  613. * Throws the WebDriver error if the element doesn't exist.
  614. *
  615. * @alias element(locator).getWebElement()
  616. * @view
  617. * <div class="parent">
  618. * some text
  619. * </div>
  620. *
  621. * @example
  622. * // The following four expressions are equivalent.
  623. * $('.parent').getWebElement();
  624. * element(by.css('.parent')).getWebElement();
  625. * browser.driver.findElement(by.css('.parent'));
  626. * browser.findElement(by.css('.parent'));
  627. *
  628. * @returns {webdriver.WebElementPromise}
  629. */
  630. getWebElement(): WebElementPromise;
  631. /**
  632. * Calls to {@code all} may be chained to find an array of elements within a
  633. * parent.
  634. *
  635. * @alias element(locator).all(locator)
  636. * @view
  637. * <div class="parent">
  638. * <ul>
  639. * <li class="one">First</li>
  640. * <li class="two">Second</li>
  641. * <li class="three">Third</li>
  642. * </ul>
  643. * </div>
  644. *
  645. * @example
  646. * let items = element(by.css('.parent')).all(by.tagName('li'));
  647. *
  648. * // Or using the shortcut $() notation instead of element(by.css()):
  649. *
  650. * let items = $('.parent').all(by.tagName('li'));
  651. *
  652. * @param {webdriver.Locator} subLocator
  653. * @returns {ElementArrayFinder}
  654. */
  655. all(subLocator: Locator): ElementArrayFinder;
  656. /**
  657. * Calls to {@code element} may be chained to find elements within a parent.
  658. *
  659. * @alias element(locator).element(locator)
  660. * @view
  661. * <div class="parent">
  662. * <div class="child">
  663. * Child text
  664. * <div>{{person.phone}}</div>
  665. * </div>
  666. * </div>
  667. *
  668. * @example
  669. * // Chain 2 element calls.
  670. * let child = element(by.css('.parent')).
  671. * element(by.css('.child'));
  672. * expect(child.getText()).toBe('Child text\n555-123-4567');
  673. *
  674. * // Chain 3 element calls.
  675. * let triple = element(by.css('.parent')).
  676. * element(by.css('.child')).
  677. * element(by.binding('person.phone'));
  678. * expect(triple.getText()).toBe('555-123-4567');
  679. *
  680. * // Or using the shortcut $() notation instead of element(by.css()):
  681. *
  682. * // Chain 2 element calls.
  683. * let child = $('.parent').$('.child');
  684. * expect(child.getText()).toBe('Child text\n555-123-4567');
  685. *
  686. * // Chain 3 element calls.
  687. * let triple = $('.parent').$('.child').
  688. * element(by.binding('person.phone'));
  689. * expect(triple.getText()).toBe('555-123-4567');
  690. *
  691. * @param {webdriver.Locator} subLocator
  692. * @returns {ElementFinder}
  693. */
  694. element(subLocator: Locator): ElementFinder;
  695. /**
  696. * Calls to {@code $$} may be chained to find an array of elements within a
  697. * parent.
  698. *
  699. * @alias element(locator).all(selector)
  700. * @view
  701. * <div class="parent">
  702. * <ul>
  703. * <li class="one">First</li>
  704. * <li class="two">Second</li>
  705. * <li class="three">Third</li>
  706. * </ul>
  707. * </div>
  708. *
  709. * @example
  710. * let items = element(by.css('.parent')).$$('li');
  711. *
  712. * // Or using the shortcut $() notation instead of element(by.css()):
  713. *
  714. * let items = $('.parent').$$('li');
  715. *
  716. * @param {string} selector a css selector
  717. * @returns {ElementArrayFinder}
  718. */
  719. $$(selector: string): ElementArrayFinder;
  720. /**
  721. * Calls to {@code $} may be chained to find elements within a parent.
  722. *
  723. * @alias element(locator).$(selector)
  724. * @view
  725. * <div class="parent">
  726. * <div class="child">
  727. * Child text
  728. * <div>{{person.phone}}</div>
  729. * </div>
  730. * </div>
  731. *
  732. * @example
  733. * // Chain 2 element calls.
  734. * let child = element(by.css('.parent')).
  735. * $('.child');
  736. * expect(child.getText()).toBe('Child text\n555-123-4567');
  737. *
  738. * // Chain 3 element calls.
  739. * let triple = element(by.css('.parent')).
  740. * $('.child').
  741. * element(by.binding('person.phone'));
  742. * expect(triple.getText()).toBe('555-123-4567');
  743. *
  744. * // Or using the shortcut $() notation instead of element(by.css()):
  745. *
  746. * // Chain 2 element calls.
  747. * let child = $('.parent').$('.child');
  748. * expect(child.getText()).toBe('Child text\n555-123-4567');
  749. *
  750. * // Chain 3 element calls.
  751. * let triple = $('.parent').$('.child').
  752. * element(by.binding('person.phone'));
  753. * expect(triple.getText()).toBe('555-123-4567');
  754. *
  755. * @param {string} selector A css selector
  756. * @returns {ElementFinder}
  757. */
  758. $(selector: string): ElementFinder;
  759. /**
  760. * Determine whether the element is present on the page.
  761. *
  762. * @view
  763. * <span>{{person.name}}</span>
  764. *
  765. * @example
  766. * // Element exists.
  767. * expect(element(by.binding('person.name')).isPresent()).toBe(true);
  768. *
  769. * // Element not present.
  770. * expect(element(by.binding('notPresent')).isPresent()).toBe(false);
  771. *
  772. * @returns {webdriver.promise.Promise<boolean>} which resolves to whether
  773. * the element is present on the page.
  774. */
  775. isPresent(): wdpromise.Promise<boolean>;
  776. /**
  777. * Same as ElementFinder.isPresent(), except this checks whether the element
  778. * identified by the subLocator is present, rather than the current element
  779. * finder, i.e.: `element(by.css('#abc')).element(by.css('#def')).isPresent()`
  780. * is identical to `element(by.css('#abc')).isElementPresent(by.css('#def'))`.
  781. *
  782. * // Or using the shortcut $() notation instead of element(by.css()):
  783. *
  784. * `$('#abc').$('#def').isPresent()` is identical to
  785. * `$('#abc').isElementPresent($('#def'))`.
  786. *
  787. * @see ElementFinder.isPresent
  788. *
  789. * @param {webdriver.Locator} subLocator Locator for element to look for.
  790. * @returns {webdriver.promise.Promise<boolean>} which resolves to whether
  791. * the subelement is present on the page.
  792. */
  793. isElementPresent(subLocator: Locator): wdpromise.Promise<boolean>;
  794. /**
  795. * Evaluates the input as if it were on the scope of the current element.
  796. * @see ElementArrayFinder.prototype.evaluate
  797. *
  798. * @view
  799. * <span id="foo">{{letiableInScope}}</span>
  800. *
  801. * @example
  802. * let value = element(by.id('foo')).evaluate('letiableInScope');
  803. *
  804. * @param {string} expression
  805. *
  806. * @returns {ElementFinder} which resolves to the evaluated expression.
  807. */
  808. evaluate(expression: string): ElementFinder;
  809. /**
  810. * @see ElementArrayFinder.prototype.allowAnimations.
  811. * @param {string} value
  812. *
  813. * @returns {ElementFinder} which resolves to whether animation is allowed.
  814. */
  815. allowAnimations(value: boolean): ElementFinder;
  816. /**
  817. * Compares an element to this one for equality.
  818. *
  819. * @param {!ElementFinder|!webdriver.WebElement} The element to compare to.
  820. *
  821. * @returns {!webdriver.promise.Promise.<boolean>} A promise that will be
  822. * resolved to whether the two WebElements are equal.
  823. */
  824. equals(element: ElementFinder | WebElement): wdpromise.Promise<any>;
  825. }
  826. /**
  827. * Shortcut for querying the document directly with css.
  828. * `element(by.css('.abc'))` is equivalent to `$('.abc')`
  829. *
  830. * @alias $(cssSelector)
  831. * @view
  832. * <div class="count">
  833. * <span class="one">First</span>
  834. * <span class="two">Second</span>
  835. * </div>
  836. *
  837. * @example
  838. * let item = $('.count .two');
  839. * expect(item.getText()).toBe('Second');
  840. *
  841. * @param {string} selector A css selector
  842. * @returns {ElementFinder} which identifies the located
  843. * {@link webdriver.WebElement}
  844. */
  845. export declare let build$: (element: ElementHelper, by: typeof By) => (selector: string) => ElementFinder;
  846. /**
  847. * Shortcut for querying the document directly with css.
  848. * `element.all(by.css('.abc'))` is equivalent to `$$('.abc')`
  849. *
  850. * @alias $$(cssSelector)
  851. * @view
  852. * <div class="count">
  853. * <span class="one">First</span>
  854. * <span class="two">Second</span>
  855. * </div>
  856. *
  857. * @example
  858. * // The following protractor expressions are equivalent.
  859. * let list = element.all(by.css('.count span'));
  860. * expect(list.count()).toBe(2);
  861. *
  862. * list = $$('.count span');
  863. * expect(list.count()).toBe(2);
  864. * expect(list.get(0).getText()).toBe('First');
  865. * expect(list.get(1).getText()).toBe('Second');
  866. *
  867. * @param {string} selector a css selector
  868. * @returns {ElementArrayFinder} which identifies the
  869. * array of the located {@link webdriver.WebElement}s.
  870. */
  871. export declare let build$$: (element: ElementHelper, by: typeof By) => (selector: string) => ElementArrayFinder;