老实说我很好奇为什么会存在这种方法?Playwright 通常会自动等待事物可见或加载。那么我们为什么需要打电话呢page.waitForSelector("locator")?
我知道我们是否正在等待特定状态,但我看到很多使用此方法的示例代码随机抛出......但我不太明白为什么在正常情况下有必要?
根据 的文档waitForSelector,从来没有必要:
Playwright 在执行操作之前自动等待元素准备好。使用定位器对象和网络优先断言使代码无需等待选择器。
Playwright 最初主要是为 Microsoft 重写 Puppeteer。Puppeteer 依靠page.$、page.$eval和page.waitForSelectorElementHandles 来完成大部分工作。这些是较低级别的单一用途功能,可以被视为浏览器自动化的原始构建块。Playwright 出现了分歧,目前已弃用或劝阻大多数 Puppeteer 继承的 API,转而支持定位器。
定位器具有自动等待和严格能力,并且在比 Puppeteer 式操作更高的级别上操作。定位器通过将等待和操作(如.click()、.type()、.textContent()、.inputValue()、.evaluate()、.count()、.waitFor()等)组合成单个原子步骤来提高可读性和可靠性。当在定位器上触发操作时,Playwright 始终等待并从 DOM 中重新选择最新的元素,有助于避免陈旧的句柄和竞争条件。
几乎总是,当您等待选择器存在时,您会想要对其采取操作,因此尽管您可以用作 的page.locator("foo").waitFor()定位器优先翻译page.waitForSelector("foo"),但您通常会使用page.locator("foo").click()或其他比.waitFor()。换句话说,.click()所有其他行动基本上都融入.waitFor()其中。
您没有显示任何示例,因此这是相当手动和笼统的,但我猜这些示例可能已经过时,可以使用等效的定位器重写,就像基本上所有已弃用/不鼓励的速记定位器一样像page.textContent(),,page.click()(page.inputValue()等等)。