使用selenium webdriver的HTML快照?

时间:2016-09-29 14:33:09

标签: python selenium-webdriver web-crawler

我试图将所有页面的可见内容捕获为文本。我们假设that为例。

如果我存储页面源,那么我将不会捕获评论部分,因为它是使用javascript加载的。

有没有办法用selenium webdriver拍摄HTML快照? (最好用python包装器表示)

2 个答案:

答案 0 :(得分:2)

无论页面的HTML是否是使用JavaScript生成的,您仍然可以使用driver.page_source捕获它。

我想你之所以能够捕获示例中评论部分的来源是因为它包含在iframe中 - 为了捕获框架内内容的html源代码/ iframe您需要首先将焦点切换到该特定帧,然后调用driver.page_source

答案 1 :(得分:0)

此代码将截取整个页面的屏幕截图:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://dukescript.com/best/practices/2015/11/23/dynamic-templates.html')
driver.save_screenshot('screenshot.png')
driver.quit()

但是,如果您只想要特定元素的屏幕截图,可以使用:

def get_element_screenshot(element: WebElement) -> bytes:
    driver = element._parent
    ActionChains(driver).move_to_element(element).perform()  # focus
    src_base64 = driver.get_screenshot_as_base64()
    scr_png = b64decode(src_base64)
    scr_img = Image(blob=scr_png)

    x = element.location["x"]
    y = element.location["y"]
    w = element.size["width"]
    h = element.size["height"]
    scr_img.crop(
        left=math.floor(x),
        top=math.floor(y),
        width=math.ceil(w),
        height=math.ceil(h))
    return scr_img.make_blob()

WebElement是您追逐的元素。当然,此方法要求您导入from base64 import b64decodefrom wand.image import Image来处理裁剪。