木偶:等待elementHandle不再连接到DOM

时间:2020-05-07 15:43:38

标签: javascript puppeteer

因此,我遇到了这个问题,那里到处都有一些微调器,我想等到这些微调器不再连接到DOM中。

不需要太多的JS,但是在Selenium中,您可以使用以下谓词:

v <- c(1, 2, 3) names(v) <- c("a", "b", "c") str(v)

到目前为止,我已经完成了以下工作:

 Named num [1:3] 1 2 3
 - attr(*, "names")= chr [1:3] "a" "b" "c"

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"),因此,当Promise解决后,我可以获取数组的this.spinners并知道是否在DOM上建立了任何元素。 / p>

所以问题将是:

是否有一种方法可以使用Promise<ElementHandle[]>之类的方法来等待诺言得到解决,然后比较lenght并等待直到发生这种情况?

我认为必须有一种方法可以在waitFor上使用谓词来实现相同目的,但到目前为止,我还无法将其撤出...

1 个答案:

答案 0 :(得分:2)

使用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);

您可能需要根据删除节点的方式更改检查功能。