Selenium菜鸟教程学习笔记本博客仅为个人学习记录与理解分享非商业用途所有代码与文档版权归原项目及其贡献者所有。selenium菜鸟教程一、Selenium环境搭建1.安装Selenium库使用Python编写自动化脚本来控制浏览器pipinstallselenium2.测试安装是否成功运行demo1.py观察到浏览器弹出又关闭说明Selenium环境安装成功。fromseleniumimportwebdriver driverwebdriver.Chrome()# 启动driver.get(https://www.bing.com/)# 控制driver.quit()# 关闭二、WebDriver的基本使用可以看到edge弹出菜鸟网页并跳转到百度页面再返回菜鸟页面并刷新最终关闭浏览器的效果。# 导入所需模块fromseleniumimportwebdriverfromselenium.webdriver.edge.serviceimportServiceasEdgeServicefromselenium.webdriver.edge.optionsimportOptionsasEdgeOptions# 自动管理 Edge 驱动无需指定路径# Selenium 4 会自动下载并使用与你当前 Edge 版本匹配的驱动driverwebdriver.Edge()# 打开网页driver.get(https://www.runoob.com)# 最大化窗口driver.maximize_window()# 获取页面标题和 URLprint(页面标题:,driver.title)print(当前 URL:,driver.current_url)# 导航到另一个页面driver.get(https://www.jyshare.com)# 返回上一个页面driver.back()# 刷新页面driver.refresh()# 关闭浏览器driver.quit()三、常见元素定位方式测试1.创建本地 HTML 测试页面目的验证 By.ID、By.NAME、By.CSS_SELECTOR、By.XPATH 四种定位方式命名为test_login.html该 .html 文件与 .py 脚本置于同一目录!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8titleTest Login Page/title/headbodyforminputtypetextidusernameplaceholderEnter usernamebrbrinputtypepasswordnamepasswordplaceholderEnter passwordbrbrbuttontypebuttonclasssubmit-btnSubmit/buttonbrbrahrefhttps://www.baidu.comtarget_blankClick Here/a/formscript// 可选给按钮加点击事件避免页面跳转中断脚本document.querySelector(.submit-btn).addEventListener(click,(){// alert(Form submitted!);console.log(Form submitted!);});/script/body/html2.Python 脚本验证定位效果fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByimportos driverwebdriver.Edge()# 与实际使用的浏览器一致html_fileos.path.abspath(test_login.html)driver.get(ffile://{html_file})# ID 定位driver.find_element(By.ID,username).send_keys(testuser)# Name 定位driver.find_element(By.NAME,password).send_keys(password123)# CSS 定位driver.find_element(By.CSS_SELECTOR,button.submit-btn).click()# XPath 定位driver.find_element(By.XPATH,//a[text()Click Here]).click()print(✅ 定位与操作完成请按 F12 检查页面注意百度在新标签页打开)input( 检查完毕后按回车退出...)driver.quit()3.运行结果用户名、密码成功输入提交按钮点击后控制台输出日志“Click Here” 链接在新标签页中打开百度input保持原始页面打开便于调试四、等待机制1.隐式等待全局一旦设置对所有后续的 find_element(s) 调用生效。优点简单一行代码全局生效。缺点所有元素共用同一个超时时间缺乏灵活性与显式等待混用时会产生不可预测的等待时间叠加这是最严重的问题。2.显示等待局部为不同的查找设置不同的等待时间是 Selenium 官方推荐的做法。比如用户名输入框应该很快出现1 ~ 2秒内。如果 3 秒还没出来说明页面加载失败。登录成功后的欢迎消息需要调用后端 API可能要8~10 秒才出现。具体写法如下所示fromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServiceasChromeServicefromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECimportos# 设置正确的驱动路径driverwebdriver.Edge()# 设置隐式等待# driver.implicitly_wait(5) # 最好不要使用# 打开网页html_fileos.path.abspath(test_login.html)driver.get(ffile://{html_file})# 使用显式等待等待元素可见usernameWebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,username)))username.send_keys(testuser)# 使用显式等待等待元素可点击submit_buttonWebDriverWait(driver,15).until(EC.element_to_be_clickable((By.CSS_SELECTOR,button.submit-btn)))submit_button.click()# 关闭浏览器driver.quit()五、文件上传和下载1.创建本地测试页面命名为test_page.html保存在.py文件夹下!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8titleSelenium 文件操作测试页/titlestylebody{font-family:sans-serif;padding:20px;}.section{margin-bottom:30px;padding:15px;border:1px solid #ddd;border-radius:5px;}h2{margin-top:0;color:#333;}button{padding:10px 20px;cursor:pointer;background:#007bff;color:white;border:none;border-radius:3px;}button:hover{background:#0056b3;}/style/headbody!-- 1. 上传测试区域 --divclasssectionh2 文件上传测试/h2p请选择一个本地文件模拟上传/pinputtypefileidfileInputbuttononclickalert(文件路径已获取模拟上传成功)提交上传/button/div!-- 2. 下载测试区域 --divclasssectionh2⬇️ 文件下载测试/h2p点击下载按钮浏览器将生成并下载一个文本文件/pbuttoniddownloadBtn点击下载测试文件/button/divscript// 模拟下载逻辑创建一个 Blob 文件并触发下载document.getElementById(downloadBtn).addEventListener(click,function(){constcontent这是 Selenium 自动下载生成的测试内容\n时间newDate().toLocaleString();constblobnewBlob([content],{type:text/plain});consturlURL.createObjectURL(blob);constadocument.createElement(a);a.hrefurl;a.downloadselenium_auto_download.txt;// 下载的文件名document.body.appendChild(a);a.click();// 清理资源document.body.removeChild(a);URL.revokeObjectURL(url);});/script/body/html2.Python 脚本测试上传、下载效果importosimporttimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy# 1. 准备工作创建下载目录download_diros.path.join(os.getcwd(),downloads)os.makedirs(download_dir,exist_okTrue)# 2. 配置浏览器核心是设置下载路径禁止弹窗optionswebdriver.EdgeOptions()options.add_experimental_option(prefs,{download.default_directory:download_dir,download.prompt_for_download:False})# 启动浏览器driverwebdriver.Edge(optionsoptions)# 3. 打开本地测试页面 (确保 test_page.html 和这个脚本在一起)html_pathfile:///os.path.abspath(test_page.html)driver.get(html_path)# --- 核心操作上传 ---print(正在上传...)# 找到 input 标签直接发送文件路径# 这里我们临时创建一个文件用来上传test_fileos.path.join(download_dir,upload_test.txt)withopen(test_file,w)asf:f.write(测试内容)upload_inputdriver.find_element(By.ID,fileInput)upload_input.send_keys(test_file)# --- 核心就这一行print(上传完成)# --- 核心操作下载 ---print(正在下载...)# 点击下载按钮download_btndriver.find_element(By.ID,downloadBtn)download_btn.click()# 结束input(下载完成)driver.quit()3.运行结果上传找到 标签用 send_keys 发送文件的“绝对路径”。下载启动浏览器时加 options 配置禁止弹窗 指定路径然后点击网页上的下载链接。六、Selenium测试框架集成1. 与 unittest 集成准备 (setUp)每次测试前都要做的事如打开浏览器、打开网页执行 (test_)具体的测试步骤如输入文字、点击按钮注意函数名必须以 test 开头否则不执行。收尾 (tearDown)每次测试后都要做的事如关闭浏览器。importunittestfromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECclassTestGoogleSearch(unittest.TestCase):defsetUp(self):self.driverwebdriver.Edge()self.driver.get(https://www.baidu.com)deftest_search(self):search_boxself.driver.find_element(By.NAME,wd)search_box.send_keys(Selenium)search_box.submit()# 断言结果页标题包含Seleniumself.assertIn(Selenium,self.driver.title)deftearDown(self):# 关闭浏览器self.driver.quit()if__name____main__:unittest.main()2.与 pytest 集成1.像写脚本。直接写函数就行不用套在 class 里。2.用 pytest.fixture 装饰器灵活控制。你可以让 10 个测试共用一个浏览器也可以让每个测试单独用一个。3.直接用 Python 原生的 assert 关键字就行。4.需要 yield driver 来传递浏览器。importpytestfromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy# 这个 scopesession 的意思是整个测试过程只启动一次浏览器pytest.fixture(scopesession)defbrowser():driverwebdriver.Edge()yielddriver# 先跑测试用例driver.quit()# 所有测试跑完后才执行这一句# 测试用例写法保持不变deftest_baidu_search(browser):browser.get(https://www.baidu.com)search_boxbrowser.find_element(By.NAME,wd)search_box.send_keys(Selenium)search_box.submit()assertSeleniuminbrowser.title