我正在使用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})
}
}
8条答案
按热度按时间fdbelqdn1#
qzwqbdag2#
您有两个主要选项:
或
为了可读性,我个人会将
$$
命令放在if语句之外,但这可能只是我自己的想法。页面上似乎只有一个元素的属性text值为“Delete”,因为您没有对
$$
返回的数组做任何操作。kxkpmulp3#
也许这就是你要找的人
从
.isVisible()
文档中:返回元素是否可见。不匹配任何元素的
selector
被视为不可见。tktrz96b4#
来自-https://github.com/puppeteer/puppeteer/issues/1149#issuecomment-434302298
xkrw2x1b5#
通常,在检查元素存在时,这在很多情况下都有帮助。
n3schb8v6#
kmbjn2e37#
试试这个,它可以处理所有的错误-
选择器无效-返回false
有效的选择器且存在-返回true
选择器有效但不存在-返回false
yacmzcpb8#
您可以尝试使用这段简单的代码来检查元素的可见性并采取必要的操作。
下面的代码检查元素的可见性,如果元素在DOM上可见,则单击同一元素。
即使定位器在页面上不可见,它也不会引发任何异常或错误。