Попробуйте указать, что вы хотите, чтобы элемент был видимым, с помощью
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 раз)
- , затем, после первого щелчка, переходите к следующему сценарию.быстрый темп ?