Playwright.js 如何检查页面上是否存在元素

How to check if an element exists on the page in Playwright.js

我正在使用 playwright.js 为 https://target.com 编写脚本,在您提交送货信息的页面上,如果您完成了先前在该目标帐户上进行的结帐过程。

我想每次 运行 脚本时都输入新的运输信息,所以我必须让编剧点击删除,如果它存在于页面上,然后输入运输信息。

下面显示的函数可以单击删除,但随后在 if (await page.$$("text='Delete'") != []) 处超时,而不是执行函数的 else 部分。

如何重写这个函数,让它只检查元素(选择器:text='Delete')是否存在,存在则点击,不存在则执行函数的填充部分?

  async function deliveryAddress() {
    if (await page.$$("text='Delete'") != []) {
      await page.click("text='Delete'", {force:true})
      await deliveryAddress()
    } else {
      await page.focus('input#full_name')
      await page.type('input#full_name', fullName, {delay: delayms});
      await page.focus('input#address_line1')
      await page.type('input#address_line1', address, {delay: delayms});
      await page.focus('input#zip_code')
      await page.type('input#zip_code', zipCode, {delay: delayms});
      await page.focus('input#mobile')
      await page.type('input#mobile', phoneNumber, {delay: delayms});
      await page.click("text='Save & continue'", {force:true})
    }
  }

您有两个主要选择:

const deletes = await page.$$("text='Delete'");
if (deletes) {
    // ...
}

const deletes = await page.$$("text='Delete'");
if (deletes.length) {
    // ...
}

为了便于阅读,我个人会将 $$ 命令留在 if 语句之外,但这可能只有我自己。

页面上似乎只有一个元素的属性文本值为“Delete”,因为您没有对 $$ returns 的数组进行任何操作。如果是这样,您可以使用 $:

const del = await page.$("text='Delete'");
if (del) {
    // ...
}
try {
  await page.waitForSelector(selector, { timeout: 5000 })
  // ...`enter code here`
} catch (error) {`enter code here`
  console.log("The element didn't appear.")
}

来自 - https://github.com/puppeteer/puppeteer/issues/1149#issuecomment-434302298

await expect(page.locator(".MyClass")).toHaveCount(0)
await page.isVisible("text='Delete'")

也许这就是您要找的。

通常这在很多情况下都有帮助,检查元素是否存在。

if(await page.locator(your_selector).count()>0)
await expect(page).toHaveSelectorCount('.floorNav__modal', 1);