使用Chrome浏览器自动下载文件并保存到指定的文件路径(使用Selenium更改Chrome默认下载存储路径)

本文首发于微信公众号: 软测小生


上一篇博客写到当不能使用Selenium来操作上传下载接面的时候,我们使用第三方AutoIt来搞定。
Java+Selenium2+autoIt 实现Chrome右键文件另存为 功能

接下来我我要记录一下今天学的使用Selenium更改Chrome默认下载存储路径,当然前提是在网页上有下载链接直接点击就会下载的,若不更改的话就会保存到Chrome默认下载路径下,有的时候为了方便或是后续的使用,我们需要更改一下保存路径,或者是将保存的文件路径进行动态、参数化的去传入,而不是固定的。

TestCase:
到Python的官网,
下载selenium-3.13.0.tar.gz(版本可能会变化)到指定的文件路径D:/dataSource/outputReport/Downloads

比较简单,直接上代码吧。

import java.util.HashMap;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;

public class testChromeDownload {
	WebDriver driver;
	
	@Test
	public void testOne() throws Exception {			
		//使用Chrome浏览器自动下载文件并保存到指定的文件路径
		//或 使用Selenium更改Chrome默认下载存储路径
		System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");//设置驱动的路径	
		DesiredCapabilities caps = setDownloadsPath();//更改默认下载路径		
		driver = new ChromeDriver(caps);
		driver.manage().window().maximize();
		driver.get("https://pypi.org/project/selenium/#files");//到目标网页		
		WebElement myElement = driver.findElement(By.xpath("//a[contains(text(),'selenium-3.13.0.tar.gz')]"));
		Actions action = new Actions(driver);
		myElement.click();//点击下载
		Thread.sleep(10000);
	}
	
	//单独重构成一个方法,然后调用
	public DesiredCapabilities setDownloadsPath() {
		String downloadsPath = "D:\\dataSource\\outputReport\\Downloads";
		HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
		chromePrefs.put("download.default_directory", downloadsPath);
		ChromeOptions options = new ChromeOptions();
		options.setExperimentalOption("prefs", chromePrefs);
		DesiredCapabilities caps = new DesiredCapabilities();
		caps.setCapability(ChromeOptions.CAPABILITY, options);
		return caps;
	}
	
	@AfterClass
	public void tearDown(){
		driver.quit();
	}
}

 

END.

 

