Selenium与Python自动化测试入门:从环境搭建到实战脚本

📅 2026/6/30 11:56:14
Selenium与Python自动化测试入门:从环境搭建到实战脚本
1. 项目概述为什么是Selenium与Python的组合如果你刚接触自动化测试或者网页数据抓取听到Selenium和Python这两个词可能会觉得这是两个庞然大物。别担心我刚开始也是这种感觉。简单来说Selenium是一个用来控制浏览器、模拟真人操作的自动化工具而Python是一门语法简洁、上手极快的编程语言。把它们俩结合起来你就能让电脑自动帮你完成那些在浏览器里重复、枯燥的点击、输入、翻页等操作比如自动测试网站功能、定时抓取商品价格、批量填写表单等等。我选择从Python下的Selenium开始教原因很简单这是目前最主流、学习曲线最平缓、社区资源最丰富的组合。Python的代码读起来像英语句子而Selenium提供了非常直观的API你可以理解为“命令”告诉浏览器“找到那个按钮”、“点击它”、“在输入框里打字”。对于零基础的你这个组合能让你最快地看到成果——一个真正在动的浏览器这会带来巨大的正反馈支撑你继续学下去。本教程的目标就是帮你绕开我当年踩过的坑用最直白的方式从环境搭建到写出第一个能跑的脚本手把手带你入门。2. 环境搭建稳扎稳打走好第一步环境搭建是劝退新手的第一个门槛网上教程杂七杂八容易漏步骤。咱们不搞虚的就按下面这个顺序来保证一次成功。2.1 Python安装与配置避开“python was not found”的坑很多新手倒在第一步安装完Python在命令行里输入python却看到“python was not found”或者“不是内部或外部命令”的错误。这几乎100%是因为没有正确配置环境变量。安装步骤下载访问Python官网下载Windows安装程序。关键点一定要勾选“Add Python to PATH”这个选项这是自动配置环境变量的关键能帮你省去后面手动配置的麻烦。安装建议选择“Install Now”并使用默认安装路径如C:\Users\你的用户名\AppData\Local\Programs\Python\Python3xx。自定义路径容易记错增加后续出错概率。验证安装完成后打开“命令提示符”WinR输入cmd。输入python --version并回车。如果正确显示Python版本号如Python 3.11.4恭喜你第一步成功了。如果报错说明环境变量没配好需要手动添加。注意如果手动配置环境变量你需要将Python的安装目录例如C:\Users\你的用户名\AppData\Local\Programs\Python\Python311和它的Scripts目录例如C:\Users\你的用户名\AppData\Local\Programs\Python\Python311\Scripts都添加到系统的Path变量中。添加后务必关闭所有已打开的cmd窗口再重新打开新的环境变量才会生效。2.2 集成开发环境IDE选择VSCode vs PyCharm写代码需要一个顺手的编辑器。两大主流选择是VSCode和PyCharm。VSCodeVisual Studio Code轻量、免费、插件生态强大。你需要安装Python扩展插件它就能提供代码提示、调试等功能。适合喜欢轻便、自定义程度高的用户。配置稍微多一步但灵活性好。PyCharm专业级Python IDE分社区版免费和专业版收费。社区版功能对初学者来说已经绰绰有余。它的开箱即用体验极好安装后几乎不需要额外配置智能提示、项目管理、调试工具一应俱全。适合希望专注于编码本身不想在环境上折腾的新手。我的建议如果你是纯新手强烈推荐直接使用PyCharm社区版。它能帮你屏蔽掉很多环境配置的细节让你更专注于学习Selenium和Python语法本身。本教程后续的演示也将基于PyCharm的环境进行减少因工具差异带来的困惑。2.3 安装Selenium库一行命令的事Python的强大之处在于有海量的第三方库Selenium就是其中之一。安装它非常简单只需要一个命令。确保你的命令行cmd或PyCharm的终端可以正常使用python和pipPython的包管理工具后输入以下命令pip install selenium回车后pip工具会自动从网络下载Selenium库及其依赖并完成安装。你可能会看到一些警告WARNING但只要最后出现“Successfully installed selenium-xx.x.x”之类的字样就说明安装成功了。实操心得国内网络有时连接Python官方源PyPI速度较慢或不稳定可能导致安装失败或极慢。遇到这种情况可以使用国内的镜像源来加速。例如使用清华大学的镜像源进行安装pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple这能极大提升下载速度。2.4 下载浏览器驱动连接Selenium和浏览器的桥梁这是Selenium工作原理的核心也是最容易出错的一步。Selenium本身只是一个发出指令的“大脑”它需要一个“翻译官”来把指令传达给具体的浏览器如Chrome、Firefox。这个“翻译官”就是浏览器驱动。以最常用的Chrome浏览器为例查看你的Chrome版本打开Chrome点击右上角三个点 - 帮助 - 关于Google Chrome。记下版本号例如115.0.5790.110。下载对应版本的ChromeDriver访问ChromeDriver的官方下载站点或国内镜像站。版本匹配至关重要大版本号如115必须一致。如果你的Chrome是115.x.x.x就下载115开头的ChromeDriver。放置驱动文件下载的是一个可执行文件如chromedriver.exe。你有三种放置方法方法一推荐将其放在Python的安装目录下或Scripts目录下因为该目录通常已在系统Path中。方法二将其放在你的项目文件夹里。方法三将其放在任意位置并在代码中指定这个文件的完整路径。踩过的坑很多人下载驱动后直接双击运行chromedriver.exe会弹出一个黑窗口然后很快关闭这是正常的它本身就是一个服务程序等待Selenium的指令。不要觉得它闪退就是坏了。另外如果Chrome浏览器自动更新了版本而驱动没有随之更新就会导致脚本报错“This version of ChromeDriver only supports Chrome version xxx”。所以当脚本突然无法运行时首先检查浏览器版本和驱动版本是否匹配。3. 第一个Selenium脚本让浏览器动起来环境准备好了让我们来写一个最简单的脚本感受一下Selenium的魅力。这个脚本将实现打开Chrome浏览器访问百度首页在搜索框输入“Selenium”然后点击“百度一下”按钮。3.1 基础脚本结构与代码解析在PyCharm中新建一个Python文件比如命名为first_script.py输入以下代码# 导入selenium库中的webdriver模块这是控制浏览器的核心 from selenium import webdriver # 导入By类用于指定定位元素的方式如通过ID、NAME等 from selenium.webdriver.common.by import By # 导入WebDriverWait和expected_conditions用于实现智能等待 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 1. 创建一个Chrome浏览器实例 # 如果你将chromedriver.exe放在了Python目录或已配置Path可以直接这样写 driver webdriver.Chrome() # 如果你的驱动在其他路径需要指定路径 # driver webdriver.Chrome(executable_pathrC:\path\to\your\chromedriver.exe) try: # 2. 使用get方法打开百度首页 driver.get(https://www.baidu.com) print(已打开百度首页) # 3. 定位搜索框并输入关键词 # 通过检查网页元素发现百度搜索框的HTML标签中 idkw search_box driver.find_element(By.ID, kw) search_box.send_keys(Selenium) # send_keys方法用于模拟键盘输入 print(已在搜索框输入‘Selenium’) # 4. 定位“百度一下”按钮并点击 # 通过检查发现按钮的 idsu submit_button driver.find_element(By.ID, su) submit_button.click() # click方法用于模拟鼠标点击 print(“已点击‘百度一下’按钮”) # 5. 等待搜索结果页面加载完成简单等待 # 这里使用强制等待让程序暂停3秒确保页面元素加载出来。实际项目中不推荐后面会讲更好的方法。 import time time.sleep(3) # 6. 可以在这里添加其他操作比如获取搜索结果标题 # results driver.find_elements(By.CLASS_NAME, result) # for result in results: # print(result.text) finally: # 7. 关闭浏览器 # 使用try-finally确保无论脚本是否出错最后都会关闭浏览器释放资源 driver.quit() print(浏览器已关闭)3.2 逐行解读与核心概念webdriver.Chrome()这行代码启动了ChromeDriver进程并打开一个全新的、干净的Chrome浏览器窗口。这个窗口完全由你的代码控制。driver.get(url)这是浏览器导航命令等同于你在地址栏输入网址并回车。元素定位driver.find_element(By.ID, kw)这是Selenium最核心的操作之一。By.ID表示使用HTML元素的id属性来定位它。kw就是百度搜索框的id值。你需要使用浏览器的“开发者工具”F12来查看页面上元素的这些属性。元素操作找到元素后你可以对它进行各种操作.send_keys(text)输入文本。.click()点击。.clear()清空内容。.text获取元素内的文本。driver.quit()关闭浏览器窗口并终止ChromeDriver进程。与driver.close()仅关闭当前标签页不同quit()是彻底的清理务必在脚本最后调用。运行脚本在PyCharm中右键点击代码编辑区选择“Run ‘first_script.py’”。你会看到一个Chrome浏览器自动打开执行一系列操作然后关闭。控制台会打印出我们预设的提示信息。恭喜你你的第一个自动化脚本成功了4. Selenium核心技能定位与等待的艺术脚本能跑了但要写出健壮、可靠的自动化程序你必须掌握两样东西精准的元素定位和合理的等待策略。这是区分新手和熟练工的关键。4.1 八种元素定位方法详解Selenium提供了8种主要的定位方式你需要根据页面HTML结构选择最稳定的一种。定位方式代码示例描述与适用场景稳定性By.IDfind_element(By.ID, “kw”)通过元素的id属性定位。id在HTML中应唯一是最优先选择的定位方式。★★★★★By.NAMEfind_element(By.NAME, “wd”)通过元素的name属性定位。常用于表单元素。★★★★☆By.CLASS_NAMEfind_element(By.CLASS_NAME, “s_ipt”)通过元素的class属性定位。一个元素可能有多个class需完整匹配其中一个。★★★☆☆By.TAG_NAMEfind_element(By.TAG_NAME, “input”)通过HTML标签名定位如div,input。通常一个页面有很多相同标签不精确常与其他方法结合或用于找多个元素。★★☆☆☆By.LINK_TEXTfind_element(By.LINK_TEXT, “新闻”)通过超链接的完整可见文本定位。用于定位a标签。★★★★☆By.PARTIAL_LINK_TEXTfind_element(By.PARTIAL_LINK_TEXT, “闻”)通过超链接的部分可见文本定位。比LINK_TEXT更灵活。★★★☆☆By.XPATHfind_element(By.XPATH, ‘//input[id“kw”]’)最强大、最灵活的定位方式。通过路径表达式在XML/HTML文档中导航。可以处理没有id/name的复杂情况。★★★★★By.CSS_SELECTORfind_element(By.CSS_SELECTOR, “input#kw”)类似CSS样式的选择器语法简洁浏览器原生支持速度通常比XPATH快。★★★★★定位策略建议优先级ID Name CSS Selector / XPath Class Name Link Text Tag Name。如何查看元素属性在浏览器中打开目标页面按F12打开开发者工具点击左上角的箭头图标然后去页面上点击你想操作的元素代码区就会高亮显示该元素的HTML代码里面就有id、name、class等属性。XPath和CSS Selector进阶XPath//表示从根节点开始搜索input是标签名[id‘kw’]是属性条件。例如//div[class‘s_form’]//input[name‘wd’]表示先找一个class为s_form的div再在这个div里面找name为wd的input标签。CSS Selectorinput#kw表示id为kw的input标签。.s_ipt表示class包含s_ipt的元素。div.s_form input[name‘wd’]表示在class为s_form的div下的name为wd的input标签。注意事项避免使用绝对路径的XPath如/html/body/div[3]/div[2]/form/span[1]/input这种路径极度脆弱页面结构稍有变动比如多了一个div就会定位失败。尽量使用相对路径和属性组合。4.2 三种等待机制告别“ElementNotVisibleException”网络有延迟页面加载有快慢。如果你的代码在元素还没出现时就尝试去操作它就会抛出ElementNotVisibleException或NoSuchElementException。Selenium提供了三种等待方式。强制等待time.sleep(seconds)import time time.sleep(5) # 无条件等待5秒缺点无论元素是否已加载完成都必须等够时间。效率低下是万不得已的下策。隐式等待driver.implicitly_wait(seconds)driver.implicitly_wait(10) # 设置全局隐式等待时间为10秒 element driver.find_element(By.ID, “someId”)原理在find_element或find_elements时如果没立刻找到元素WebDriver会轮询DOM默认每0.5秒直到找到或超时。优点设置一次对整个driver生命周期有效。缺点不适用于需要等待特定条件如元素可点击、元素包含特定文本的场景。它只检查元素是否存在。显式等待WebDriverWaitexpected_conditions(EC)这是最推荐、最智能的等待方式。它允许你为某个特定的元素设置等待条件。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待最多10秒直到ID为‘kw’的元素出现在DOM中并且可见 element WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, “kw”)) ) # 等待元素可被点击 button WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.NAME, “btnK”)) ) button.click()核心优势精准、高效。它只在需要的时候等待条件满足就立刻继续执行。expected_conditions模块提供了大量预定义条件如presence_of_element_located元素存在于DOM、visibility_of_element_located元素可见、text_to_be_present_in_element元素包含特定文本等。等待策略最佳实践在脚本开头设置一个较短的隐式等待如5-10秒作为兜底。在关键操作如点击一个动态加载的按钮、等待一个弹窗前使用显式等待来确保状态正确。尽量避免使用强制等待。5. 实战进阶处理常见交互与反爬策略掌握了定位和等待你就可以应对大部分基础场景了。接下来我们看一些更实际的交互案例和可能遇到的问题。5.1 模拟复杂用户交互除了点击和输入Selenium还能模拟几乎所有的用户操作。处理下拉选择框Selectfrom selenium.webdriver.support.ui import Select # 定位到select标签 select_element driver.find_element(By.ID, “city”) # 包装成Select对象 select Select(select_element) # 通过可见文本选择 select.select_by_visible_text(“北京”) # 通过value属性选择 # select.select_by_value(“beijing”) # 通过索引选择从0开始 # select.select_by_index(1)鼠标悬停ActionChainsfrom selenium.webdriver.common.action_chains import ActionChains menu driver.find_element(By.ID, “menu”) # 将鼠标移动到menu元素上 ActionChains(driver).move_to_element(menu).perform() # 此时悬停触发的子菜单应该出现了可以继续定位子菜单项 sub_menu driver.find_element(By.LINK_TEXT, “子项”) sub_menu.click()执行JavaScript有些操作Selenium的API无法直接完成比如滚动页面、修改元素属性这时可以借助JavaScript。# 滚动到页面底部 driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”) # 滚动到某个元素位置 element driver.find_element(By.ID, “footer”) driver.execute_script(“arguments[0].scrollIntoView();”, element) # 修改元素属性例如让一个隐藏的输入框可见 driver.execute_script(“document.getElementById(‘hiddenInput’).style.display ‘block’;”)5.2 应对网站反爬与识别越来越多的网站会检测Selenium等自动化工具。如果你的脚本被识别可能会遇到验证码、操作被拒绝或直接封IP。以下是一些常见的特征和应对思路WebDriver特征浏览器在自动化模式下运行时navigator.webdriver属性值为true而正常浏览器为undefined或false。应对使用execute_script在页面加载前修改此属性。driver.execute_cdp_cmd(‘Page.addScriptToEvaluateOnNewDocument’, { ‘source’: ‘Object.defineProperty(navigator, “webdriver”, {get: () undefined})’ })注意execute_cdp_cmd需要较新版本的Selenium和ChromeDriver。旧版本可使用execute_script在访问每个页面后执行类似JS代码。窗口尺寸与行为自动化打开的浏览器窗口可能有固定的、不常见的尺寸且鼠标移动和点击过于“精准”和“迅速”。应对随机化窗口尺寸并使用ActionChains模拟带轨迹的鼠标移动。driver.set_window_size(1920, 1080) # 设置为常见分辨率 # 模拟人类移动鼠标 action ActionChains(driver) element driver.find_element(By.ID, “btn”) action.move_to_element(element).pause(0.5).click().perform()使用无头模式Headless为了节省资源我们常在后台运行浏览器无头模式。但无头模式更容易被识别。应对在无头模式下添加更多反检测参数。from selenium.webdriver.chrome.options import Options options Options() options.add_argument(‘--headless’) # 启用无头模式 options.add_argument(‘--disable-blink-featuresAutomationControlled’) # 禁用Blink的自动化控制特征 options.add_experimental_option(“excludeSwitches”, [“enable-automation”]) # 移除“正受到自动测试软件控制”提示 options.add_experimental_option(‘useAutomationExtension’, False) driver webdriver.Chrome(optionsoptions) # 同时记得添加修改webdriver属性的CDP命令重要提醒这些方法只能应对基础的反爬机制。随着对抗升级网站的反爬策略也越来越复杂如Canvas指纹、WebGL指纹、行为分析等。对于商业级、高强度的数据采集仅靠Selenium可能不够需要结合更专业的反反爬方案。对于学习和测试目的上述方法通常足够。6. 项目结构与代码优化从脚本到工程当你的自动化任务越来越复杂把所有代码写在一个文件里会变得难以维护。我们需要良好的项目结构和编码习惯。6.1 使用Page Object Model (POM) 设计模式POM是UI自动化测试中最主流的设计模式。核心思想是将页面抽象成类将页面上的元素抽象成类的属性将页面操作抽象成类的方法。这样测试脚本业务逻辑就和页面元素的定位细节分离开了。一个简单的POM示例假设我们要测试一个登录功能。pages/login_page.py(页面对象类)from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class LoginPage: # 页面元素定位器 USERNAME_INPUT (By.ID, “username”) PASSWORD_INPUT (By.ID, “password”) LOGIN_BUTTON (By.ID, “submit”) ERROR_MESSAGE (By.CLASS_NAME, “error”) def __init__(self, driver): self.driver driver self.wait WebDriverWait(self.driver, 10) def enter_username(self, username): # 页面操作输入用户名 user_elem self.wait.until(EC.visibility_of_element_located(self.USERNAME_INPUT)) user_elem.clear() user_elem.send_keys(username) return self # 支持链式调用 def enter_password(self, password): # 页面操作输入密码 pass_elem self.wait.until(EC.visibility_of_element_located(self.PASSWORD_INPUT)) pass_elem.clear() pass_elem.send_keys(password) return self def click_login(self): # 页面操作点击登录 login_elem self.wait.until(EC.element_to_be_clickable(self.LOGIN_BUTTON)) login_elem.click() def get_error_message(self): # 页面操作获取错误信息 try: error_elem self.wait.until(EC.visibility_of_element_located(self.ERROR_MESSAGE)) return error_elem.text except: return Nonetests/test_login.py(测试脚本)import pytest from selenium import webdriver from pages.login_page import LoginPage class TestLogin: def setup_method(self): self.driver webdriver.Chrome() self.driver.maximize_window() def teardown_method(self): self.driver.quit() def test_login_success(self): driver self.driver driver.get(“http://example.com/login”) login_page LoginPage(driver) # 业务逻辑清晰明了 login_page.enter_username(“valid_user”) .enter_password(“valid_pass”) .click_login() # 断言登录成功例如跳转到首页 assert “dashboard” in driver.current_url def test_login_failure(self): driver self.driver driver.get(“http://example.com/login”) login_page LoginPage(driver) login_page.enter_username(“wrong_user”) .enter_password(“wrong_pass”) .click_login() error_msg login_page.get_error_message() assert error_msg “用户名或密码错误”POM的优势高可维护性页面元素定位符只在一个地方Page类定义。如果页面UI改了你只需要修改对应的Page类所有用到这个元素的测试脚本都不需要动。高可读性测试脚本读起来就像业务描述输入用户名、输入密码、点击登录而不是一堆find_element和send_keys。低冗余公共的页面操作被封装成方法避免了代码重复。6.2 配置管理、日志与异常处理一个健壮的自动化项目还需要考虑配置和可观测性。使用配置文件将浏览器类型、基础URL、超时时间、测试数据等配置信息放在单独的配置文件如config.ini或config.yaml或Python配置文件config.py中。# config.py BASE_URL “http://example.com” BROWSER “chrome” IMPLICIT_WAIT 10 EXPLICIT_WAIT 20 USERNAME “test_user” PASSWORD “test_pass123”在代码中引入配置from config import BASE_URL。添加日志使用Python内置的logging模块记录脚本运行的关键步骤和错误信息便于调试和回溯。import logging logging.basicConfig(levellogging.INFO, format‘%(asctime)s - %(name)s - %(levelname)s - %(message)s’) logger logging.getLogger(__name__) def click_element(locator): try: element WebDriverWait(driver, 10).until(EC.element_to_be_clickable(locator)) element.click() logger.info(f“成功点击元素: {locator}”) except Exception as e: logger.error(f“点击元素失败: {locator}, 错误信息: {e}”) raise完善的异常处理使用try...except...finally块来捕获和处理可能出现的异常如元素未找到、网络超时确保脚本失败时能妥善清理资源如关闭浏览器、保存截图并给出清晰的错误报告。try: # 核心操作 perform_risky_operation() except NoSuchElementException as e: logger.error(“未找到页面元素可能是页面未加载或定位器错误。”) driver.save_screenshot(“error_screenshot.png”) # 保存错误时的截图 raise except TimeoutException as e: logger.error(“操作超时网络或服务器可能有问题。”) raise finally: # 确保资源释放 driver.quit()7. 常见问题排查与调试技巧即使按照教程一步步来在实际操作中你还是会遇到各种问题。这里汇总了一些高频问题和我的排查经验。7.1 高频错误与解决方案速查表错误信息/现象可能原因排查步骤与解决方案selenium.common.exceptions.NoSuchElementException1. 元素定位器写错了。2. 页面还没加载完就去查找元素。3. 元素在iframe/frame内。4. 元素是动态生成的AJAX。1. 用浏览器开发者工具核对定位器ID、XPath等。2.添加显式等待等待元素出现/可见。3. 使用driver.switch_to.frame(frame_reference)切换到正确的iframe。4. 使用显式等待条件设为元素出现。selenium.common.exceptions.ElementNotInteractableException1. 元素不可见如被遮挡、CSS隐藏。2. 元素不可点击如disabled属性。1. 确保元素在视窗内可滚动。2. 检查元素是否被其他元素覆盖。3. 等待元素变为可交互状态element_to_be_clickable。4. 尝试用JavaScript直接点击driver.execute_script(“arguments[0].click();”, element)。selenium.common.exceptions.TimeoutException显式等待超时。1. 增加等待时间。2. 检查等待条件是否设置正确。3. 检查网络或目标网站是否正常。4. 可能是反爬机制阻止了页面加载。浏览器能打开但页面空白或无法访问1. 网络问题。2. 驱动版本与浏览器不匹配。3. 浏览器启动参数有问题。1. 手动用浏览器访问目标网址确认网络通畅。2.再次检查并确保ChromeDriver版本与Chrome浏览器大版本号一致。3. 尝试用最简单的代码只打开about:blank测试驱动是否正常。脚本在无头模式下运行正常但有界面时失败有界面时窗口焦点、屏幕分辨率可能影响元素状态。1. 在有界面模式下使用driver.maximize_window()最大化窗口。2. 在操作前用JavaScript将元素滚动到视图中。操作被网站识别为机器人触发了网站的反爬机制。1. 尝试添加--disable-blink-featuresAutomationControlled等选项。2. 在访问页面前执行CDP命令修改navigator.webdriver属性。3. 增加操作间的随机延迟模拟人类行为。4. 考虑使用更高级的浏览器自动化工具或方案。7.2 强大的调试技巧保存截图和页面源码在出错的地方让脚本自动截屏并保存当前HTML这是最直接的证据。driver.save_screenshot(‘debug_screenshot.png’) with open(‘debug_page.html’, ‘w’, encoding‘utf-8’) as f: f.write(driver.page_source)使用driver.title和driver.current_url在关键步骤后打印当前页面标题和URL确认页面跳转是否符合预期。在脚本中插入input(‘等待按回车…’)在怀疑有问题的代码行前暂停脚本执行。此时你可以手动操作浏览器检查页面状态然后按回车让脚本继续。这是一个非常原始的但极其有效的调试方法。利用PyCharm/VSCode的调试器设置断点单步执行查看变量状态。这是定位复杂逻辑错误的最佳方式。降低执行速度在开发阶段可以在每个操作如click,send_keys后加上短暂的time.sleep(0.5)方便你用肉眼观察脚本的执行过程。走到这里你已经从一个对Selenium一无所知的新手变成了一个能够搭建环境、编写基础脚本、处理常见交互、并初步了解项目化设计和问题排查的入门者。自动化之路核心就是“动手”和“排错”。不要怕代码报错每一个错误信息都是搜索引擎的关键词都是你成长的阶梯。接下来最好的学习方式就是找一个你感兴趣的实际小项目比如自动查询天气、定时签到、抓取某个博客列表动手做起来在实践中你会遇到更具体的问题解决它们的过程会让你真正掌握这门技术。记住所有复杂的项目都是由像我们今天写的这个“打开百度并搜索”一样简单的脚本一步步构建起来的。