Снимок экрана с указанным c элементом (python Хромированный драйвер селена) - PullRequest
0 голосов
/ 04 апреля 2020

У меня проблема с созданием снимка экрана с указанным c элементом, который в моем коде называется "article". Страница загружается, переходит к первому сообщению и снимает скриншот. Снимок экрана делается, но он не относится к указанному мною элементу "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()

Мой текущий снимок экрана, на котором сделан снимок, представляет собой либо часть блока post + comments, либо включает части веб-страницы, которые не являются блоком post + comments. Я бы хотел сделать скриншот только из "статьи".

1 Ответ

0 голосов
/ 05 апреля 2020

Причина root в том, что вы установили уровень масштабирования на 80%, а селен об этом не знает. Если вы создадите снимок экрана (вручную) с рассматриваемой страницы (с увеличением 80%), то вы увидите, что размер целевой области составляет около 747x481 пикселей. Если вы проверите, что элемент думает о себе (print(article.rect)), вы увидите, что селен не знает об изменении масштаба.

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

Или вы можете создать снимок экрана с экрана, рассчитать смещенные размеры и обрезать нужную область и сохранить ее. Это будет в основном

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