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

olqngx59  于 2022-11-22  发布在  Node.js
关注(0)|答案(8)|浏览(373)

我正在使用playwright.js为https://target.com编写脚本,在您提交送货信息的页面上,如果您之前已经在该目标帐户上完成了结帐过程,它将提供使用已保存地址的选项。
我希望每次运行脚本时都能输入新的发货信息,所以我必须让剧作家单击删除(如果页面上存在),然后输入发货信息。
下面显示的函数可以单击delete,但它会在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})
    }
  }
fdbelqdn

fdbelqdn1#

await expect(page.locator(".MyClass")).toHaveCount(0)
qzwqbdag

qzwqbdag2#

您有两个主要选项:

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) {
    // ...
}
kxkpmulp

kxkpmulp3#

await page.isVisible("text='Delete'")

也许这就是你要找的人
.isVisible()文档中:
返回元素是否可见。不匹配任何元素的selector被视为不可见。

tktrz96b

tktrz96b4#

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

xkrw2x1b

xkrw2x1b5#

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

if(await page.locator(your_selector).count()>0)
n3schb8v

n3schb8v6#

await expect(page).toHaveSelectorCount('.floorNav__modal', 1);
kmbjn2e3

kmbjn2e37#

试试这个,它可以处理所有的错误-

async isSelectorExists(selector: string) {
  return await this._page.$(selector).catch(() => null) !== null;
}

选择器无效-返回false

console.log(await isSelectorExists('$'))

有效的选择器且存在-返回true

console.log(await isSelectorExists('body'))

选择器有效但不存在-返回false

console.log(await isSelectorExists('h1'))
yacmzcpb

yacmzcpb8#

您可以尝试使用这段简单的代码来检查元素的可见性并采取必要的操作。
下面的代码检查元素的可见性,如果元素在DOM上可见,则单击同一元素。

if(await page.locator('Your selector').isVisible()){
  await page.locator("Your selector").click()
}

即使定位器在页面上不可见,它也不会引发任何异常或错误。

相关问题