7

我正在使用 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})
    }
  }
4

4 回答 4

11

您有两个主要选择:

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

或者

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

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

似乎您在页面上只有一个带有属性 text 的元素,其值为“Delete”,因为您没有对$$返回的数组做任何事情。如果是这样,您可以使用$

const del = await page.$("text='Delete'");
if (del) {
    // ...
}
于 2020-11-18T21:13:23.620 回答
10
await expect(page.locator(".MyClass")).toHaveCount(0)
于 2021-09-15T17:20:23.053 回答
4
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

于 2021-06-10T13:30:18.933 回答
1
await page.isVisible("text='Delete'")

也许这就是你要找的那个。

于 2022-02-23T15:42:57.043 回答