import { browser, element, by, promise, ElementFinder, ExpectedConditions } from 'protractor'; const githubRegex = /https:\/\/github.com\/angular\/angular\//; export class SitePage { links = element.all(by.css('md-toolbar a')); docsMenuLink = element(by.cssContainingText('aio-top-menu a', 'Docs')); docViewer = element(by.css('aio-doc-viewer')); codeExample = element.all(by.css('aio-doc-viewer pre > code')); ghLink = this.docViewer .all(by.css('a')) .filter((a: ElementFinder) => a.getAttribute('href').then(href => githubRegex.test(href))) .first(); gaReady: promise.Promise; static setWindowWidth(newWidth: number) { const win = browser.driver.manage().window(); return win.getSize().then(oldSize => win.setSize(newWidth, oldSize.height)); } getNavItem(pattern: RegExp) { return element.all(by.css('aio-nav-item .vertical-menu-item')) .filter(element => element.getText().then(text => pattern.test(text))) .first(); } getLink(path) { return element(by.css(`a[href="${path}"]`)); } ga() { return browser.executeScript('return window["gaCalls"]') as promise.Promise; } locationPath() { return browser.executeScript('return document.location.pathname') as promise.Promise; } navigateTo(pageUrl = '') { return browser.get('/' + pageUrl).then(_ => this.replaceGa(_)); } getDocViewerText() { return this.docViewer.getText(); } getInnerHtml(element) { // `getInnerHtml` was removed from webDriver and this is the workaround. // See https://github.com/angular/protractor/blob/master/CHANGELOG.md#breaking-changes return browser.executeScript('return arguments[0].innerHTML;', element); } getScrollTop() { return browser.executeScript('return window.pageYOffset'); } scrollToBottom() { return browser.executeScript('window.scrollTo(0, document.body.scrollHeight)'); } enterSearch(query: string) { const input = element(by.css('.search-container input[type=search]')); input.clear(); input.sendKeys(query); } getSearchResults() { const results = element.all(by.css('.search-results li')); browser.wait(ExpectedConditions.presenceOf(results.first()), 8000); return results; } /** * Replace the ambient Google Analytics tracker with homebrew spy * don't send commands to GA during e2e testing! * @param _ - forward's anything passed in */ private replaceGa(_: any) { this.gaReady = browser.driver.executeScript(() => { // Give ga() a "ready" callback: // https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference window['ga'](() => { window['gaCalls'] = []; window['ga'] = function() { window['gaCalls'].push(arguments); }; }); }) .then(() => { // wait for GaService to start using window.ga after analytics lib loads. const d = promise.defer(); setTimeout(() => d.fulfill(), 1000); // GaService.initializeDelay return d.promise; }); return _; } }