Как найти координаты элемента в iFrame - Python Selenium - PullRequest
0 голосов
/ 22 марта 2020

Я хотел бы сделать скриншот визуализации Tableau Publi c, сделав снимок экрана всего сайта и обрезав его. Я могу найти высоту и ширину моего элемента, но мои координаты x и y неверны. Я предполагаю, что x = 0 и y = 0 - это координаты моего элемента в iframe, но не координаты на веб-сайте.

Как получить координаты для iframe, чтобы я мог обрезать свое изображение по центру? На данный момент он просто обрезает левую часть сайта.

from selenium import webdriver
import time
from PIL import Image

driver = webdriver.Chrome(executable_path=r'C:\Program Files\chromedriver.exe')

# Maximise window and zoom out
driver.get('chrome://settings/')
driver.maximize_window()
driver.execute_script('chrome.settingsPrivate.setDefaultZoom(0.6);')

driver.get("https://public.tableau.com/en-gb/gallery/super-pac-origins?tab=viz-of-the-day&type=viz-of-the-day")

time.sleep(5)
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))

element = driver.find_element_by_xpath('//div[@id = "tab-dashboard-region"]')

location = element.location
print(location)
size = element.size 
print(size)

# Take a screenshot
driver.save_screenshot("C:\\Desktop\\Images_png\\test1.png")
time.sleep(2)

#Crop image
x = location['x']
y = location['y']
width = location['x']+ size['width']
height = location['y']+ size['height']

im = Image.open("C:\\Desktop\\Images_png\\test1.png")
im = im.crop((int(x), int(y), int(width), int(height)))
im.save("C:\\Desktop\\Images_png\\Crop\\test1.png")

# Close the current tab
driver.close()

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Я рассчитал позиции вручную, исходя из предположения, что все мои скриншоты имеют одинаковые размеры: 1920 * 899.

#Crop image
# 1920 is the width of the screenshot
# 899 is the height of the screenshot
# 0.74 considers the zoom factor

left = (1920 - size['width']*0.74)/2
right = left + size['width']*0.74
top = 110 # Hardcoded because it's always the same value
bottom = top + size['height']*0.74


im = Image.open("C:\\Desktop\\Images_png\\test1.png")
print(im.size)
im = im.crop((left, top, right, bottom))
im.save("C:\\Desktop\\Images_png\\Crop\\test1.png")
0 голосов
/ 22 марта 2020

Я предлагаю вместо того, чтобы сделать снимок экрана со всем сайтом, вы можете найти элемент и сделать снимок этого элемента следующим образом:

Допустим, вы хотите сделать снимок экрана элемент

from io import BytesIO
from PIL import Image

img = element.screenshot_as_png
stream = BytesIO(img)
image = Image.open(stream).convert("RGB")
image.save("imageTable.png")

Дайте мне знать, если это решит вашу проблему: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...