WebDriver.Wait() 在用于无限页面滚动的 While 循环中不起作用

WebDriver.Wait() not working inside a While loop used for infinite page scroll

提问人:Waqas Ahmed 提问时间:8/7/2023 最后编辑:Ajeet VermaWaqas Ahmed 更新时间:8/7/2023 访问量:26

问:

我想在 while 循环中使用函数。While loop 用于滚动无限滚动网站。我想在last_scroll和new_scroll之间等待一下,以加载页面内容。静态工作正常,但我不想使用它。WebDriver.Wait()time.sleep(10)

try:
    driver.get(url)
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'pb-xl')))
    self.writeToFile('test.txt','Page is loaded\n')
            # Get scroll height
    last_height = driver.execute_script("return document.body.scrollHeight")

    while True:
        print("Scrolling down...")
        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        print("Wait for new content to load...")
        # Wait to load page
        WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'pb-xl')))
        # time.sleep(10)
        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        print("Reached the end of the page.")
        last_height = new_height

        print("Loading next page")
    # print(driver.page_source)
    self.writeToFile('page_source.txt',driver.page_source)
except TimeoutException:
        self.writeToFile('test.txt','Timed out waiting for the element to appear\n')
except Exception as e:
        self.writeToFile('test.txt',f'Error: {str(e)}\n')

selenium-webdriver 网页抓取 webdriverwait infinite-scroll

评论

0赞 Community 8/7/2023
请澄清您的具体问题或提供其他详细信息,以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
0赞 Waqas Ahmed 8/7/2023
WebDriver.Wait() 函数调用 While 循环不起作用
0赞 pcalkins 8/8/2023
“presence_of_all_elements_located”只会等到至少一个元素存在。Selenium无法提前知道有多少元素......它也无法知道卷轴何时真正完成。如果你知道会有多少元素,你可以编程等待......但除此之外,只需使用睡眠。
0赞 Waqas Ahmed 8/8/2023
我只想检查至少一个元素的存在,然后向下滚动。由于它是一个无限滚动页面,所以我并不完全知道固定数量的预期元素
0赞 pcalkins 8/9/2023
因此,为了避免睡眠,您需要检查元素数组是否包含所有元素。为此,您需要对数组中的元素使用某种方法并检查“过时的元素异常”。如果你得到一个,你就知道该列表仍在填充中,你需要重新获取元素数组。这是解决这个问题的方法之一:stackoverflow.com/questions/66820416/......

答: 暂无答案