Как ждать элемента, используя мокко, чай и транспортир - PullRequest
0 голосов
/ 15 января 2020

Итак, моя идея состояла в том, чтобы создать функцию, которая пытается найти элемент за x секунд. Если элемент не представлен (быть в состоянии писать на элементе) и / или не может отправить какие-либо ключи к элементу, тогда подождите. Если он прошел заданные секунды ожидания (et c 10 se c), то он должен выдать исключение.

На данный момент я сделал:

    it('enter email', function (done) {
        browser
            .then(() => browser.wait(piPage.getEmailValue().isPresent(), 10000)) 
//getEmailValue = element(by.id('email').getAttribute("value");
            .then((isPresent) => {
                assert.equal(isPresent, true, 'Email failed entering.')
            })
            .then(() => piPage.enterEmail("test@test.com"))
            .then(() => done());
    });

, который фактически находит элемент и отправить ключи, если значение представлено. ОДНАКО кажется, что 10-секундный browser.wait, кажется, не применяется, и вместо этого он немедленно запускается без ожидания вообще. Мне пришлось вручную добавить

browser.driver.sleep(10000).then(function() {
    console.log('waited 10 seconds');
}); 

, но это не то, что я хочу.

Я хотел бы сделать так, чтобы browser.wait обнаружил, что элемент представлен / может отправляться до x секунд, а затем, если элемент найден, мы продолжаем, иначе, в основном, генерируем исключение.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Метод isPresent() ожидает, пока элемент будет присутствовать в html DOM, но это не обязательно означает, что элемент еще взаимодействует. Для этого вам нужно связать его с явным ожиданием, например elementToBeClickable(element)

const EC = protractor.ExpectedConditions;

waitForElement = async () => {
    const present = await yourElement.isPresent();
    if (present) {
        await browser.wait(EC.elementToBeClickable(yourElement));
        await yourElement.sendKeys('something');
    }
};
0 голосов
/ 15 января 2020

Когда вы проходите 10 с, на самом деле говорится: я дам вам 10 с, чтобы найти его, но если вы найдете его до 10 с, верните ожидаемое значение

Schedules a command to wait for a condition to hold. The condition may be specified by a {@link webdriver.Condition}, as a custom function, or as a {@link webdriver.promise.Promise}.

For a {@link webdriver.Condition} or function, the wait will repeatedly evaluate the condition until it returns a truthy value. If any errors occur while evaluating the condition, they will be allowed to propagate. In the event a condition returns a {@link webdriver.promise.Promise promise}, the polling loop will wait for it to be resolved and use the resolved value for whether the condition has been satisified. Note the resolution time for a promise is factored into whether a wait has timed out.

Note, if the provided condition is a {@link WebElementCondition}, then the wait will return a {@link WebElementPromise} that will resolve to the element that satisified the condition.

Example: waiting up to 10 seconds for an element to be present and visible on the page.

Единственное решение, которое я знаю, это использовать sleep()

Я рекомендовал использовать вместо многих тогда ()

import { browser, element, by, ExpectedConditions as ec } from 'protractor';

    await browser.wait(ec.visibilityOf(element(by.id('menu-id')), 5000);
...