У меня есть селен, настроенный как:
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
@BoboDarph Я забыл добавить driver.implicitly_wait(10) к вопросу, но он у меня есть в коде. Обновил вопрос. Запуск его без режима без головы такой же. Я обновил вопрос еще одним кодом.
Таким образом, вы запускаете _get_data в цикле, верно? В противном случае было бы бессмысленно видеть несколько его экземпляров. Попробуйте добавить ожидание после отправки SPACE. Ваш Runner.instance.started может вернуть True, но холст может быть еще не заполнен.
Я добавил sleep(1) после того, как SPACE был отправлен. Та же проблема. Общая идея такова: подключить селен, дождаться запуска игры, собрать данные холста. Я могу запускать __get_data в цикле с 1s интервалами, и я все равно получаю пустое data независимо от того, как долго я жду. Данные холста, возвращаемые execute_script(), всегда пусты. Но этого не должно быть.
Можете ли вы также добавить небольшое ожидание в цикле while после печати? PS: вы можете захотеть использовать sikulix, если Selenium продолжает упрямиться. Мне удалось использовать его для автоматизации тестов холста, которые создавали проблемы с Selenium.






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