Selenium chromedriver возвращает пустые данные для холста

У меня есть селен, настроенный как:

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1200x600')

driver = webdriver.Chrome(options=options)
driver.implicitly_wait(10)   
driver.get('file:///path_to_file')

Когда я выполняю скрипт:

data = driver.execute_script('return document.getElementsByClassName("runner-canvas")[1].getContext("2d").getImageData(0,0,600,150);')['data']`

Данные все нули: [0,0,0,0, 0,0,0,0 ..., 0,0,0,0].

Но когда я делаю скриншот, в то же время с:

driver.save_screenshot(os.path.join(os.path.dirname(os.path.realpath(__file__)), '.', 'screenshot.png'))

Я вижу, что холст заполнен.

Canvas загружает игру, которая не запускается, пока не будет нажата SPACE. Функция, отвечающая за сбор данных холста, выглядит примерно так:

# Somewhere before the __get_data is called
self.document.send_keys(Keys.SPACE) # self.document is set to html document


def __get_data(self):
    while self.driver.execute_script("return Runner.instance_.started") == False:
        print('Waiting to start')
    # data is always empty at this stage
    data = self.driver.execute_script('return document.getElementsByClassName("runner-canvas")[1].getContext("2d").getImageData(0,0,600,150);')['data']
    rgba = np.array(data).reshape((90000, 4))
    b = a[:, 2]
    return a.reshape((150, 600))

Когда я запускаю его, я вижу много 'Waiting to start' в консоли, поэтому я не думаю, что это проблема времени, поскольку к тому времени, когда while сломается, все должно быть нарисовано, так как игра уже началась.

Я на Mac работаю ChromeDriver 2.46.628411

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

BoboDarph 14.02.2019 13:57

@BoboDarph Я забыл добавить driver.implicitly_wait(10) к вопросу, но он у меня есть в коде. Обновил вопрос. Запуск его без режима без головы такой же. Я обновил вопрос еще одним кодом.

Kocur4d 14.02.2019 14:16

Таким образом, вы запускаете _get_data в цикле, верно? В противном случае было бы бессмысленно видеть несколько его экземпляров. Попробуйте добавить ожидание после отправки SPACE. Ваш Runner.instance.started может вернуть True, но холст может быть еще не заполнен.

BoboDarph 14.02.2019 14:24

Я добавил sleep(1) после того, как SPACE был отправлен. Та же проблема. Общая идея такова: подключить селен, дождаться запуска игры, собрать данные холста. Я могу запускать __get_data в цикле с 1s интервалами, и я все равно получаю пустое data независимо от того, как долго я жду. Данные холста, возвращаемые execute_script(), всегда пусты. Но этого не должно быть.

Kocur4d 14.02.2019 14:42

Можете ли вы также добавить небольшое ожидание в цикле while после печати? PS: вы можете захотеть использовать sikulix, если Selenium продолжает упрямиться. Мне удалось использовать его для автоматизации тестов холста, которые создавали проблемы с Selenium.

BoboDarph 14.02.2019 14:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
323
1

Ответы 1

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

Дайте нам знать, если работает или нет ..

Другие вопросы по теме