如何使用 Selenium Python 循环并单击所有图标以下载文件

How to loop and click all icons to download files with Selenium Python

提问人:Jay Cheng 提问时间:11/15/2023 最后编辑:Jay Cheng 更新时间:11/16/2023 访问量:40

问:

2023 年 11 月 15 日更新:

你好

在我修改代码后,能够通过在循环结束时重新查找pdf_links来解决 pdf 下载问题,如下所示:

pdf_links = driver.find_elements(By.XPATH,'//div[@title="Download as PDF"]')

for i in range(len(pdf_links)):
    # print(pdf_links[i])
    
    pdf_links[i].click()
    select_all_box = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//input[@controlid="selectAll"]/following-sibling::span')))
    select_all_box.click()
    submit_select_button = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//button[@label="Submit"]'))).click()
    download_button = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//button[@label="Download"]'))).click()

    WebDriverWait(driver,5).until(EC.presence_of_element_located((By.XPATH,'//div[@title="Download as PDF"]')))
    
    pdf_links = driver.find_elements(By.XPATH,'//div[@title="Download as PDF"]')

但是,关于 excel 下载的另一个问题是,代码在 time.sleep() 中运行正常,但在 WebDriverWait 中不能运行

WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH,'//div[@title="Download as Excel"]')))

excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')

for i in range(len(excel_links)):
    print(excel_links[i])

    excel_links[i].click()
    time.sleep(3)
    # WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'//div[@title="Download as Excel"]')))
    
    excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')

当我使用 WebdriverWait 行而不是 time.sleep() 时,它会给我带来以下错误:

WebDriverWait behaviour

Excel Dom

您的意见将有所帮助。

====================================================================

嗨,我正在尝试循环并单击所有图标以下载 pdf/excel 文件。它是一个内部网站,所以我所能提供的只是带有html代码的屏幕截图。

在过去的 3 天里,我每天花 3 到 4 个小时,但还没有取得任何成功。您的建议将不胜感激。

基本上每行有 2 个图标,一个用于 pdf,另一个用于 excel,每页有 50 行。

2 icons per row

pdf 的 DOM 如下:

DOM for Excel & PDF

单击pdf图标时,弹出窗口如下

form selection

使用以下 DOM:

selecion check box

然后我会选择所有然后提交以带来下载按钮

enter image description here

和 DOM 下载按钮download button

到目前为止,我下载pdf的代码如下:

WebDriverWait(driver,5).until(EC.presence_of_element_located((By.XPATH,'//div[@title="Download as PDF"]')))
pdf_links = driver.find_elements(By.XPATH,'//div[@title="Download as PDF"]')

for pdf in pdf_links:
    pdf.click()
    select_all_box = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'//span[@class="_checkmark_17ala_27"]')))
    select_all_box.click()
    submit_select_button = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'//button[@label="Submit"]'))).click()
    download_button = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'//button[@label="Download"]'))).click()
    time.sleep(3)

当我运行代码时,它只下载第一个pdf文件,然后向我抛出一个“NoSuchElementException”

exception details

下载 excel 操作相对容易,因为一旦单击图标,excel 就会自动下载。


WebDriverWait(driver,3).until(EC.element_to_be_clickable((By.XPATH,'//div[@title="Download as Excel"]')))

excel_links = driver.find_elements(By.XPATH,'//div[@title="Download as Excel"]')

for excel in excel_links:
    excel.click()
    time.sleep(5)   

与pdf的代码类似,它只在网页中下载了第一个excel,并给了我一个“NoSuchElementException”:

No such element exception

python selenium-webdriver 网页抓取 浏览器自动化

评论

0赞 pcalkins 11/15/2023
您的目标是跨度而不是复选框...尝试使用 XPATH: //input[@controlid=“selectAll”] 单击提交按钮后,您可能会有一个过时的 DOM。单击后,您可能需要重新获取“下载”按钮。(避免在 webelement 引用数组的迭代过程中执行任何更新 dom 的操作。
0赞 Jay Cheng 11/15/2023
@pcalkins,您能否详细说明一下“避免在 webelement 引用数组迭代期间执行任何更新 dom 的操作”,以及我该怎么做?谢谢。
0赞 pcalkins 11/16/2023
例如,点击操作...发送点击后,DOM 可能会通过 Javascript 进行更新。如果在遍历数组时发生这种情况,则所有后续迭代都将过时。在您的情况下,在单击提交按钮后迭代“pdf_links”时可能会发生这种情况?

答: 暂无答案