Снимки экрана делаются, когда веб-страницы еще полностью загружены при использовании PhantomJS в python - PullRequest
0 голосов
/ 18 мая 2019

Возникла проблема, когда я пытался получить скриншоты с помощью PhantomJs & Python, некоторые из полученных мной изображений загружены не полностью.

Я попытался решить ее с помощью driver.implicitly_wait(5), но она не сработала.

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get("https://world.taobao.com")
driver.save_screenshot('x.png')

Доза, кто-нибудь знает об этом?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Я нашел способ решить эту проблему - выполнить JS-скрипт для прокрутки всей страницы:

from selenium import webdriver
import time


def take_screenshot(url, save_fn="capture.png"):
    browser = webdriver.Chrome()
    # browser = webdriver.PhantomJS()
    browser.set_window_size(1200, 900)
    browser.get(url)
    # scroll down to the bottom and scroll back to the top
    browser.execute_script("""
        (function () {
            var y = 0;
            var step = 100;
            window.scroll(0, 0);

            function f() {
                if (y < document.body.scrollHeight) {
                    y += step;
                    window.scroll(0, y);
                    setTimeout(f, 100);
                } else {
                    window.scroll(0, 0);
                    document.title += "scroll-done";
                }
            }

            setTimeout(f, 1000);
        })();
    """)

    for i in range(30):
        if "scroll-done" in browser.title:
            break
        time.sleep(10)
        print(i)

    browser.save_screenshot(save_fn)
    browser.close()


if __name__ == "__main__":

    take_screenshot("http://world.taobao.com")

Благодаря этому оригинальному сообщению: https://cloud.tencent.com/developer/article/1406656

0 голосов
/ 18 мая 2019

с использованием driver.implicitly_wait(5) будет применено один раз ко всем элементам, присутствующим на странице, в течение максимум 5 секунд и будет недостаточным, если элементы занимают больше времени.Обратите внимание, что его нужно будет написать только один раз.Вы можете добавить time.sleep(10) с помощью модуля time или аналогичное время ожидания, если вы уверены, сколько времени потребуется для полной загрузки изображений, или использовать явное ожидание.

importследующее

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

Предполагая, что у вас есть локатор элемента, который вы хотите убедиться в том, что он видим, и хотите найти его с помощью XPath в этом примере (в случае, если возвращено несколько элементов с циклическим возвращением элементов)

locator = (By.XPATH,"SOME_VALID_XPATH")

Определите переменную для хранения объекта WebDriverWait следующим образом:

wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located(locator))

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

Я бы предложил использовать модуль time или явное ожидание.,

Ссылка на документацию

...