Кукловод: подождите, пока elementHandle больше не будет прикреплен к DOM - PullRequest
2 голосов
/ 07 мая 2020

Итак, я столкнулся с этой проблемой, когда кое-где рендерились счетчики, и я хочу подождать, пока счетчики больше не будут прикреплены к DOM. для этого, но в Selenium вы можете использовать такой предикат, как:

Wait.Until(driver => driver.findElements(By.Xpath("XPATH")).Count < 0).

Пока что я сделал следующее:

    async fillSearch(value: string) {
            await this.searchInput.then(x => x.click({ clickCount: 3 }));
            await this.page.keyboard.press("Backspace");
            await this.searchInput.then(x => x.type(value));
            ...//HERE I HAVE TO WAIT FOR THE SPINNER TO GO...
        }

this.searchInput - это Promise<ElementHandle>, полученный page.$x("xpathOfInput").

У меня есть опора под названием this.spinners, извлекающая Promise<ElementHandle[]>, поэтому, когда Promise решено, я могу получить lenght массива и знать если какой-либо элемент был основан на DOM.

Итак, вопрос будет:

Есть ли способ использовать что-то вроде page.waitFor(), чтобы дождаться разрешения обещания, а затем сравнивать, если spinners.length < 0 и ждать, пока это не произойдет?

Я полагаю, должен быть способ добиться того же с помощью предиката в waitFor, но пока мне не удается вытащить его ...

1 Ответ

2 голосов
/ 07 мая 2020

Использование page.waitForXPath

Самый простой способ - использовать page.waitForXPath с параметром hidden, установленным на true:

await page.waitForXPath('XPATH', { hidden: true });

Это будет ждать, пока элемент больше не будет присутствовать в DOM или скрыт (через CSS).

Альтернатива: page.waitForFunction

В качестве альтернативы вы можете использовать page.waitForFunction ждать, пока предоставленная вами функция вернет true. Используя document.evaluate для оценки выражения XPath, вы можете подождать, пока ваше условие не изменится на true.

Использование существующей переменной

Поскольку у вас уже есть элемент в переменной, вы можете использовать page.waitForFunction и передать элемент как args:

await page.waitForFunction(element => element.parentNode === null, {}, spinnerElement);

Вам может потребоваться изменить функцию проверки в зависимости от того, как удаляется узел .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...