Nano Hash - криптовалюты, майнинг, программирование

Как с помощью транспортира настроить таргетинг на элементы за пределами приложения angular?

У меня есть вступительный элемент, который воспроизводится перед загрузкой приложения Angular.

<!-- need to target div below -->
<div id="intro"></div>
<!-- still bootstraping -->
<app-root></app-root>

Я использую следующие спецификации транспортира, представленные в Angular-cli

describe('my App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage(); // default from angular cli
  });

  it(`should provide an intro div`, () => {
    page.navigateTo();
    const introDiv = element(by.id('intro'));
    expect(introDiv.isPresent()).toBe(true); // reports as false in protractor test
  });
});

Я могу настроить таргетинг на элементы внутри приложения Angular, используя ту же функцию «it», описанную выше. Почему это не работает вне приложения Angular и как я могу настроить таргетинг на элементы в index.html?

Обновлять:

Я провел дополнительное тестирование и хотел зарегистрировать это в вопросе только для справки:

Не упомянуто выше, у меня есть angular удалить вводный div, поскольку он полноэкранный.

Благодаря ссылке на документацию по Protractor, предоставленную Эрнстом Цвингли, он сообщает мне, что Protractor автоматически применяет browser.waitForAngular () перед каждым действием WebDriver.

Таким образом, приведенный выше тест, который пытался нацелиться на вводный div, не смог найти его, поскольку он искал его. После загрузки angular и удаления div.

Я создал временный div в index.html, которого ничего не трогает. Он просто доступен с element(by.id('find-me')), даже если он находится вне приложения Angular.

<div id="find-me"></div>

it(`is available after angular bootstraps and can be targeted with element()`, () => {
    const findMeDiv = element(by.id('find-me'));
    expect(findMeDiv.isPresent()).toBe(true);
  });

Наконец-то я смог настроить таргетинг на вводный div с помощью browser.waitForAngularEnabled ( false), поскольку он доступен до начальной загрузки Angular. Хотя это только ожидание тайм-аутов $ http и $, кажется, что этого достаточно, чтобы иметь возможность настроить таргетинг на div перед загрузкой. Я не уверен, что это полностью отменяет browser.waitForAngular().

(Разница с waitForAngular () ожидает рендеринга, http, тайм-аутов, в то время как waitForAngularEnabled () касается только http и тайм-аутов, хотя сходство имен может указывать на то, что waitForAngularEnabled (false) полностью отменяет waitForAngular (), например, также включает рендеринг и не был указан в документации).

<div id="intro"></div>

// Works
  it(`Found to be available if I use browser.waitForAngularEnabled(false) since div is removed when Angular is ready`, () => {
    browser.waitForAngularEnabled(false);
    const introDiv = element(by.id('intro'));
    expect(introDiv.isPresent()).toBe(true);
  });

Таким образом, в основном и Эрнст Цвингли, и Xotabu4 предоставили хорошее понимание, поскольку мне нужно было browser.waitForAngularEnabled(false); и я мог использовать функцию element() для получения доступа к div.


Ответы:


1

По сути, вы должны рассматривать эту часть как non-angular и искать элементы с помощью Selenium WebDriver -методы.

Итак, вместо element(by.id('intro')) используйте browser.driver.findElement(by.id('intro')), который из-за browser.driver использует JavaScript / Vanilla browser вместо Protractor browser и, следовательно, работает вне любой угловой области.

Однако вам нужно отказаться от своего expect()-оператора, потому что Protractor element(locator) представляет ElementArrayFinder, а методы WebDriver, такие как findElement(), getWebElement() и аналогичные, представляют непосредственно WebElement (поэтому они немедленно выполняют поиск элемента и не ждут с это до тех пор, пока код не потребует настоящего WebElement). Прочтите здесь.

Итак, в вашем случае с findElement вы либо получаете WebDriver-Error, потому что элемент отсутствует, либо вы получаете WebElement, потому что он есть (нет необходимости дополнительно проверять наличие).

Документация по Selenium и здесь GitHub, объясняющий использование транспортира в не-Angular

Кстати:

Если вся страница не является угловой, вам нужно отключить Protractor ControlFlow с помощью browser.waitForAngularEnabled(false) (это было раньше ignoreSynchronization = true, но больше не используйте).

Если только часть страницы не является Angular, вам может не потребоваться отключать Protractor, но вам может потребоваться явно позаботиться о синхронном выполнении (что-то для try & error)

ОБНОВЛЕНИЕ

В связи с полученным мной комментарием я чувствую желание дать ссылку на дополнительную информацию, которая еще больше подтверждает мою точку зрения (потому что Protractor ‹> Vanilla):

22.11.2017
  • element(by.id('intro')), use browser.driver.findElement(by.id('intro')) Поиск элементов будет абсолютно таким же, за исключением того, что в первом случае будет выполняться 'waitForAngular ()', проверьте исходный код. Я считаю, что нам просто нужно немного подождать элемента 22.11.2017
  • @ Xotabu4: Думаю, ты ошибаешься. Я обновил свой ответ, чтобы лучше различать ваниль и транспортир 22.11.2017
  • Спасибо за комментарии и ответ, который вы оба дали мне, я могу настроить таргетинг на div с помощью element () и использовать browser.waitForAngularEnabled (false), чтобы настроить таргетинг на него перед загрузкой angular. :) 23.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..