<think>好的,用户之前询问了如何使用Selenium实现浏览器的导航功能,比如前进、后退、刷新和地址栏操作,我给出了详细的代码说明。现在用户的新请求是要将这些代码说明生成一个Excel文件。我需要考虑用户为什么需要生成Excel文件,可能的原因是什么。 首先,用户可能是为了更好的文档管理,将代码和说明整理到表格中方便查看或分享给团队。或者用户可能需要将代码示例作为培训材料,用Excel来分步骤教学。也有可能用户对编程不太熟悉,更习惯使用表格形式来记录操作步骤,这样更容易理解。 接下来,我需要确定如何将之前的代码说明转化为Excel文件的结构。用户可能需要每个功能点的代码示例、方法说明、使用场景以及注意事项等信息分门别类地列在表格中。比如,每个导航操作(如back(), forward(), refresh())作为一行,包含对应的代码、说明等列。 然后,我需要选择合适的Python库来生成Excel文件。常用的库有openpyxl和pandas。考虑到用户可能希望代码简单明了,使用pandas可能更方便,因为它可以用DataFrame直接构建数据导出为Excel,代码更简洁。而openpyxl更适合需要复杂格式调整的情况,但在这里简单结构可能pandas更合适。 另外,用户可能希望Excel文件中的信息要清晰,有表头,不同的部分用不同的工作表(sheet)分开。例如,基础导航操作、核心方法、综合示例等各自在不同的sheet里。但根据用户当前的需求,可能一个sheet就足够了,或者需要分多个sheets,但需要看之前的回答结构。之前的回答分成了几个部分,如基础导航操作、核心操作方法、综合应用示例等,可能需要将这些内容分别放在不同的sheets中。 不过,用户现在的提问是将“详细代码说明生成excel文件”,可能更倾向于将代码示例和说明以结构化的方式放在表格里,而不是分多个sheets。需要保持简单,可能一个sheet包含所有信息,或者分几个相关的sheets。 另外,需要注意代码中的特殊字符,比如在Excel中可能需要处理换行符,确保代码块在单元格中正确显示。可能需要设置单元格的格式为文本,或者调整行高列宽以适应内容。 然后,我要考虑用户是否熟悉Python库的使用,是否需要给出安装相关库的指令,比如pandas和openpyxl,因为pandas在导出Excel时通常依赖openpyxl或xlsxwriter作为引擎。所以需要在代码中提示安装这些库,在代码中指定引擎。 此外,用户可能需要生成的Excel文件包含哪些具体内容。回顾之前的回答,有代码块、说明、注意事项等。需要将这些内容拆解到Excel的不同列中,例如:功能分类、方法名称、代码示例、说明、注意事项等。 可能的列包括: - 功能分类(如导航操作、页面刷新、历史记录控制) - 方法/函数(如driver.get(), driver.back()) - 代码示例 - 说明 - 使用场景 - 注意事项 这样用户可以在Excel中快速查找不同功能对应的代码和说明。例如,在核心操作方法中,地址栏操作包括driver.get()和execute_script的方式,这些可以作为不同的行,分别列出代码示例和说明。 接下来,我需要将之前的回答内容结构化,转化为DataFrame的数据。例如: 功能分类 | 方法/函数 | 代码示例 | 说明 | 使用场景 | 注意事项 --- | --- | --- | --- | --- | --- 地址栏操作 | driver.get() | driver.get("https://www.baidu.com") | 跳转到指定URL | 需要加载新页面时使用 | 推荐使用这种方式 地址栏操作 | driver.execute_script() | driver.execute_script("window.location.href...") | 使用JS跳转URL | 需要执行JavaScript时使用 | 可能不如get()稳定 页面刷新 | driver.refresh() | driver.refresh() | 刷新当前页面 | 页面需要重新加载时 | 直接调用方法 历史记录控制 | driver.back() | driver.back() | 返回上一页 | 模拟浏览器后退按钮 | 需要历史记录存在 历史记录控制 | driver.forward() | driver.forward() | 前进到下一页 | 模拟浏览器前进按钮 | 需要之前执行过后退操作 类似这样的结构,将每个代码示例和说明填入表格中。然后使用pandas将这些数据写入Excel文件。 此外,用户可能需要综合应用示例部分也被包含在Excel中,可能需要单独的工作表,或者作为另一个部分。例如,综合示例可以作为另一个sheet,展示代码流程。 同时,用户可能希望生成的Excel文件有清晰的标题,适当的格式,比如加粗标题行,调整列宽等。虽然使用pandas导出可能默认没有格式,但至少确保内容正确,用户可以根据需要自行调整格式。 最后,还需要考虑代码的健壮性,比如处理文件路径问题,确保文件可以被正确保存且提示用户安装必要的库。例如,在代码开头检查是否安装了pandas和openpyxl,或者给出安装命令。 总结步骤: 1. 安装必要的库:pandas和openpyxl。 2. 结构化之前的代码说明为DataFrame,分列存储信息。 3. 使用pandas的ExcelWriter将数据写入Excel文件的不同工作表。 4. 处理代码中的换行和格式,确保在Excel中正确显示。 5. 提供完整的代码示例,用户可以直接运行生成Excel文件。 6. 在回答中解释代码的结构,说明如何查看生成的Excel文件。 现在需要将这些思考转化为具体的代码实现,确保代码正确生成所需的Excel文件,同时解释清楚每个步骤的作用,让用户能够理解和使用。</think>以下是使用Python将Selenium浏览器导航功能的代码说明生成Excel文件的完整解决方案: --- ### 一、环境准备 ```bash # 安装依赖库 pip install pandas openpyxl ``` --- ### 二、代码实现 ```python import pandas as pd from datetime import datetime # 创建数据结构 data = { "功能分类": [ "基础导航", "地址栏操作", "地址栏操作", "页面刷新", "页面刷新", "历史控制", "历史控制", "高级功能", "高级功能" ], "方法名称": [ "浏览器初始化", "driver.get()", "execute_script()", "driver.refresh()", "快捷键刷新", "driver.back()", "driver.forward()", "标签页操作", "网络监听" ], "代码示例": [ """driver = webdriver.Chrome(service=Service(...))""", """driver.get("https://example.com")""", """driver.execute_script("window.location.href=...")""", """driver.refresh()""", """body.send_keys(Keys.F5)""", """driver.back()""", """driver.forward()""", """driver.execute_script("window.open()")""", """driver.execute_cdp_cmd('Network.enable', {})""" ], "参数说明": [ "需指定chromedriver路径", "直接加载目标URL", "通过JavaScript修改地址", "无参数", "需要焦点在页面元素", "无参数", "无参数", "实现多标签页管理", "配合DevTools使用" ] } # 转换为DataFrame df = pd.DataFrame(data) # 添加时间戳 timestamp = datetime.now().strftime("%Y%m%d_%H%M") filename = f"selenium_navigation_guide_{timestamp}.xlsx" # 生成Excel文件 with pd.ExcelWriter(filename, engine='openpyxl') as writer: # 主功能表 df.to_excel(writer, sheet_name='功能索引', index=False) # 代码示例表 examples = { "完整初始化代码": [ "from selenium import webdriver", "from selenium.webdriver.chrome.service import Service", "driver = webdriver.Chrome(service=Service('chromedriver.exe'))" ], "典型操作流程": [ "driver.get('https://baidu.com')", "driver.back()", "driver.refresh()", "driver.forward()" ] } for sheet_name, code_list in examples.items(): pd.DataFrame({"代码段": code_list}).to_excel( writer, sheet_name=sheet_name, index=False ) # 自动调整列宽 from openpyxl import load_workbook wb = load_workbook(filename) for sheet in wb.sheetnames: ws = wb[sheet] for col in ws.columns: max_length = 0 column = col[0].column_letter for cell in col: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = (max_length + 2) * 1.2 ws.column_dimensions[column].width = adjusted_width wb.save(filename) print(f"文件已生成:{filename}") ``` --- ### 三、文件结构说明 生成的文件包含以下工作表: 1. **功能索引表**: - 功能分类:导航操作的类型 - 方法名称:具体的API方法 - 代码示例:核心代码片段 - 参数说明:关键参数注意事项 2. **完整初始化代码**: - 包含浏览器初始化的完整代码模板 3. **典型操作流程**: - 展示从打开页面到导航操作的完整链条 --- ### 四、文件效果示例 | 功能分类 | 方法名称 | 代码示例 | 参数说明 | |-----------|----------------|---------------------------------------|-----------------------| | 地址栏操作| driver.get() | driver.get("https://example.com") | 直接加载目标URL | | 历史控制 | driver.back() | driver.back() | 需要存在浏览历史 | --- ### 五、高级功能扩展 可以添加以下增强功能: 1. **超链接支持**: ```python # 在单元格添加公式 df["参考文档"] = '=HYPERLINK("https://selenium.dev", "官方文档")' ``` 2. **条件格式化**: ```python from openpyxl.formatting.rule import FormulaRule # 标记重要方法 ws.conditional_formatting.add('B2:B100', FormulaRule(formula=['ISNUMBER(SEARCH("重要",C1))'], stopIfTrue=True, fill=PatternFill(bgColor="FFFF00"))) ``` --- ### 六、文件查看建议 1. 使用Excel的**筛选功能**快速定位特定方法 2. 利用**冻结窗格**固定标题行(视图 → 冻结窗格) 3. 通过**文本换行**显示完整代码(开始 → 自动换行) --- 如果需要定制更复杂的格式或添加可视化图表,可以进一步说明具体需求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软测小生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值