Кукольник Выбрать Ссылку - PullRequest
0 голосов
/ 24 июня 2018

Я хочу щелкнуть ссылку на html-странице, которая содержит следующий фрагмент:

<p>Die maximale Trefferanzahl von 200 wurde überschritten.
  <a href="/rp_web/search.do?doppelt">Verdoppeln Sie hier  Suchergebnislimit.</a>
</p>

Я устанавливаю несколько фильтров, а затем загружаю страницу, которая загружает нужную мне страницу.,На этой полученной странице я хочу щелкнуть ссылку, как показано во фрагменте HTML.JS, который я пытаюсь использовать, это

await Promise.all([
    page.click('input#landNW'), // set a filter
    page.click('input[type=submit]'), // submit the form
    page.waitForNavigation(), // wait for the page to load
    page.click('p a'), // not working: double the search results
    page.waitForNavigation() // not working: waiting for the page to reload
]).catch(e => console.log(e)); // no error

Я почти уверен, что page.click('p a') работает правильно, потому что в консоли моего браузера Chrome я могу сделать document.querySelector("p a").click(), который затем перезагружаетсястраница, как и ожидалось.

Я также пытался выбрать URL с помощью атрибута href, например, с page.click('a[href="/rp_web/search.do?doppelt"]'), но я получил ошибку: No node found for selector: a[href="/rp_web/search.do?doppelt"].

Как я могувыполнить то, что я ожидаю?

РЕДАКТИРОВАТЬ Вы можете найти полный репозиторий здесь: bitbucket / ytNeskews

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Код кажется нормальным, и я думаю, что кукловод действительно пытается щелкнуть мышью.Тем не менее, он не нажимает на соответствующую ссылку.

Измените область просмотра на

await page.setViewport({width: 1366, height: 768})

, и ваш код работает.Сообщите команде кукловода об этой возможной ошибке.

0 голосов
/ 25 июня 2018

Есть много сообщений о том, что page.click не работает, и в вашем случае это действительно не будет работать по какой-то причине. К счастью, мы можем сделать все с помощью старого доброго page.evaluate (или page.$eval): здесь я нажимаю ссылку вручную в контексте браузера:

const puppeteer  = require ('puppeteer');
(async () => {
    const browser = await puppeteer.launch({ headless : false });
    const page = await browser.newPage();
    await page.goto('https://www.handelsregister.de/rp_web/mask.do?Typ=e');

    await Promise.all([
        page.click('input#landNW'), // set a filter
        page.click('input[type=submit]'), // submit the form
        page.waitForNavigation(), // wait for the page to load
    ]).catch(e => console.log(e));

    // Print the number of allowed results (must be 200)
    console.log(await page.$eval('#inhalt p', el => el.textContent.match(/\d+ hits/)[0]));

    await Promise.all([
         // Manual clicking of the link
         page.$eval('p a', el => el.click()),
         page.waitForNavigation()
    ]).catch(e => console.log(e));

    // Print the number of allowed results (must be 400 now)
    console.log(await page.$eval('#inhalt p', el => el.textContent.match(/\d+ hits/)[0]));

    await browser.close();
})();

Результаты:

200 просмотров
400 просмотров

Также не то, чтобы вам приходилось ждать только одну страницу навигации одновременно. И еще одно замечание, если можно - гораздо удобнее писать такие сценарии с видимым Chromium ({headless: false}).

...