我为什么不能向下滚动页面?

0 投票
4 回答
2844 浏览
提问于 2025-04-17 21:33

我正在用Python和Selenium来让网页向下滚动,使用的是execute_script这个命令。但是,当我运行我的代码时,网页并没有滚动到最底部。以下是我的代码:

def create_browser(first_page=None):
    print "Starting"
    browser = webdriver.Firefox()
    if first_page:
        browser.get(first_page)
    print "Done."
    return browser

browser = create_browser()
print 'loaded'
browser.get('https://chrome.google.com/webstore/detail/ie-tab/hehijbfgiekmjfkfjpbkbammjbdenadd/reviews')
time.sleep(4)
elem = WebDriverWait(browser, 30).until(EC.presence_of_all_elements_located((By.XPATH, '//a[@ga:type="NextLink"]')))
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
print "Scrolled."

我在控制台上看到“Scrolled.”的提示,但网页并没有向下滚动。我看到有些页面说browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")这个命令可以把我滚动到网页底部。但是在我的情况下并没有发生这种情况。这是不是和网页使用了AJAX有关?还是说有其他原因?更重要的是,我该如何向下滚动网页?我想向下滚动网页并点击“下一页”,这样我就能看到下一个评论,我想一直这样做,直到评论结束。我该怎么做呢?

4 个回答

0

使用这段代码:

JavascriptExecutor jse = (JavascriptExecutor) browser; jse.executeScript("window.scrollBy(0,document.body.scrollHeight || document.documentElement.scrollHeight)", "");

替换掉你原来的代码:

browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

0

另一种向下滚动的方法是找到页面的标签,然后在这个元素上发送:space或者:down键。

body = driver.find_element(:tag_name, 'body')
body.send_keys :space

或者

body.send_keys :down

你可以一直重复向下滚动的动作,直到满足你的条件为止。

1

我需要加一个小延迟才能让它正常工作。别问我为什么……1毫秒也没什么好争论的:

<body onload="setTimeout(function(){window.scrollBy(0,document.body.scrollHeight)}, 1);>
0

看起来你在访问的网页上,滚动条并不是你当前窗口的滚动条。你可能是想滚动评论框或者覆盖层,而不是整个页面的内容。因为滚动整个页面其实是没有(可见的)效果的。

所以你需要找到你想要滚动的那个元素,然后对那个元素进行滚动。

比如,评论框的选择器(可以滚动的)是 .webstore-te-qc-rb-Lg。那么你的代码大概会像这样:

var a = document.getElementsByClassName("webstore-te-qc-rb-Lg");
// assuming a.length == 1
a[0].scrollTop = a[0].scrollHeight;

这对我来说是有效的,但具体还得看你想要操作哪个元素,以及滚动条在哪里。你可以使用火狐浏览器自带的开发者工具来找到它:打开检查器 > 用鼠标选择元素,找到包裹着滚动条和相关内容的那个元素。

希望这能帮到你。

撰写回答