当前位置: 首页 > 知识库问答 >
问题:

显式等待选择器不工作?

司徒池暝
2023-03-14

我正在写一段代码来登录Gmail。在密码页面上,我不是使用隐式等待,而是想改用显式等待。然而,它不是拿起我的选择器?

(async () => {
const browser = await puppeteer.launch({
    headless: false
});
const page = await browser.newPage();

await page.html" target="_blank">goto('https://accounts.google.com/');
await page.$('#identifierId');
await page.keyboard.type('Test1234');
await page.click('#identifierNext > content > span');

await page.waitForSelector('#password'); //this doesnt work
// await page.waitFor(5000); this works
await page.$('#password > div.aCsJod.oJeWuf > div > div.Xb9hP > input');
await page.keyboard.type('fakePassword');
await page.click('#passwordNext > content');
);

我得到了一个错误:

(节点:14428)UnhandledPromiseRejectionWarning:错误:processTicksAndRejections(internal/process/next_tick.js:81:5)处的elementHandle._clickablePoint(/users/asd/projects/freerAzor/node_modules/puppeteer/lib/jshandle.js:199:13)处的节点不可见或不是HTMLElement--异步--在elementHandle处。(/users/asd/projects/freerazor/node_modules/puppeteer/lib/helper.js:110:27)在domworld。单击(/users/asd/projects/freerazor/node_modules/puppeteer/lib/domworld.js:367:18)在processTicksAndRejections(internal/process/next_tick.js:81:5)--异步--在帧。(/users/asd/projects/freerazor/node_modules/puppeteer/lib/helper.js:110:27)在page.点击(/users/asd/projects/freerazor/node_modules/puppeteer/lib/page.js:988:29)在/users/asd/projects/freerazor/app.js:19:16在processTicksAndRejections(internal/process/next_tick.js:81:5)(节点:14428)未处理的processerejectionwarning:未处理的承诺拒绝。这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:1)(节点:14428)[DEP0018]拒绝警告:不推荐未处理得承诺拒绝.将来,未处理的承诺拒绝将以非零退出代码终止node.js进程。

共有1个答案

申屠项明
2023-03-14

Page.WaitForSelector语句正在工作。其中一个page.click调用是问题所在。

错误消息的相关部分:

(node:14428) UnhandledPromiseRejectionWarning: Error: Node is either not visible or not an HTMLElement
    [...]
    at Page.click (/Users/asd/Projects/FreeRazor/node_modules/puppeteer/lib/Page.js:988:29)
    at /Users/asd/Projects/FreeRazor/app.js:19:16

所以错误发生在第19行。我不确定它是哪一行,但我假设它是后面的page.click调用,因为您说如果您等待更长时间(page.waitfor(5000))代码可以工作。因此显示#PasswordNext>ContentDOM元素所需的页面时间似乎比显示#Password元素所需的时间长。

您可以通过在单击之前放置另一个WaitForSelector来解决此问题,以确保元素实际存在。我甚至添加了{visible:true}选项来确保DOM节点也是可见的:

await page.waitForSelector('#passwordNext > content', { visible: true });
await page.click('#passwordNext > content');
 类似资料:
  • 我正在尝试自动化基于共享点的应用程序,它有时会很慢。在下面的示例中,我试图将密码输入包装成显式等待。目前,Selenium以快速运行测试,导致无法执行操作。 如何将密码部分包装成硒显式方式?

  • 问题内容: 当隐式等待少于显式等待时,就会发生误解: 总时间:8.613秒。隐式设置等待第二个较低:3000,结果为6.865秒。它是如何工作的?预先感谢! 问题答案: 那是个好问题。许多优秀的QA自动化专家为此大吃一惊。 隐式等待 每个上都有特殊的隐藏自动等待。如果在页面DOM结构中找不到元素,则原始Web驱动程序(js,python,java)会引发NoSuchElementException

  • 我有一个带有输入框和用户界面选择下拉列表的表单,在ng-blur事件中,我调用了一个方法来自动选择所有三个用户界面选择中的选项。当我使用量角器e2e测试执行此操作时,它不会等待用户界面选择发生并提交表单,这会引发异常,因为它没有找到只有在提交包含所有必需字段的表单后才会出现的元素。我试过这样browser.wait 它正在抛出异常。

  • 驱动程序级别的隐式和显式等待之间有什么区别。哪一个是驱动级等待。如果我们在代码中提供隐式和显式等待。哪一个优先。

  • 我第一次在NIFI1.2中试用wait\notify处理器。在分布式缓存服务的属性中,我选择创建新服务。在该服务的属性下,我只选择运行nifi的本地服务器的主机名作为服务器主机名,所有的灯都在GO上改变。 但是当我开始使用Prozessors时,我遇到了这样一个错误:

  • 问题内容: 我正在浏览一个Web应用程序,如果尝试单击某个元素之后才能与之交互,则该Web应用程序通常会引发错误。 使用Selenium WebDriver(java)时,我可以轻松解决此问题: 但是,我试图使用Selenium类型库在VBA中编写脚本,尽管尝试了许多不同的方法,但我唯一的成功是: 有人告诉我,应该尽可能避免这样做。如果有人可以建议如何将Java转换为VBA或提供任何其他解决方案,