- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 Python 和 Selenium 对我梦幻足球队的选秀前策略页面中的球员进行重新排序。登录并进入页面没问题,但尝试交换播放器会导致一些问题。
到目前为止,我使用了以下代码但没有成功:
import nfl_useful_functions as nfl
from selenium.webdriver import ActionChains
import time
## Login to ESPN
driver = nfl.login2espn()
## Go to draft strategy page
driver.get("http://fantasy.espn.com/football/editdraftstrategy?leagueId=123456")
## Wait 10 seconds
time.sleep(10)
## Choose the player to be dragged (player 1)
draggable = driver.find_element_by_xpath("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[5]/div[2]/div[1]/div[1]/div[2]/div[2]/div[1]/div[2]/section[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[1]")
## Choose the player for player 1 to be dragged onto (and swapped with)
droppable = driver.find_element_by_xpath("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[5]/div[2]/div[1]/div[1]/div[2]/div[2]/div[1]/div[2]/section[1]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr[1]/td[1]/div[1]/table[1]/tbody[1]/tr[2]")
## Drag and drop
#Attempt 1
ActionChains(driver).drag_and_drop(draggable, droppable).perform()
#Attempt 2
ActionChains(driver).drag_and_drop_by_offset(draggable, 0, 40).perform()
#Attempt 3
ActionChains(driver).click_and_hold(draggable)\
.move_to_element(droppable)\
.release(draggable)\
.perform()
#Attempt 4
ActionChains(driver).click_and_hold(draggable)\
.move_to_element_with_offset(draggable,0,40)\
.release(draggable)\
.perform()
## Wait 5 seconds
time.sleep(5)
## Close driver
driver.close()
我已经(单独)尝试了每一种不同的尝试,但唯一(小)积极的是我试图移动的玩家似乎确实被选中了:
但实际上并没有什么结果。该脚本每次都成功运行(我的意思是没有错误)。如上所述,我试图拖动的播放器变灰两三秒,然后似乎放弃并且脚本结束。没有异常(exception)或任何事情。
还有什么我可以尝试的吗?理想情况下,它仍将使用 Python,除此之外我对任何建议都持开放态度!根据 Wappalyzer 的说法,如果它有用,相关页面的详细信息是:
编辑
This 是我手动交换玩家时页面的样子。 This 是我运行上面的脚本(尝试 1)时页面的外观。
编辑 2
我在 ESPN 上创建了一个一次性帐户,以便更轻松地重现问题。使用 od44@live.co.uk 和 Pa55word123 登录到 ESPN Fantasy,然后转到 Pre-Draft Strategy Page。
最佳答案
好吧,所以我尝试重现这个问题,我注意到它实际上可以改变玩家的位置,但前提是鼠标光标位于另一个玩家上方。您可以在视频中看到它 here
我已经尝试使用 headless selenium 希望问题不会再次发生但是 headless selenium 也失败了
所以知道问题(除了 selenium)是我使用的光标位置 pyautogui将光标移动到我们要放置播放器的位置:
from time import sleep
import pyautogui
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
# logged in manually
## Choose the player to be dragged (player 1)
draggable = driver.find_element_by_xpath("//div[@title='Rank' and text()=1]")
## Choose the player for player 1 to be dragged onto (and swapped with)
droppable = driver.find_element_by_xpath("//div[@title='Rank' and text()=2]")
pyautogui.moveTo(droppable.location['x'], droppable.location['y'])
sleep(0.1)
ActionChains(driver).drag_and_drop(draggable, droppable).perform()
这个“hack”对我有用。您可以在视频中看到它是如何工作的 here
尽管这有效(请记住使用不带工具栏的 selenium,因此不需要调整 Y
位置)。这不是完美的解决方案,因为您需要移动光标,在完美的世界中,您可以只使用 drag_and_drop 方法。但如果你认为它对你的个人项目有用,我认为你可以去做
关于python - 使用 Python 在 ESPN 的选秀前策略中重新排序球员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386820/
我是一名优秀的程序员,十分优秀!