显式等待在python selenium webdriver中返回TimeOutException



我制作了一个代码来跟踪哪些FPL玩家在FPL前50名经理中。代码运行良好,但我想用显式等待替换time.sleep((以节省一些时间。然而,python只是返回TimeOutException,我不知道如何修复它。我尝试过使用隐式等待,但也不起作用。在试图找到第一个元素后,代码就被卡住了。我是一个python新手,代码看起来可能不太干净。如果你能发布你的代码建议和答案,我将不胜感激。

错误:

Traceback (most recent call last):
File "C:UsersWilliamPycharmProjectspythonProjectvenvLibsite-packagessympythis.py", line 26, in <module>
def_list.append(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[2]/div[{k}]/div/div/button/div/div[1]'))).text)
File "C:UsersWilliamAppDataRoamingPythonPython37site-packagesseleniumwebdriversupportwait.py", line 80, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

使用time.sleep((处理代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Chrome(r'C:Program Files (x86)GoogleChromeApplicationchromedriver.exe')
wait = 1.5
gk_list, def_list, mid_list, attack_list, subst_list = [],[],[],[],[]
driver.get('https://fantasy.premierleague.com/leagues/314/standings/c')
sleep(wait)
driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[1]/div[5]/button[1]').click() #Accepts cookies
for i in range(1,51): #Loop with common XPATH numbers for top 50 FPL players
navn = driver.find_element(By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div/table/tbody/tr[{i}]/td[2]/a/strong')
sleep(wait)
navn.click() #Clicks on the user
sleep(wait)

#Trying to find the goalkeeper
gk_list.append(driver.find_element(By.XPATH, '/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[1]/div[3]/div/div/button/div/div[1]').text)
for k in range(1,6):
try: #Trying to find the defenders
def_list.append(driver.find_element(By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[2]/div[{k}]/div/div/button/div/div[1]').text)
except NoSuchElementException: #Skips elements that does not exist
pass
try: #Trying to find the midfielders
mid_list.append(driver.find_element(By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[3]/div[{k}]/div/div/button/div/div[1]').text)
except NoSuchElementException:
pass
try: #Trying to find the attackers
attack_list.append(driver.find_element(By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[4]/div[{k}]/div/div/button/div/div[1]').text)
except NoSuchElementException:
pass
try: #Trying to find the subs
subst_list.append(driver.find_element(By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[2]/div/div[{k}]/div/div/button/div/div[1]').text)
except NoSuchElementException:
pass
sleep(wait)
driver.back() #Returns to main page

driver.quit()

gk_dict = dict() #Converts list to dictionary, key is player, value is player occurrence
for i in gk_list:
gk_dict[i] = gk_dict.get(i,0) + 1
def_dict = dict() 
for i in def_list:
def_dict[i] = def_dict.get(i,0) + 1
mid_dict = dict() 
for i in mid_list:
mid_dict[i] = mid_dict.get(i,0) + 1
attack_dict = dict() 
for i in attack_list:
attack_dict[i] = attack_dict.get(i,0) + 1
subst_dict = dict() 
for i in subst_list:
subst_dict[i] = subst_dict.get(i,0) + 1
gk_sorted = {k: v for k, v in sorted(gk_dict.items(), key = lambda v: v[1], reverse=True)} #Sorts the dictionaries from high values to low
def_sorted = {k: v for k, v in sorted(def_dict.items(), key = lambda v: v[1], reverse=True)}
mid_sorted = {k: v for k, v in sorted(mid_dict.items(), key = lambda v: v[1], reverse=True)}
attack_sorted = {k: v for k, v in sorted(attack_dict.items(), key = lambda v: v[1], reverse=True)}
subst_sorted = {k: v for k, v in sorted(subst_dict.items(), key = lambda v: v[1], reverse=True)}
print("nKeepers:n", gk_sorted,"n")
print("nDefenders:n", def_sorted,"n")
print("nMidfielders:n", mid_sorted,"n")
print("nAttackers:n", attack_sorted,"n")
print("nSubs:n", subst_sorted,"n")

无法使用excplicit wait的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(r'C:Program Files (x86)GoogleChromeApplicationchromedriver.exe')
gk_list, def_list, mid_list, attack_list, subst_list = [],[],[],[],[]
driver.get('https://fantasy.premierleague.com/leagues/314/standings/c')

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div/div/div[1]/div[5]/button[1]'))).click() #Accepts cookies
for i in range(1,51): #Loop with common XPATH numbers for top 50 FPL players
navn = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div/table/tbody/tr[{i}]/td[2]/a/strong')))
navn.click() #Clicks on the user

#Trying to find to goalkeeper
gk_list.append(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, '/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[1]/div[3]/div/div/button/div/div[1]'))).text)
for k in range(1,6):
try: #Trying to find the defenders
def_list.append(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[2]/div[{k}]/div/div/button/div/div[1]'))).text)
except NoSuchElementException:
pass
try: #Trying to find the midfielders
mid_list.append(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[3]/div[{k}]/div/div/button/div/div[1]'))).text)
except NoSuchElementException:
pass
try: #Trying to find the attackers
attack_list.append(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[1]/div[4]/div[{k}]/div/div/button/div/div[1]'))).text)
except NoSuchElementException:
pass
try: #Trying to find the subs
subst_list.append(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, f'/html/body/main/div/div[2]/div[2]/div[1]/div[4]/div/div/div/div/div[2]/div/div[{k}]/div/div/button/div/div[1]'))).text)
except NoSuchElementException:
pass
driver.back() #Returns to main page

driver.quit()

gk_dict = dict() #Converts list to dictionary, key is player, value is player occurrence
for i in gk_list:
gk_dict[i] = gk_dict.get(i,0) + 1
def_dict = dict() 
for i in def_list:
def_dict[i] = def_dict.get(i,0) + 1
mid_dict = dict() 
for i in mid_list:
mid_dict[i] = mid_dict.get(i,0) + 1
attack_dict = dict() 
for i in attack_list:
attack_dict[i] = attack_dict.get(i,0) + 1
subst_dict = dict() 
for i in subst_list:
subst_dict[i] = subst_dict.get(i,0) + 1
gk_sorted = {k: v for k, v in sorted(gk_dict.items(), key = lambda v: v[1], reverse=True)} #Sorts the dictionaries from high values to low
def_sorted = {k: v for k, v in sorted(def_dict.items(), key = lambda v: v[1], reverse=True)}
mid_sorted = {k: v for k, v in sorted(mid_dict.items(), key = lambda v: v[1], reverse=True)}
attack_sorted = {k: v for k, v in sorted(attack_dict.items(), key = lambda v: v[1], reverse=True)}
subst_sorted = {k: v for k, v in sorted(subst_dict.items(), key = lambda v: v[1], reverse=True)}
print("nKeepers:n", gk_sorted,"n")
print("nDefenders:n", def_sorted,"n")
print("nMidfielders:n", mid_sorted,"n")
print("nAttackers:n", attack_sorted,"n")
print("nSubs:n", subst_sorted,"n")

我知道您的代码可能正在工作,但拥有这样的绝对xpath定位器肯定会让它变得不稳定。尽量保持定位器的相对位置。我已经尽可能多地用相对定位器重构了你的代码,如果你愿意的话,你可以采取并改进这种方法。请注意,它不是广泛的代码,这意味着你不能盲目地使用它并运行它。它很容易出错(尤其是,当驱动程序导航到主页时,你可能会遇到过时的元素问题。不过,我不确定你在版本中是否遇到过(。此外,我使用了列表视图而不是字段视图,这使得遍历表和查找元素变得更容易,而不是在球场/字段上查找内容。

gk_list, def_list, mid_list, attack_list, subst_list = [], [], [], [], []
driver.get('https://fantasy.premierleague.com/leagues/314/standings/c')
WebDriverWait(driver, 10).until(EC.element_to_be_clickable(
(By.XPATH, '/html/body/div[2]/div/div/div[1]/div[5]/button[1]'))).click()  # Accepts cookies
# for i in range(1, 51):  # Loop with common XPATH numbers for top 50 FPL players
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.TAG_NAME, 'table')))
top_50 = driver.find_elements(By.XPATH, "//table//tbody//tr//td//following-sibling::td/a")
for each_one in top_50:
print(each_one.text)
each_one.click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='List View']"))).click()
players = driver.find_elements(By.XPATH, "//th[text()='Starters']//ancestor::table//tr[contains(@class, 'ElementTable__')]")
for player in players:
player.click()
# Trying to find to goalkeeper
try:
gkp = driver.find_elements(By.XPATH, "//span[text()='GKP']//parent::div//preceding-sibling::div")
for keeper in gkp:
gk_list.append(keeper.text)
except NoSuchElementException:
pass
try:
defenders = driver.find_elements(By.XPATH, "//span[text()='DEF']//parent::div//preceding-sibling::div")
for defender in defenders:
def_list.append(defender.text)
except NoSuchElementException:
pass
try:
attackers = driver.find_elements(By.XPATH, "//span[text()='MID']//parent::div//preceding-sibling::div")
for attacker in attackers:
attack_list.append(attacker.text)
except NoSuchElementException:
pass
try:
subs = driver.find_elements(By.XPATH, "//th[text()='Substitutes']//ancestor::table//tr[contains(@class, 'ElementTable__')]")
for each_sub in subs:
subst_list.append(each_sub.text)
except NoSuchElementException:
pass
driver.back()  # Returns to main page

driver.quit()
gk_dict = dict()  # Converts list to dictionary, key is player, value is player occurrence
for i in gk_list:
gk_dict[i] = gk_dict.get(i, 0) + 1
def_dict = dict()
for i in def_list:
def_dict[i] = def_dict.get(i, 0) + 1
mid_dict = dict()
for i in mid_list:
mid_dict[i] = mid_dict.get(i, 0) + 1
attack_dict = dict()
for i in attack_list:
attack_dict[i] = attack_dict.get(i, 0) + 1
subst_dict = dict()
for i in subst_list:
subst_dict[i] = subst_dict.get(i, 0) + 1
gk_sorted = {k: v for k, v in sorted(gk_dict.items(), key=lambda v: v[1],
reverse=True)}  # Sorts the dictionaries from high values to low
def_sorted = {k: v for k, v in sorted(def_dict.items(), key=lambda v: v[1], reverse=True)}
mid_sorted = {k: v for k, v in sorted(mid_dict.items(), key=lambda v: v[1], reverse=True)}
attack_sorted = {k: v for k, v in sorted(attack_dict.items(), key=lambda v: v[1], reverse=True)}
subst_sorted = {k: v for k, v in sorted(subst_dict.items(), key=lambda v: v[1], reverse=True)}
print("nKeepers:n", gk_sorted, "n")
print("nDefenders:n", def_sorted, "n")
print("nMidfielders:n", mid_sorted, "n")
print("nAttackers:n", attack_sorted, "n")
print("nSubs:n", subst_sorted, "n")

正如我所说,你可以将此作为参考,并对其进行改进

最新更新