Operações de clique do marionetista: Manipulação de elementos complexos, cliques duplos e solução de problemas
Aprenda a realizar operações de clique eficazes com o Puppeteer, lidando com elementos complexos, conteúdo dinâmico e solucionando problemas comuns em automação web.

O Puppeteer simplifica a automação do navegador, oferecendo ferramentas poderosas para clicar e interagir com elementos da web. Não importa se você está lidando com cliques básicos, conteúdo dinâmico ou elementos complicados como iframes e sobreposições, o Puppeteer tem tudo o que você precisa saber:
- Cliques básicos: Usar
page.click()ou a API do Locator para interações padrão. - Conteúdo Dinâmico: Aguarde o carregamento dos elementos ou AJAX respostas antes de clicar.
- Elementos complicados: Manipule elementos ocultos, sobrepostos ou iframe com scripts personalizados.
- Ações avançadas: Execute cliques duplos, cliques com o botão direito e operações de arrastar e soltar.
- Tratamento de erros: Corrija problemas comuns como 'Elemento não encontrado' ou problemas de tempo usando esperas e seletores precisos.
- Dicas de estabilidade: Use tempos limite adequados, atrasos aleatórios e modo furtivo para uma automação mais suave.
O Puppeteer garante automação confiável com recursos como esperas integradas, sombra DOM suporte e métodos de clique avançados. Mergulhe no artigo para obter exemplos detalhados e dicas de solução de problemas.
sbb-itb-23997f1
Experimente o navegador headless baseado em Puppeteer no Latenode para automação de navegador!
Latenode é uma plataforma de automação de aplicativos que oferece integração direta com um Headless Browser baseado em Puppeteer. Adicione código de qualquer complexidade, extraia dados de sites, faça capturas de tela e execute qualquer operação que você possa imaginar.
Não perca a chance de melhorar, simplificar e acelerar a automação web. Experimente o Headless Browser AGORA no Latenode!
Introdução aos comandos de clique
Vamos mergulhar em como você pode usar a simulação de clique do Puppeteer de forma eficaz, começando com alguns exemplos práticos.
Método básico de clique
O page.click() function é o método preferido do Puppeteer para disparar eventos de clique. Veja como usá-lo:
<span class="hljs-comment">// Clicking an element by its selector</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#submit-button'</span>);
<span class="hljs-comment">// Adding options to your click</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'.menu-item'</span>, {
<span class="hljs-attr">delay</span>: <span class="hljs-number">100</span>, <span class="hljs-comment">// Adds a delay before the click</span>
<span class="hljs-attr">button</span>: <span class="hljs-string">'left'</span>, <span class="hljs-comment">// Specifies the mouse button</span>
<span class="hljs-attr">clickCount</span>: <span class="hljs-number">1</span>, <span class="hljs-comment">// Number of times to click</span>
<span class="hljs-attr">timeout</span>: <span class="hljs-number">30000</span> <span class="hljs-comment">// Maximum time to wait</span>
});
Para uma abordagem mais flexível, você pode usar a API Locator do Puppeteer, introduzida na versão 13.0:
<span class="hljs-keyword">const</span> button = page.<span class="hljs-title function_">getByRole</span>(<span class="hljs-string">'button'</span>, { <span class="hljs-attr">name</span>: <span class="hljs-string">'Submit'</span> });
<span class="hljs-keyword">await</span> button.<span class="hljs-title function_">click</span>();
Quando os seletores CSS não atendem às suas necessidades, considere usar XPath.
XPath e Seleção de Elementos
XPath pode ser uma alternativa poderosa para selecionar elementos, especialmente quando os seletores CSS não são suficientes:
<span class="hljs-comment">// Selecting an element with XPath</span>
<span class="hljs-keyword">const</span> element = <span class="hljs-keyword">await</span> page.$x(<span class="hljs-string">'//button[contains(text(), "Submit")]'</span>);
<span class="hljs-keyword">await</span> element[<span class="hljs-number">0</span>].<span class="hljs-title function_">click</span>();
<span class="hljs-comment">// Combining XPath with waiting</span>
<span class="hljs-keyword">const</span> submitButton = <span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForXPath</span>(
<span class="hljs-string">'//button[@class="submit-btn"]'</span>,
{ <span class="hljs-attr">visible</span>: <span class="hljs-literal">true</span> }
);
<span class="hljs-keyword">await</span> submitButton.<span class="hljs-title function_">click</span>();
Navegação pós-clique
Após clicar, você pode precisar lidar com navegação ou atualizações de conteúdo dinâmico. O Puppeteer torna isso simples:
<span class="hljs-comment">// Waiting for a page navigation after a click</span>
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForNavigation</span>({ <span class="hljs-attr">waitUntil</span>: <span class="hljs-string">'networkidle0'</span> }),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#navigation-link'</span>)
]);
<span class="hljs-comment">// Handling dynamic content loading</span>
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'.new-content'</span>),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#load-more'</span>)
]);
Para aplicativos de página única (SPAs), você pode monitorar alterações específicas no estado da página:
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#update-button'</span>);
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForFunction</span>(
<span class="hljs-string">'document.querySelector(".status").textContent === "Updated"'</span>
);
Essas técnicas ajudarão você a gerenciar cliques e seus resultados de forma mais eficaz em seus scripts do Puppeteer.
Trabalhando com elementos difíceis
Esta seção aborda técnicas para lidar com elementos complicados que não respondem aos métodos de clique padrão.
Elementos ocultos e sobrepostos
Às vezes, os elementos são escondidos ou cobertos por sobreposições, tornando-os impossíveis de clicar. Veja como ajustar suas propriedades para interagir com eles:
<span class="hljs-comment">// Make a hidden element visible before clicking</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">() =></span> {
<span class="hljs-keyword">const</span> button = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#hidden-button'</span>);
button.<span class="hljs-property">style</span>.<span class="hljs-property">display</span> = <span class="hljs-string">'block'</span>;
button.<span class="hljs-title function_">scrollIntoView</span>();
});
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#hidden-button'</span>);
<span class="hljs-comment">// Handle elements blocked by overlays</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">() =></span> {
<span class="hljs-keyword">const</span> overlay = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'.modal-overlay'</span>);
<span class="hljs-keyword">if</span> (overlay) overlay.<span class="hljs-title function_">remove</span>(); <span class="hljs-comment">// Remove the overlay</span>
<span class="hljs-keyword">const</span> target = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#target-button'</span>);
target.<span class="hljs-property">style</span>.<span class="hljs-property">zIndex</span> = <span class="hljs-string">'9999'</span>; <span class="hljs-comment">// Bring the target element to the front</span>
});
Cliques de conteúdo dinâmico
Lidar com elementos que carregam dinamicamente requer esperar que eles se tornem clicáveis:
<span class="hljs-comment">// Wait for a dynamically loaded element to appear and then click</span>
<span class="hljs-keyword">const</span> dynamicElement = <span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'.dynamic-content'</span>, {
<span class="hljs-attr">visible</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">timeout</span>: <span class="hljs-number">5000</span>
});
<span class="hljs-keyword">await</span> dynamicElement.<span class="hljs-title function_">click</span>();
<span class="hljs-comment">// Handle elements loaded via AJAX</span>
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForResponse</span>(<span class="hljs-function"><span class="hljs-params">response</span> =></span>
response.<span class="hljs-title function_">url</span>().<span class="hljs-title function_">includes</span>(<span class="hljs-string">'/api/data'</span>)), <span class="hljs-comment">// Wait for the AJAX response</span>
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#load-more-button'</span>) <span class="hljs-comment">// Trigger the AJAX call</span>
]);
Interações Iframe e Hover
Interagir com elementos dentro de iframes ou aqueles que exigem ações de hover pode ser complicado. Veja como lidar com eles:
<span class="hljs-comment">// Click elements within an iframe</span>
<span class="hljs-keyword">const</span> frame = page.<span class="hljs-title function_">frames</span>().<span class="hljs-title function_">find</span>(<span class="hljs-function"><span class="hljs-params">f</span> =></span>
f.<span class="hljs-title function_">url</span>().<span class="hljs-title function_">includes</span>(<span class="hljs-string">'embedded-content'</span>));
<span class="hljs-keyword">await</span> frame.<span class="hljs-title function_">click</span>(<span class="hljs-string">'.iframe-button'</span>);
<span class="hljs-comment">// Handle hover-triggered interactions</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">hover</span>(<span class="hljs-string">'#menu-trigger'</span>); <span class="hljs-comment">// Hover over the trigger</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'.dropdown-content'</span>); <span class="hljs-comment">// Wait for the dropdown to appear</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'.dropdown-item'</span>); <span class="hljs-comment">// Click the dropdown item</span>
Para interações de foco que revelam conteúdo adicional:
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">hover</span>(<span class="hljs-string">'#interactive-element'</span>); <span class="hljs-comment">// Hover over the interactive element</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForFunction</span>(<span class="hljs-function">() =></span> {
<span class="hljs-keyword">const</span> element = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'.hover-content'</span>);
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">window</span>.<span class="hljs-title function_">getComputedStyle</span>(element).<span class="hljs-property">opacity</span> === <span class="hljs-string">'1'</span>; <span class="hljs-comment">// Wait for the content to become visible</span>
});
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'.hover-content .button'</span>); <span class="hljs-comment">// Click the revealed button</span>
"Clica no primeiro elemento encontrado que corresponde
selector." - Documentação do Puppeteer
Esses métodos ajudam você a interagir de forma confiável com elementos desafiadores da web, mantendo seus scripts estáveis e eficientes. A seguir, abordaremos técnicas avançadas de clique, como cliques duplos, cliques com o botão direito e ações de arrastar.
Métodos especiais de clique
O Puppeteer oferece uma variedade de opções avançadas de clique, permitindo que você automatize ações complexas do mouse com precisão.
Cliques duplos e direitos
Para executar cliques duplos, você pode configurar as configurações de clique conforme mostrado abaixo:
<span class="hljs-comment">// Double-click using page.click()</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#target-element'</span>, { <span class="hljs-attr">clickCount</span>: <span class="hljs-number">2</span> });
<span class="hljs-comment">// Double-click using mouse coordinates</span>
<span class="hljs-keyword">const</span> element = <span class="hljs-keyword">await</span> page.$(<span class="hljs-string">'#target-element'</span>);
<span class="hljs-keyword">const</span> rect = <span class="hljs-keyword">await</span> element.<span class="hljs-title function_">boundingBox</span>();
<span class="hljs-keyword">await</span> page.<span class="hljs-property">mouse</span>.<span class="hljs-title function_">click</span>(rect.<span class="hljs-property">x</span> + rect.<span class="hljs-property">width</span> / <span class="hljs-number">2</span>, rect.<span class="hljs-property">y</span> + rect.<span class="hljs-property">height</span> / <span class="hljs-number">2</span>, {
<span class="hljs-attr">clickCount</span>: <span class="hljs-number">2</span>,
<span class="hljs-attr">delay</span>: <span class="hljs-number">100</span> <span class="hljs-comment">// Add a delay for stability</span>
});
Para cliques com o botão direito, use o 'button' opção para especificar a ação:
<span class="hljs-comment">// Right-click on an element</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#context-menu-trigger'</span>, { <span class="hljs-attr">button</span>: <span class="hljs-string">'right'</span> });
<span class="hljs-comment">// Navigate the context menu using keyboard inputs</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-property">keyboard</span>.<span class="hljs-title function_">press</span>(<span class="hljs-string">'ArrowDown'</span>);
<span class="hljs-keyword">await</span> page.<span class="hljs-property">keyboard</span>.<span class="hljs-title function_">press</span>(<span class="hljs-string">'Enter'</span>);
"Certo, todas essas interações estão no nível do SO. O que significa que elas vivem fora do espaço do navegador/marionetista. Não há solução alternativa, pelo que eu sei." - ebidel
Além disso, o Puppeteer também suporta interações de arrastar e soltar.
Ações de clicar e arrastar
Para executar arrastar e soltar, coordene vários eventos do mouse para obter resultados precisos:
<span class="hljs-comment">// Drag-and-drop example</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">dragAndDrop</span>(<span class="hljs-params">page, sourceSelector, targetSelector</span>) {
<span class="hljs-keyword">const</span> source = <span class="hljs-keyword">await</span> page.$(sourceSelector);
<span class="hljs-keyword">const</span> target = <span class="hljs-keyword">await</span> page.$(targetSelector);
<span class="hljs-keyword">const</span> sourceBound = <span class="hljs-keyword">await</span> source.<span class="hljs-title function_">boundingBox</span>();
<span class="hljs-keyword">const</span> targetBound = <span class="hljs-keyword">await</span> target.<span class="hljs-title function_">boundingBox</span>();
<span class="hljs-keyword">await</span> page.<span class="hljs-property">mouse</span>.<span class="hljs-title function_">move</span>(
sourceBound.<span class="hljs-property">x</span> + sourceBound.<span class="hljs-property">width</span> / <span class="hljs-number">2</span>,
sourceBound.<span class="hljs-property">y</span> + sourceBound.<span class="hljs-property">height</span> / <span class="hljs-number">2</span>
);
<span class="hljs-keyword">await</span> page.<span class="hljs-property">mouse</span>.<span class="hljs-title function_">down</span>();
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForTimeout</span>(<span class="hljs-number">100</span>);
<span class="hljs-keyword">await</span> page.<span class="hljs-property">mouse</span>.<span class="hljs-title function_">move</span>(
targetBound.<span class="hljs-property">x</span> + targetBound.<span class="hljs-property">width</span> / <span class="hljs-number">2</span>,
targetBound.<span class="hljs-property">y</span> + targetBound.<span class="hljs-property">height</span> / <span class="hljs-number">2</span>,
{ <span class="hljs-attr">steps</span>: <span class="hljs-number">10</span> }
);
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForTimeout</span>(<span class="hljs-number">100</span>);
<span class="hljs-keyword">await</span> page.<span class="hljs-property">mouse</span>.<span class="hljs-title function_">up</span>();
}
Para interações mais específicas, como controles deslizantes ou listas classificáveis, você pode despachar eventos de arrastar personalizados:
<span class="hljs-comment">// Trigger custom drag events</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">(<span class="hljs-params">sourceSelector</span>) =></span> {
<span class="hljs-keyword">const</span> element = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(sourceSelector);
element.<span class="hljs-title function_">dispatchEvent</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">MouseEvent</span>(<span class="hljs-string">'dragstart'</span>, {
<span class="hljs-attr">bubbles</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">cancelable</span>: <span class="hljs-literal">true</span>
}));
}, sourceSelector);
AJAX Clique em Eventos
O Puppeteer também lida com cliques que disparam atualizações assíncronas, como solicitações AJAX. Use mecanismos de espera adequados para garantir a confiabilidade:
<span class="hljs-comment">// Wait for an AJAX response after a click</span>
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForResponse</span>(
<span class="hljs-function"><span class="hljs-params">response</span> =></span> response.<span class="hljs-title function_">url</span>().<span class="hljs-title function_">includes</span>(<span class="hljs-string">'/api/endpoint'</span>)
),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#ajax-button'</span>)
]);
<span class="hljs-comment">// Handle multiple AJAX requests simultaneously</span>
<span class="hljs-keyword">const</span> [response1, response2] = <span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForResponse</span>(<span class="hljs-function"><span class="hljs-params">res</span> =></span> res.<span class="hljs-title function_">url</span>().<span class="hljs-title function_">includes</span>(<span class="hljs-string">'/api/data1'</span>)),
page.<span class="hljs-title function_">waitForResponse</span>(<span class="hljs-function"><span class="hljs-params">res</span> =></span> res.<span class="hljs-title function_">url</span>().<span class="hljs-title function_">includes</span>(<span class="hljs-string">'/api/data2'</span>)),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#multi-ajax-trigger'</span>)
]);
Para conteúdo dinâmico carregado via AJAX, você pode verificar as atualizações combinando eventos de clique com verificações de conteúdo:
<span class="hljs-comment">// Verify dynamic content loaded after clicking</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#load-more'</span>);
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForFunction</span>(
<span class="hljs-function"><span class="hljs-params">selector</span> =></span> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(selector).<span class="hljs-property">children</span>.<span class="hljs-property">length</span> > <span class="hljs-number">10</span>,
{},
<span class="hljs-string">'.dynamic-content'</span>
);
Esses métodos permitem automatizar interações complexas do usuário, garantindo confiabilidade por meio de tempo adequado e gerenciamento de eventos.
Problemas comuns de clique e soluções
Esta seção aborda erros frequentes relacionados a cliques no Puppeteer e como lidar com eles de forma eficaz.
Corrigindo o erro 'Elemento não encontrado'
O erro 'Element Not Found' ocorre quando o Puppeteer não consegue localizar o elemento alvo. Para resolver isso, tente usar seletores precisos, manipular elementos Shadow DOM ou garantir que elementos ocultos estejam visíveis:
<span class="hljs-comment">// Use specific selectors</span>
<span class="hljs-keyword">const</span> button = <span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'#submit-form-button'</span>, {
<span class="hljs-attr">visible</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">timeout</span>: <span class="hljs-number">5000</span>
});
<span class="hljs-comment">// Handle elements inside a Shadow DOM</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">(<span class="hljs-params">selector</span>) =></span> {
<span class="hljs-keyword">const</span> root = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#shadow-host'</span>).<span class="hljs-property">shadowRoot</span>;
<span class="hljs-keyword">const</span> element = root.<span class="hljs-title function_">querySelector</span>(selector);
element.<span class="hljs-title function_">click</span>();
}, <span class="hljs-string">'#target-button'</span>);
<span class="hljs-comment">// Make hidden elements visible and scroll into view</span>
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">(<span class="hljs-params">selector</span>) =></span> {
<span class="hljs-keyword">const</span> element = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(selector);
element.<span class="hljs-title function_">scrollIntoView</span>();
element.<span class="hljs-property">style</span>.<span class="hljs-property">display</span> = <span class="hljs-string">'block'</span>;
}, <span class="hljs-string">'#hidden-element'</span>);
Depois de resolver os problemas do seletor, problemas relacionados ao tempo ainda podem interferir nas operações de clique.
Resolvendo problemas de tempo
Problemas de tempo geralmente surgem quando elementos não estão totalmente carregados ou visíveis. Veja como lidar com eles:
<span class="hljs-comment">// Wait for navigation and element visibility before clicking</span>
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForNavigation</span>({ <span class="hljs-attr">waitUntil</span>: <span class="hljs-string">'networkidle0'</span> }),
page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'#dynamic-content'</span>, { <span class="hljs-attr">visible</span>: <span class="hljs-literal">true</span> }),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#trigger-button'</span>)
]);
<span class="hljs-comment">// Add random delays to simulate real user behavior</span>
<span class="hljs-keyword">const</span> delay = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">floor</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">random</span>() * (<span class="hljs-number">3000</span> - <span class="hljs-number">1000</span> + <span class="hljs-number">1</span>)) + <span class="hljs-number">1000</span>;
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForTimeout</span>(delay);
Essas técnicas ajudam a sincronizar suas ações com o conteúdo dinâmico da página.
Enfrentando os desafios de segurança do navegador
Os recursos de segurança do navegador podem, às vezes, bloquear cliques automatizados. Para contornar essas restrições, você pode usar o modo stealth ou configurações seguras do Puppeteer:
<span class="hljs-comment">// Enable stealth mode with puppeteer-extra</span>
<span class="hljs-keyword">const</span> puppeteer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'puppeteer-extra'</span>);
<span class="hljs-keyword">const</span> <span class="hljs-title class_">StealthPlugin</span> = <span class="hljs-built_in">require</span>(<span class="hljs-string">'puppeteer-extra-plugin-stealth'</span>);
puppeteer.<span class="hljs-title function_">use</span>(<span class="hljs-title class_">StealthPlugin</span>());
<span class="hljs-keyword">const</span> browser = <span class="hljs-keyword">await</span> puppeteer.<span class="hljs-title function_">launch</span>({
<span class="hljs-attr">headless</span>: <span class="hljs-literal">false</span>,
<span class="hljs-attr">ignoreHTTPSErrors</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">args</span>: [
<span class="hljs-string">'--no-sandbox'</span>,
<span class="hljs-string">'--disable-setuid-sandbox'</span>,
<span class="hljs-string">'--disable-sync'</span>,
<span class="hljs-string">'--ignore-certificate-errors'</span>,
<span class="hljs-string">'--lang=en-US,en;q=0.9'</span>
]
});
Para maior isolamento e segurança:
<span class="hljs-keyword">const</span> { launch } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'secure-puppeteer'</span>);
<span class="hljs-keyword">const</span> browser = <span class="hljs-keyword">await</span> <span class="hljs-title function_">launch</span>({
<span class="hljs-attr">isolateGlobalScope</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">interceptFetch</span>: <span class="hljs-literal">true</span>
});
"Certo, todas essas interações estão no nível do SO. O que significa que elas vivem fora do espaço do navegador/marionetista. Não há solução alternativa, pelo que eu sei." - ebidel
Diretrizes de operação de clique
Configurações de espera e tempo limite
Configurações adequadas de espera e tempo limite são essenciais para garantir operações de clique confiáveis. Veja como você pode gerenciá-las de forma eficaz:
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">setDefaultTimeout</span>(<span class="hljs-number">60000</span>);
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'#loginBtn'</span>, {
<span class="hljs-attr">visible</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">timeout</span>: <span class="hljs-number">30000</span>
});
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForNavigation</span>({ <span class="hljs-attr">waitUntil</span>: <span class="hljs-string">'networkidle0'</span> }),
page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'#dynamic-content'</span>),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#trigger-button'</span>)
]);
Para conteúdo orientado por API, esperar a rede ficar ociosa é crucial:
<span class="hljs-keyword">await</span> <span class="hljs-title class_">Promise</span>.<span class="hljs-title function_">all</span>([
page.<span class="hljs-title function_">waitForNetworkIdle</span>(),
page.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#fetchUsers'</span>)
]);
Se as esperas de clique integradas não atenderem às suas necessidades, scripts personalizados podem lidar com cenários mais complexos.
Métodos de clique JavaScript personalizados
Em situações complexas, use page.evaluate() para executar scripts de clique personalizados. Aqui estão alguns exemplos:
<span class="hljs-keyword">const</span> shadowClick = <span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">() =></span> {
<span class="hljs-keyword">const</span> root = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#shadow-host'</span>).<span class="hljs-property">shadowRoot</span>;
<span class="hljs-keyword">const</span> button = root.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#shadow-button'</span>);
<span class="hljs-keyword">return</span> button.<span class="hljs-title function_">click</span>();
});
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">evaluate</span>(<span class="hljs-function">() =></span> {
<span class="hljs-keyword">const</span> element = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'#obscured-button'</span>);
element.<span class="hljs-property">style</span>.<span class="hljs-property">zIndex</span> = <span class="hljs-string">'999999'</span>;
element.<span class="hljs-title function_">click</span>();
});
Esses métodos são particularmente úteis para:
- Interagindo com elementos Shadow DOM
- Manipulando conteúdo dinâmico ou oculto
- Clicando em elementos atrás de sobreposições
- Navegando por estruturas DOM complexas
Scripts personalizados como esses podem lidar com casos extremos que os métodos padrão talvez não consigam cobrir.
Dicas de velocidade e estabilidade
Depois de abordar os desafios de tempo e interação, concentre-se em melhorar a velocidade e a estabilidade para otimizar sua automação:
<span class="hljs-keyword">const</span> delay = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">floor</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">random</span>() * (<span class="hljs-number">2000</span> - <span class="hljs-number">500</span>)) + <span class="hljs-number">500</span>;
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForTimeout</span>(delay);
<span class="hljs-keyword">await</span> page.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'#target-button'</span>, {
<span class="hljs-attr">visible</span>: <span class="hljs-literal">true</span>,
<span class="hljs-attr">timeout</span>: <span class="hljs-number">5000</span>
});
Para trabalhar com iframes:
<span class="hljs-keyword">const</span> frame = page.<span class="hljs-title function_">frames</span>().<span class="hljs-title function_">find</span>(<span class="hljs-function"><span class="hljs-params">f</span> =></span> f.<span class="hljs-title function_">name</span>() === <span class="hljs-string">'content-frame'</span>);
<span class="hljs-keyword">await</span> frame.<span class="hljs-title function_">waitForSelector</span>(<span class="hljs-string">'#frame-button'</span>);
<span class="hljs-keyword">await</span> frame.<span class="hljs-title function_">click</span>(<span class="hljs-string">'#frame-button'</span>);
Para garantir confiabilidade:
- Use seletores CSS para segmentação mais rápida de elementos
- Envolva operações críticas em blocos try-catch
- Monitore a atividade da rede para conteúdo dinâmico
- Defina tempos limite práticos para evitar atrasos desnecessários
Essas estratégias ajudam a criar fluxos de trabalho de automação mais confiáveis e eficientes.
Resumo
O Puppeteer simplifica a automação da web com sua gama de operações de clique, oferecendo segmentação precisa e vários métodos para lidar com vários cenários. Aqui está uma rápida análise de suas capacidades de clique:
| Tipo de clique | Método de Implementação | Melhor caso de uso |
|---|---|---|
| Clique Básico | page.click('#elemento') | Interações gerais dos elementos |
| Clique duplo | página.mouse.dblclick() | Formulários, seleção de texto |
| Botão direito do mouse | página.mouse.click(x, y, { botão: 'direita' }) | Ativando menus de contexto |
| Clique coordenado | página.mouse.click(x, y) | Trabalhando com telas ou mapas |
Esses métodos integram-se perfeitamente aos fluxos de trabalho de automação, abordando desafios comuns, como gerenciamento de estado de elementos e problemas relacionados a tempo. A API Locator do Puppeteer garante que os elementos estejam presentes e prontos antes da interação, reduzindo falhas de script causadas por erros de tempo. .
Para páginas da web complexas, o Puppeteer oferece suporte a seletores CSS avançados, incluindo aqueles para shadow DOM, ARIA atributos e segmentação baseada em texto. Isso o torna especialmente útil para conteúdo dinâmico, sobreposições e estruturas DOM intrincadas. A combinação desses seletores com os mecanismos de espera e tratamento de erros do Puppeteer garante uma automação suave e consistente.
"Certo, todas essas interações estão no nível do SO. O que significa que elas vivem fora do espaço do navegador/marionetista. Não há solução alternativa, pelo que eu sei." - ebidel
Artigos Relacionados
- Navegador sem cabeça em C#: configuração e exemplos de código
- Instalando e configurando o Puppeteer: resolvendo problemas comuns de dependência e Chromium
- Dominando a navegação de página com o Puppeteer: uso eficaz de goto e opções de navegação
- Automação de formulários com Puppeteer: entrada de texto, preenchimento de formulários e simulação de usuário



