【问题标题】:How can I make Python/Selenium wait for file to process then click download如何让 Python/Selenium 等待文件处理然后单击下载
【发布时间】:2018-03-29 21:39:14
【问题描述】:

我正在尝试使用 Python/Selenium 来自动化下载每天更新的文件的过程。到目前为止,我的代码打开了网站,选择了我想要的条件(以 CSV 格式下载文件),然后单击“开始处理”按钮。 网站的设置方式,点击“开始处理”后,网站会将您重定向到带有加载栏(表示处理完成)和“取消请求”按钮的不同页面,大约 10 秒后文件已准备就绪,“取消请求”按钮变为“下载我的文件”按钮。随着时间的推移,文件将逐渐变大,因此处理时间将从约 10 秒缩短到几 (2-4) 分钟。如果处理时间超过 5 分钟,处理将自动超时。 我的“#Supposed to wait for the file to process”尝试是为了等到 ID“btn_download”(“下载我的文件”点击的 ID)出现后再点击“下载我的文件”链接。我认为我为下载文件而编写的代码将起作用,因为相同的代码开始处理并且它们都是“类型:提交”链接,但我不确定我没有下载的原因是否是因为“等待”代码无法正常工作,或者如果它是“下载代码”(或两者兼而有之)。我尝试使用“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)。

【问题讨论】:

  • 你到底卡在哪里了?可以分享一下相关的HTML吗?
  • 经过仔细审查后,我意识到该程序卡住了我的“#supposed to wait for the file to process”代码,给我一个错误,但仍然允许我再次按 Enter 以进行“下载我的文件”代码。 “下载我的文件”链接的相关 HTML 是
  • 是的,查看页面的 html 会有所帮助。特别是那个从“取消”变为“下载我的文件”的按钮。我想知道这是否是导致您的问题的原因。

标签: python selenium firefox automation wait


【解决方案1】:

根据您的观察,问题在于等待代码,并根据您提供的 HTML 单击 按钮 开始下载你可以使用以下任一代码行的文件:

  • CSS_SELECTOR & click()

    WebDriverWait(driver, 300).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#btn_download[name='btn_download'][value='Download My File']")).click()
    
  • CSS_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()
    
  • XPATH & click()

    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()
    
  • XPATH & 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 秒

【讨论】:

    【解决方案2】:
    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()
    

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 2020-06-29
      • 2015-03-14
      • 2015-11-30
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      相关资源
      最近更新 更多