在python中使用PhantomJS时,如果网页尚未完全加载,则会截取屏幕截图

时间:2019-05-18 09:45:42

标签: python selenium selenium-webdriver phantomjs

当我使用PhantomJs和Python来获取屏幕截图时,出现了一个问题,我得到的某些图像没有完全加载。

我试图通过使用driver.implicitly_wait(5)来解决它,但是没有用。

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get("https://world.taobao.com")
driver.save_screenshot('x.png')

有人知道吗?

2 个答案:

答案 0 :(得分:0)

使用driver.implicitly_wait(5)将一次应用于页面中的所有元素,最长不超过5秒,如果元素花费的时间更长,这将是不够的。注意,它也只需要写一次。 如果您确定完全加载图像需要多少时间,则可以使用time.sleep(10)模块添加time或类似的等待时间,或者使用显式等待。

导入以下内容

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

假设您具有要确保其可见的元素的定位器,并且在此示例中要使用XPath进行定位(如果有多个元素循环返回元素)

locator = (By.XPATH,"SOME_VALID_XPATH")

定义变量以容纳WebDriverWait对象,如下所示:

wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located(locator))

问题可能是图像可以具有尺寸,因此被视为已加载且可见。一种解决方法是存储图像,并断言加载的图像等于它们,这对于一个简单的情况来说是一个相当复杂的解决方案。

我建议使用time模块或显式等待。

Link to the documentation

答案 1 :(得分:0)

我发现解决此问题的方法是执行JS脚本以滚动浏览整个页面:

from selenium import webdriver
import time


def take_screenshot(url, save_fn="capture.png"):
    browser = webdriver.Chrome()
    # browser = webdriver.PhantomJS()
    browser.set_window_size(1200, 900)
    browser.get(url)
    # scroll down to the bottom and scroll back to the top
    browser.execute_script("""
        (function () {
            var y = 0;
            var step = 100;
            window.scroll(0, 0);

            function f() {
                if (y < document.body.scrollHeight) {
                    y += step;
                    window.scroll(0, y);
                    setTimeout(f, 100);
                } else {
                    window.scroll(0, 0);
                    document.title += "scroll-done";
                }
            }

            setTimeout(f, 1000);
        })();
    """)

    for i in range(30):
        if "scroll-done" in browser.title:
            break
        time.sleep(10)
        print(i)

    browser.save_screenshot(save_fn)
    browser.close()


if __name__ == "__main__":

    take_screenshot("http://world.taobao.com")

感谢这篇原始文章:https://cloud.tencent.com/developer/article/1406656