Как мне заставить кукловода щелкнуть по ссылке?

#javascript #puppeteer

#javascript #кукловод

Вопрос:

Я хочу создать скребок с помощью puppeteer, который открывает сайт, использует его панель поиска и открывает первую ссылку.

Это код:

 const puppeteer = require('puppeteer');
    
 (async () => {
    let browser = await puppeteer.launch();
    let page = await browser.newPage();
    await page.goto('https://example.com', {waitUntil: 'networkidle2'});
        
     await page.click('[name=query]');
    await page.keyboard.type("(Weapon)");
    await page.keyboard.press('Enter');
    await page.waitForSelector('div[class="search-results"]', {timeout: 100000});
});
 

Проблема в том, что я не могу заставить его открыть первую ссылку из результатов поиска, я попытался использовать page.click(), но все результаты поиска одинаковы, кроме URL.

Что я хочу знать, так это как я могу заставить его открыть первую ссылку из результатов поиска.

Ответ №1:

Есть больше способов решить эту проблему. Я рекомендую немного поэкспериментировать с этим, чтобы вы узнали разные способы сделать это.

 await page.click('.search-results a');
 

оказывается, кукловод всегда нажимает на первый элемент, который он находит, поэтому, если вы хотите первый, этого будет достаточно.

Или вы можете выбрать все ссылки, а затем щелкнуть по первой:

 const resultLinks = await page.$('.search-results a');
resultLinks[0].click();
 

Было бы лучше включить условие и здесь, чтобы вы не получили ошибку, потому что элемент не был найден:

 const resultLinks = await page.$('.search-results a');
if (resultLinks.length) resultLinks[0].click();
 

Есть и другие способы, поэтому, если вы хотите узнать больше, пожалуйста, обратитесь к документации API.

Комментарии:

1. Он не нажимает на ссылку, и я думаю, что знаю, почему под результатами поиска есть элементы item, а под каждым из них есть элемент title, в котором находится ссылка, что мне делать?

2. Я протестировал его на своем сайте, я совершенно уверен, что он нажимает на первую ссылку. Тем не менее, сайт показывает некоторую ошибку (тайм-аут) при поиске сейчас, так что вы на самом деле никогда не получите результаты. Кроме того, вам нужно научиться отлаживать свой код, чтобы вы могли проверить, работает он или нет. Хорошим началом является запуск вашего скрипта в безголовом режиме.

3. Метод puppeteer.launch() может принимать объект option в качестве первого аргумента, чтобы вы могли передать { headless: false } . Смотрите документацию, на которую я ссылался: github.com/puppeteer/puppeteer/blob/main/docs /…

4. У меня нет всей информации, которую вы предоставляете, если у вас есть несколько проблем с тем, что вы делаете, я знаю только об этом, нажав на первую ссылку. Это то, что я ответил. Я думаю, вы можете справиться с остальным с помощью документации и отладки.

5. Да, я понимаю, что вы помогли мне за то, что я спросил, за что я очень благодарен, и если я не смогу это исправить, я просто опубликую здесь еще один вопрос.