首页 > 解决方案 > 获取整个页面的屏幕截图并隐藏顶部导航栏无法按预期工作(Selenium,Python3)

问题描述

在阅读此StackOverflow 链接中的答案后,我找到了一种获取整个页面屏幕截图的方法。

此解决方案的问题是我试图在每次滚动时隐藏顶部导航栏,但代码似乎没有正确执行此操作..

我想隐藏它的原因是因为它在每个屏幕截图的顶部隐藏了页面的一部分。

在我的代码中,我遍历了一组页面,并且我为所有这些页面做着完全相同的工作。在某些情况下,它会隐藏顶部栏,而在其他一些页面中,它根本没有顶部栏。所以生成屏幕截图的代码看起来不是很稳定。

这是生成屏幕截图的代码的相关部分:

    # loop all pages
    j = 0
    while j < len(all_pages):
        browser.get(base_url + all_pages[j])

        total_width = browser.execute_script("return document.body.offsetWidth")
        total_height = browser.execute_script("return document.body.parentNode.scrollHeight")
        viewport_width = browser.execute_script("return document.body.clientWidth")
        viewport_height = browser.execute_script("return window.innerHeight")
        rectangles = []

        i = 0
        while i < total_height:
            ii = 0
            top_height = i + viewport_height

            if top_height > total_height:
                top_height = total_height

            while ii < total_width:
                top_width = ii + viewport_width

                if top_width > total_width:
                    top_width = total_width

                rectangles.append((ii, i, top_width,top_height))

                ii = ii + viewport_width

            i = i + viewport_height

        stitched_image = Image.new('RGB', (total_width, total_height))
        previous = None
        part = 0

        for rectangle in rectangles:
            if not previous is None:
                browser.execute_script("window.scrollTo({0}, {1})".format(rectangle[0], rectangle[1]))
                time.sleep(0.2)
                browser.execute_script("document.getElementById('header-container').setAttribute('style', 'position: absolute; top: 0px;');")
                time.sleep(0.2)
                time.sleep(0.2)

            file_name = "part_{0}.png".format(part)

            browser.get_screenshot_as_file(file_name)
            screenshot = Image.open(file_name)

            if rectangle[1] + viewport_height > total_height:
                offset = (rectangle[0], total_height - viewport_height)
            else:
                offset = (rectangle[0], rectangle[1])

            stitched_image.paste(screenshot, offset)

            del screenshot
            os.remove(file_name)
            part = part + 1
            previous = rectangle

        stitched_image.save("C:\\Users\\marialena\\source\\repos\\HTMLtoPDF\\all_files\\" + all_pages[j] + ".png",)

        j = j + 1

    browser.quit()

这是脚本执行后生成的两个屏幕截图:

没用 - 每次滚动的顶部栏: 坏情景

工作 - 仅第一次顶栏: 好情景

有人可以帮我理解为什么它只隐藏导航栏几次吗?它是否需要重置变量?

标签: javascriptpythonpython-3.xseleniumscreenshot

解决方案


根据@pcalkins 的建议,我为解决我的问题所做的是添加以下内容:

browser.execute_script("document.getElementById('header-container').innerHTML = '';")

在执行屏幕截图的行之前:browser.get_screenshot_as_file(file_name)


现在没有标题可见:

无标题截图


推荐阅读