python - 拍摄特定元素的屏幕截图(python chromedriver selenium)
问题描述
我在截取特定元素的屏幕截图时遇到问题,在下面的代码中名为“article”。页面加载,导航到第一个帖子并截取屏幕截图。正在截取屏幕截图,但它不是我指定的元素“文章”的具体内容。我在下面提供了一些可测试的代码。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
class bot:
def __init__(self):
self.driver = webdriver.Chrome("path here")
def change_zoom(self, new_zoom):
"""
:param new_zoom: zoom level as a percentage
"""
change_js = """
var selectBox = document.querySelector("settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("settings-appearance-page").shadowRoot.querySelector("#zoomLevel");
var changeEvent = new Event("change");
selectBox.value = arguments[0];
selectBox.dispatchEvent(changeEvent);
"""
self.driver.get("chrome://settings/")
new_zoom = round(new_zoom / 100, 2)
self.driver.execute_script(change_js, new_zoom)
def nextPostPhoto(self):
driver = self.driver
driver.get("https://www.instagram.com/zuck/")
element= WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//body//div[contains(@class,'_2z6nI')]//div//div//div[1]//div[1]//a[1]//div[1]//div[2]")))
driver.execute_script("arguments[0].click()", element)
article = driver.find_elements_by_xpath('//div[@role="dialog" or @id="react-root"]//article')[-1]
screenshot_as_bytes = article.screenshot_as_png
with open('article.png', 'wb') as f:
f.write(screenshot_as_bytes)
if __name__ == "__main__":
bot = bot()
bot.change_zoom(80)
bot.nextPostPhoto()
我当前拍摄的屏幕截图是帖子+评论块的一部分,或者包括网页中不是帖子+评论块的部分。我想只截取“文章”的截图。
解决方案
根本原因是您将缩放级别设置为 80%,而 selenium 不知道这一事实。如果您从相关页面(以 80% 缩放)创建屏幕截图(手动),那么您可以看到目标区域大小约为 747x481 像素。如果您检查元素对自身的看法 ( print(article.rect)
),那么您可以看到 selenium 不知道缩放变化。
所以你的截图偏移的原因是缩放级别。如果这是否是 Selenium 错误,我无法判断。如果您将缩放级别保持在 100%,则屏幕截图将照常创建。
或者您可以从屏幕创建屏幕截图,计算偏移尺寸并裁剪所需区域并保存。那基本上是
推荐阅读
- css - Flexbox 没有垂直居中
- javascript - 这种类型的字符串叫什么?
- javascript - nuxtjs:如何强制页面重新加载并调用 asyncData()?
- r - 从 xlsb 文件中读取工作表名称
- azure-ad-b2c - 如何在 azure b2c 上设置自定义 IdP 的登录按钮
- query-string - Kentico:未找到长查询字符串加载页面
- reactjs - 如何从调色板材质ui中获取颜色
- python - Discord.py 从客户端切换到机器人
- node.js - 将反应表单中的数据传递给 expressJS 并重定向到 PayuMoney 网站以进行付款
- python - 使用 Word2Vec 的文本相似度