Python Selenium WebDriver示例代码解读及相关技术疑问
Selenium Python 版核心逻辑及疑问解答
你之前对Java版Selenium中WebDriver是接口的认知完全成立,Python版Selenium的核心设计逻辑和Java版是完全对齐的,只是受Python语言本身的特性影响,命名、文件结构和Java版有区别,不存在本质差异。
核心疑问逐一解答
1. webdriver.Chrome是否是webdriver模块下的类?执行driver = webdriver.Chrome()是否就是创建Chrome类对象?
- 这个判断完全正确
- 你看到的
webdriver.Chrome就是Selenium封装的、专门对接Chrome浏览器驱动的类,传入的chromedriver.exe路径是这个类初始化时必须的核心参数,执行完赋值给driver变量后,得到的就是实打实的Chrome类实例对象。
2. Chrome类是否定义在你导入的顶层webdriver模块里?
- 不是直接定义在顶层的webdriver.py文件中的
- 顶层webdriver模块只是做了一层统一导出的封装:实际的Chrome类源码存放在
selenium/webdriver/chrome/webdriver.py路径下,顶层webdriver模块把各个浏览器对应的专属类(Chrome、Firefox、Edge等)统一导入到自己的命名空间里,目的是让你写代码的时候不用记深层的文件路径,直接通过webdriver.Chrome就能调用。 - 这也是你在PyCharm中点进源码找半天找不到类定义的核心原因:顺着
webdriver.Chrome点进去,你最先看到的是顶层模块的导入语句,不是类本身的具体实现,自然会理不清逻辑。
3. 代码中调用的各类方法,到底属于WebDriver模块还是Chrome类的方法?
- 首先不存在“WebDriver模块的全局调用方法”这种形式,你所有通过
driver.xxx()调用的方法,本质都是之前创建的Chrome类实例的方法。 - 至于为什么会和你认知里Java版的WebDriver接口对应,是因为Python版Selenium做了和Java版完全对齐的继承结构:Chrome类本身继承自通用的
WebDriver基类,基类里已经把所有浏览器通用的操作(比如get、set_page_load_timeout、find_element_by_name、close、quit等)全部实现完成,Chrome类只是额外补充了Chrome浏览器专属的配置逻辑(比如读取Chrome安装路径、处理Chrome DevTools协议对接),不会重复实现通用操作。 - 用你熟悉的Java逻辑做对应:Java中你写
ChromeDriver driver = new ChromeDriver(),这里的ChromeDriver就是实现了WebDriver接口的实现类,你调用的get、findElement等方法,本质都是接口定义、由实现类落地实现的逻辑。Python版只是把Java里的“接口”换成了“通用基类”,把实现类按浏览器分类放在了各自的子目录下,核心运行逻辑和Java版没有任何区别。
示例代码逐行逻辑梳理
import time:导入Python内置时间模块,用来实现固定等待from selenium import webdriver:导入Selenium顶层webdriver命名空间driver = webdriver.Chrome("../drivers/chromedriver.exe"):初始化Chrome类实例,加载指定路径的chromedriver可执行文件,建立和本地Chrome浏览器的通信链路driver.set_page_load_timeout(10):调用通用基类的超时配置方法,设置页面最长加载等待时间为10秒,超时则主动抛出异常driver.get("https://google.com"):调用通用基类的页面跳转方法,让当前绑定的Chrome窗口加载指定网址driver.find_element_by_name("q").send_keys("Automation step by step"):通过元素的name属性定位到搜索输入框,模拟键盘输入指定文本driver.find_element_by_name("btnK").click():定位到搜索提交按钮,模拟鼠标点击操作time.sleep(2):固定等待2秒,让页面完成加载driver.close():调用通用基类方法,关闭当前驱动绑定的浏览器窗口driver.quit():调用通用基类方法,彻底终止chromedriver进程、释放所有占用的系统资源print("Test Completed"):在控制台输出测试完成提示
内容的提问来源于stack exchange,提问作者rdeep
相关产品推荐
相关产品推荐

