подождите, пока page.click вернет true - PullRequest
0 голосов
/ 21 января 2019

Я очищаю веб-сайт weather.com , я хочу щелкнуть по элементу html, чтобы получить данные и показать их, а затем удалить эти данные.

Но это не такЭто не всегда работает для меня, в большинстве случаев щелчок не происходит, и я получаю сообщение об ошибке, пытаясь удалить эти элементы

await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)')
await page.click('#twc-scrollabe > table > tbody > tr:nth-child(1)')

Что я должен сделать, чтобы убедиться, что щелчок произошел?

1 Ответ

0 голосов
/ 21 января 2019

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

await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)', { visible:true }) (вы заметили параметр {visible:true}?)

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

Подробнее

  • когда вы используете waitFor с селектором, который вы используете waitForSelector под капотом ( см. документы)
  • waitForSelector имеет ряд параметров ( см. Документы )
  • один из параметров - visible, в документах указано

ждать, пока элемент присутствует в DOM и будет видимым, т. Е. Не иметь display: none или visibility: hidden CSS-свойств.По умолчанию false.



Последнее, но не менее важное: @FeliFong попросил вас кое-что еще о вашей проблеме, потому что вы не предоставили достаточно информации о ней.Вы можете

  • указать, с какой страницы вы пытаетесь извлечь (если она общедоступна)
  • в противном случае вы можете сделать репозиторий GitHub, убрать все из вашего проектаоставляя только тот стол, о котором вы говорите, и сценарий Puppeteer
  • обычно, когда вы делаете репо, вы сами обнаруживаете проблему (это случалось со мной много раз)
  • еслиВы не решаете проблему самостоятельно, делая репо ... это нормально, мы здесь для этого, но гораздо проще загрузить репо, запустить его, исправить проблему, сделать запрос на получение доступа и затемвозвращаясь сюда и давая вам некоторые объяснения.
    Это полезно для нас, но в основном для вас, потому что я пытался ответить вам ... но я не могу знать, соответствует ли решение, которое я предоставил, вашим потребностям ... Если бы у меня былшанс проверить это с вашим репозиторием, я был бы уверен, что решил проблему ?

[ОБНОВЛЕНИЕ] Я исправил проблему в предоставленном вами хранилище, примите мой PR on GitHub.

Что я сделал: я сделал несколько тестов, и я не знаю, что, черт возьми, «блокирует» (или, лучше, останавливается от ожидания) кукловод на этом сайте ... но это не такне имеет значения, это мой код

let i = 0;
    let found = false;
    const maxRetries = 100;
    do {
        // waits for the element we need to click
        await page.waitForSelector('#twc-scrollabe > table > tbody > tr:nth-child(1)')
        // clicks it
        await page.click('#twc-scrollabe > table > tbody > tr:nth-child(1)')
        try {
            // waits for the content we need
            await page.waitForSelector('tr:nth-child(3) > td.sunrise > div > span:nth-child(2)', {timeout:1000});
            // if the content won't be showed the code doesn't go on and the next line won't be reached
            found = true;
        } catch(e) {}
    } while(!found || i > maxRetries) // the maxRetries variable is mere prudence
  • ждет элемента, который нам нужен, чтобы щелкнуть
  • щелкает по нему
  • ожидает подробного отображения содержимого(с таймаутом в 1000 мс)
  • , если не будет отображаться, просто повторите попытку (максимум 100 раз)
  • , затем, после первого щелчка, переходите к следующему сценарию.быстрый темп ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...