【发布时间】:2020-10-11 12:50:25
【问题描述】:
我的目标:
我正在尝试制作一个 python 机器人来赢得chrome's dino game。
游戏允许两种类型的跳跃:
- 短距离跳跃
- 跳远
使用main_body.send_keys(Keys.SPACE)(如下代码所示)可以进行短跳转。
我的问题:
我在跳远时遇到困难。
我的方法:
目前,对于跳远,我正在使用Keyboard 库:
keyboard.press(keyboard.KEY_UP)
不幸的是,这需要浏览器窗口始终处于焦点位置。后来,我想无头运行这个程序,所以这种方法行不通。
或者:
我试过ActionChains:
ActionChains(driver) \
.key_down(Keys.SPACE) \
.pause(0.2) \
.key_up(Keys.SPACE) \
.perform()
但这最终会滚动整个页面。并且没有达到预期的目的。
我只是希望直接将这些动作“发送”到画布元素,而不是在整个页面上执行它们......
我想做这样的事情:
main_body.key_down(Keys.SPACE)
time.sleep(0.2)
main_body.key_up(Keys.SPACE)
虽然这当然会给我这个错误:AttributeError: 'FirefoxWebElement' object has no attribute 'key_down' 因为canvas 没有属性key_down 或key_up。
这是一个 MCVE:
注意: 在代码中,恐龙会不断跳跃,但这不是重点,这只是为了检查跳跃的高度,而不是赢得比赛。
import keyboard
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get('https://chromedino.com/')
canvas = driver.find_element_by_css_selector('.runner-canvas')
main_body = driver.find_element_by_xpath("//html")
try:
canvas.click()
except:
main_body.send_keys(Keys.SPACE)
while True:
#short jump
main_body.send_keys(Keys.SPACE)
#long jump
ActionChains(driver) \
.key_down(Keys.SPACE) \
.pause(0.2) \
.key_up(Keys.SPACE) \
.perform()
#long jump using keyboard:
keyboard.press(keyboard.KEY_UP)
请为其他人注释掉代码,看看每种跳转的效果。
如果可能的话,建议一些其他的替代方法,在不使用 Keyboard 且不滚动整个页面的情况下进行跳远......
【问题讨论】:
-
使用
ActionChains不会滚动整个页面。在我的电脑上运行良好。(我正在使用Chrome) -
@jizhihaoSAMA 哦。我正在使用火狐。让我在 chrome 中试一试...
标签: python selenium selenium-webdriver canvas keyboard-python