我要抓取一个网站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)')
我该怎么做才能确保点击发生?
答案 0 :(得分:0)
尝试指定您希望元素显示为
await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)', { visible:true })
(您注意到{visible:true}
选项吗?)
因为该元素可能在页面中,但在waitFor
找到该元素时不可点击。
更多详细信息
waitFor
与选择器一起使用时,您正在see the docs之下使用waitForSelector
waitForSelector
有一系列选项(see the docs)visible
等待元素出现在DOM中并可见,即不具有
display: none
或visibility: hidden
CSS属性。默认为false
。
最后但并非最不重要的一点:@FeliFong向您询问了有关您的问题的更多信息,因为您没有提供有关此问题的足够信息。你可以
[更新] 我已将问题解决在您提供给我的存储库中,并在GitHub上接受了我的PR。
我做了什么:我进行了一些测试,但不知道到底该站点中的Puppeteer会“阻止”(或者,更好的是,停止等待)……但这没关系,这是我的代码
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