Проблемы с получением скриншота любого элемента после увеличения - PullRequest
7 голосов
/ 30 сентября 2019

Я пытаюсь сделать скриншот нужной части с веб-страницы, используя python в сочетании с селеном. Когда я выполняю свой скрипт, я получаю скриншот, но это не то, что я намеревался позволить скрипту захватить.

Я хочу взять часть, показанную в Desired one ниже, вместо Current output. Чтобы получить screenshot в точности так, как это показано в Desired one, скрипт должен нажать на эту кнопку + рядом с этим изображением, чтобы сделать его более широким, чтобыточки на галерее должны быть видны.

Тем не менее, текущий подход использует только скриншот частичной части этого изображения. Кроме того, он также захватывает нежелательную часть.

Ссылка на веб-страницу

Я пробовал:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

link = 'https://www1.ticketmaster.com/celine-dion-courage-world-tour/event/0600567BFDB0AB48'

def start_script():
    options = webdriver.ChromeOptions()
    options.add_argument("--start-maximized")
    driver = webdriver.Chrome(options=options)
    return driver

def get_links(url):
    driver = start_script()
    driver.get(url)
    try:
        button = WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#landingPricingMessage button.pricing-landing__modal-btn")))
    except Exception: button = ""
    if button: button.click()

    try:
        zoom = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"button[class='zoomer__control--zoomin'] > svg[class='zoomin']")))
    except Exception: zoom = ""

    if zoom:
        for _ in range(3):
            zoom.click()
            time.sleep(2)
    try:
        element = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"svg[data-component='svg'][class='map__svg']")))
    except Exception: element = ""

    if element:
        element.screenshot('gallery.png')
        driver.quit()
        return 0

    else:
        driver.quit()
        return get_links(url)


if __name__ == '__main__':
    get_links(link)

Я даже попробовал вот так, но вывод все тот же:

def get_links(url):
    driver = start_script()
    driver.get(url)
    try:
        elem = WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.XPATH,"//h1[contains(.,'Pardon the Interruption')]"))).text
    except Exception: elem = ""

    if elem:
        driver.quit()
        return get_links(url)
    else:
        element = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"svg[data-component='svg'][class='map__svg']")))
        location = element.location
        size = element.size
        png = driver.get_screenshot_as_png()
        im = Image.open(BytesIO(png))
        left = location['x']
        top = location['y']
        right = location['x'] + size['width']
        bottom = location['y'] + size['height']
        im = im.crop((left, top, right, bottom))
        im.save('screenshot.png')
        driver.quit()
        return 0

Токовый выход

Требуемый

В желаемом выходном изображении я выделил область, которая должна быть удалена, поскольку она не является частью этого изображения.

Как я могу получить только скриншот любого элемента даже после увеличения?

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

Ответы [ 2 ]

5 голосов
/ 07 октября 2019

Карта содержится внутри <div id="map-container">. Если вы сделаете скриншот этого элемента, он захватит увеличенную карту

element = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID, 'map-container')))
element.screenshot('gallery.png')
2 голосов
/ 30 сентября 2019

Это не ответ на ваш вопрос, мне не удалось перейти по ссылке ticketmaster, веб-приложение не смогло определить тип моего браузера и не отображало событие.

Если вы хотите сделать скриншотэлемента dom, вы можете вызвать метод снимка экрана для объекта webelement. Надеюсь, это поможет.

from selenium.webdriver import Chrome

driver = Chrome()
driver.get('/12831338/problemy-s-polucheniem-skrinshota-lybogo-elementa-posle-uvelicheniya')
question = driver.find_element_by_id('question-header')
question.screenshot('question.png')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...