簡體   English   中英

如何使Python / Selenium等待文件處理,然后單擊下載

[英]How can I make Python/Selenium wait for file to process then click download

我正在嘗試使用Python / Selenium來自動化下載每天更新的文件的過程。 到目前為止,我的代碼打開了網站,選擇了我想要的條件(下載CSV格式的文件),然后單擊“開始處理”按鈕。 單擊“開始處理”后,網站的設置方式將通過帶有加載欄(指示處理完成)和“取消請求”按鈕的網站將您重定向到其他頁面,大約10秒鍾后文件已准備就緒,“取消請求”按鈕變為“下載我的文件”按鈕。 隨着年份的延長,文件將逐漸變大,因此處理時間將從約10秒縮短至幾(2-4)分鍾。 如果時間超過5分鍾,處理將自動超時。 我的“#應該等待文件處理”嘗試是要等到ID“ btn_download”(單擊“ Download my File”的ID)出現后再單擊“ Download my File”鏈接。 我認為我編寫的用於下載文件的代碼將起作用,因為該代碼可以開始處理,並且它們都是“類型:提交”鏈接,但是我不確定是否無法下載的原因是因為“等待”代碼無法正常工作,或者它是否是“下載代碼”(或兩者)。 我嘗試使用“ delay = x”,driver.implicitly_wait(x)和“ time.sleep(x)”,但它們對我不起作用(我不確定使用它們是否正確)。 最終目標是打開頁面,選擇CSV標准,開始處理,等待處理完成,下載文件,然后將其保存到硬盤中的文件夾中(而不是將其保留在下載中)

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException

#Opens the website
browser = webdriver.Firefox() 
browser.get("https://mywebsite.com")

#Clicks CSV Option
browser.find_element_by_id("rdo_file").click()

#Starts Processing
browser.find_element_by_id("btnStart").click()

#Supposed to wait for the file to process 
try:
element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "btn_download"))
)

#Supposed to click the "Download my File" link
browser.find_element_by_id("btn_download").click()

如果您可以幫助我將文件下載到硬盤中的特定文件,則可加分! 謝謝您的幫助!

編輯以添加錯誤消息:

File "<stdline>" line 6
^
Syntax Error: invalid syntax

還剛剛意識到,在顯示該錯誤消息之后,Python允許我再次按Enter鍵以處理“下載我的文件”代碼,該代碼確實有效。 因此,我的問題出在等待代碼上(需要它等待並自動繼續執行該過程,因此我無需返回並按Enter鍵)。

from selenium.webdriver.support import expected_conditions as EC

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "btn_download"))
    )
except:
    wait = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'btn_download')))
browser.find_element_by_id("btn_download").click()

根據您的觀察, 問題出在等待代碼上 ,按照HTML提供的內容 ,您可以單擊按鈕開始下載文件,可以使用以下任一代碼行:

  • CSS_SELECTORclick()

     WebDriverWait(driver, 300).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#btn_download[name='btn_download'][value='Download My File']")).click() 
  • CSS_SELECTORCSS_SELECTOR submit()

     WebDriverWait(driver, 300).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#btn_download[name='btn_download'][value='Download My File']")).submit() 
  • XPATHclick()

     WebDriverWait(driver, 300).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='btn_download' and @name='btn_download' and @value='Download My File']")).click() 
  • XPATHXPATH submit()

     WebDriverWait(driver, 300).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='btn_download' and @name='btn_download' and @value='Download My File']")).submit() 

注意:正如您提到的,自動超時為5分鍾,我將最大等待時間保持為等於300秒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM