等到 python 的 Selenium WebDriver 任务完成

Wait untill task is done with Selenium WebDriver for python

我尝试生成当晚的 1000 支最佳球队:https://www.fantasycruncher.com/lineup-rewind/draftkings/NHL/2019-02-03

但是,每次迭代只能生成 500 个团队。因此,我需要单击按钮 Calculate 500 more teams,但一旦浏览器生成前 500 个团队,该按钮就会变为停止。因此,我需要等待浏览器完成生成团队,然后按钮从显示的待处理 Stop 按钮切换回 Calculate 500 more teams

我试图等到 Calculate 按钮出现:

WebDriverWait(driver, 1000).until(EC.presence_of_element_located((By.CLASS_NAME, "calc-more-teams")))

或可点击:

calulatemorebutton=WebDriverWait(driver, 10000).until(EC.element_to_be_clickable((By.CLASS_NAME, "calc-more-teams")))

但是,我总是收到一条 WebDriverException 消息,指出该按钮在某处不可单击...查看元素面板(通过单击检查),我觉得 Calculate 500 more teams 按钮始终存在,但是当浏览器正在生成团队时会显示一个警告 Stop,因此我应该采取不同的方式进行。我试图等到不显示该警报,但没有成功。

这是有效的代码,但只生成了几个团队。代码有效,因为我添加了一些 time.sleep()。但是,如果您增加生成的团队数量,则 webDriverwait 将是必需的,代码将无法运行...

from selenium import webdriver
import csv
from selenium.webdriver.support.ui import Select
from datetime import date, timedelta
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.common.keys import Keys


chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
driver = webdriver.Chrome(chromedriver)

driver.get("https://www.fantasycruncher.com/lineup-rewind/draftkings/NHL/2019-02-03")

time.sleep(10)
closeButton = driver.find_element_by_class_name('close-login-alert')
closeButton.click()


# Generate lineups

Calculate_button = driver.find_element_by_id('calc-team')
select = Select(driver.find_element_by_id('select-objective'))
select.select_by_value("Actual_Pts")
lineups_textbox = driver.find_element_by_id('numOfLineups')
lineups_textbox.send_keys("10")
Calculate_button.click()

time.sleep(10)

closeButton2 = driver.find_element_by_class_name('swal2-confirm')
closeButton2.click()


# Calculate 500 more    
more = driver.find_element_by_class_name("run-results")
idid=more.get_attribute("id")
realid=idid+"-slider-input"
moremore=driver.find_element_by_id(realid)
moremore.clear()
moremore.send_keys("5")
time.sleep(10)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "calc-more-teams")))
calulatemorebutton=driver.find_element_by_class_name("calc-more-teams")
calulatemorebutton.click()

# # download csv    
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH , '//div[@data-action="downloadPlayerlist"]')))

download_button = driver.find_element_by_class_name(' export-csv-dropdown')
download_button.click()
csv= driver.find_element_by_xpath("//div[@data-optid='export']")
csv.click()

time.sleep(5)
driver.close()

我希望生成 1000 个团队并下载相应的 CSV 文件,但我无法通过等待浏览器生成第一组 500 个团队来生成更多的“500”,因此 Stop 按钮切换到 Calulate more

如您所说,按钮('Stop' 和 'Calculate # more teams')始终是 DOM 的一部分,但通常 "Stop" 按钮通过保持其 'style' 属性到 display:none。我们可以用它来确定您的情况。

单击 'Calculate 500 more teams' 按钮后,您可以调用它来等待 'Stop' 按钮消失。

from selenium.common.exceptions import TimeoutException
try:
    WebDriverWait(driver, 60).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".button.expand.stop-calc.alert")))
except TimeoutException:
    print("Did not load in time")
else:
    #download_your_csv