35.Python Selenium基本用法
Selenium 作为一款 Web 自动化测试框架,提供了诸多操作浏览器的方法,本节对其中的常用方法做详细介绍。
定位节点
Selenium 提供了 8 种定位单个节点的方法,如下所示:
方法 | 说明 |
---|---|
find_element_by_id() | 通过 id 属性值定位 |
find_element_by_name() | 通过 name 属性值定位 |
find_element_by_class_name() | 通过 class 属性值定位 |
find_element_by_tag_name() | 通过 tag 标签名定位 |
find_element_by_link_text() | 通过<a>标签内文本定位,即精准定位。 |
find_element_by_partial_link_text() | 通过<a>标签内部分文本定位,即模糊定位。 |
find_element_by_xpath() | 通过 xpath 表达式定位 |
find_element_by_css_selector() | 通过 css 选择器定位 |
假设下面代码某个页面的代码片段,如下所示:
- <html>
- <head>
- <body link="#cc0916">
- <a id="logo" href="http://c.biancheng.net" onclick="">
- <form id="form" class="fm" name="f" action="c.biancheng.net">
- <span class="btn"></span>
- <input id="kw" class="s_ipt_wr" name="wd" value="" maxlength="255" autocomplete="off">
- </body>
- </head>
- </html>
下面使用表格中提供的方法定位 input 输出框。如下所示:
- #创建browser是浏览器对象
- browser = webdriver.Chrome()
- #访问某个url得到上述代码片段
- browser.get('url')
- #通过id定义输入框
- browser.dr.find_element_by_id("kw")
- #通过class定义
- browser.find_element_by_class_name("s_ipt_wr")
- #通过name定位
- browser.find_element_by_name("wd")
- #通过tag name定位:
- browser.find_element_by_tag_name("input")
- #通过xpath定位
- browser.find_element_by_xpath("//*[@id='kw']")
- #通过css选择器定位
- browser.find_element_by_css_selector("#kw")
通过 a 标签内的文本内容定位节点,如下所示:
<a class="vip" href="http://c.baincheng.net">C语言中文网</a>
<a class="search" href="http://www.baidu.com">hao123</a>
示例如下:
- #使用全部文本内容定位链接
- browser.find_element_by_link_text("c语言中文网")
- #使用部分文本内容定位链接
- browser.find_element_by_partial_link_text("123")
如果您想定位一组元素,方法如下所示:
find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()
定位一组元素的方法与定位单个元素类似,唯一的区别就是 element 后面多了一个 s(表示复数),因此上述方法的返回值是一个列表,您可以使用 for 循环拿到所有的元素节点。
控制浏览器
Selenium 可以操控浏览器的窗口大小、刷新页面,以及控制浏览器的前进、后退等
1) 设置浏览器窗口大小、位置
- from selenium import webdriver
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- #参数数字为像素点
- driver.set_window_size(480, 800)
- #设置窗口位置
- driver.set_window_position(100,200)
- #同时设置窗口的大小和坐标
- driver.set_window_rect(450,300,32,50)
- #退出浏览器
- driver.quit()
2) 控制网页前进、后退、刷新页面
- from selenium import webdriver
- driver = webdriver.Chrome()
- # 访问C语言中文网首页
- first_url= 'http://c.biancheng.net'
- driver.get(first_url)
- # 访问c语言教程
- second_url='http://c.biancheng.net/c/'
- driver.get(second_url)
- # 返回(后退)到c语言中文网首页
- driver.back()
- # 前进到C语言教程页
- driver.forward()
- # 刷新当前页面相当于F5
- driver.refresh()
- # 退出/关闭浏览器
- driver.quit()
WebDriver常用方法
上文中介绍了如何定位元素,以及如何设置浏览的大小、位置。 定位元素节点只是第一步, 定位之后还需要对这个元素进行操作, 比如单击按钮,或者在输入框输入文本 , 下面介绍 WebDriver 中的最常用方法:
# 请求url
get(url)
# 模拟键盘输入文本
send_keys (value)
# 清除已经输入的文本
clear():
# 单击已经定位的元素
click():
# 用于提交表单,比如百度搜索框内输入关键字之后的“回车” 操作
submit():
#返回属性的属性值,返回元素的属性值,可以是id、name、type 或其他任意属性
get_attribute(name)
# 返回布尔值,检查元素是否用户可见,比如 display属性为hidden或者none
is_displayed()
示例如下:
- from selenium import webdriver
- import time
- driver = webdriver.Chrome()
- driver.get("https://www.baidu.com")
- #模拟键盘,输出文本
- driver.find_element_by_id("kw").send_keys("C语言中文网")
- #单击“百度”一下查找
- driver.find_element_by_id("su").click()
- time.sleep(3)
- #退出浏览器
- driver.quit()
除了上述方法外, WebDriver 还有一些常用属性,如下所示:
- from selenium import webdriver
- driver = webdriver.Chrome()
- # 获取HTML结构源码
- driver.page_source
- #在源码中查找指定的字符串
- driver.page_source.find('字符串')
- # 返回百度页面底部备案信息
- text = driver.find_element_by_id("cp").text
- print(text)
- # 获取输入框的尺寸
- size = driver.find_element_by_id('kw').size
- print(size)
输出结果:
©2015 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173 号
{'width': 500, 'height': 22}
Selenium事件处理
Selenium WebDriver 提供了一些事件处理函数(鼠标、键盘等),下面我们对常用的事件函数做简单介绍。
1) 鼠标事件
Selenium WebDriver 将关于鼠标的操作方法都封装在 ActionChains 类中,使用时需要引入 ActionChains 类,如下所示:
from selenium.webdriver.common.action_chains import ActionChains
该类包含了鼠标操作的常用方法:
方法 | 说明 |
---|---|
ActionChains(driver) | 构造 ActionChains 鼠标对象。 |
click() | 单击 |
click_and_hold(on_element=None) | 单击鼠标左键,不松开 |
context_click() | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
move_to_element(above) | 执行鼠标悬停操作 |
context_click() | 用于模拟鼠标右键操作, 在调用时需要指定元素定位。 |
perform() | 将所有鼠标操作提交执行。 |
示例如下:
- from selenium import webdriver
- #导入 ActionChains 类
- from selenium.webdriver.common.action_chains import ActionChains
- driver = webdriver.Chrome()
- driver.get("http://c.biancheng.net")
- # 通过xpath表达式定位到要悬停的元素
- above = driver.find_element_by_xpath('//ul[@id="ad-link-top"]/li[1]')
- # 对定位到的元素执行鼠标悬停操作
- ActionChains(driver).move_to_element(above).perform()
2) 键盘事件
Selenium WebDriver 的 Keys 模块提供了模拟键盘输入的 send_keys() 方法,除此之外,该模块也提供了操作键盘的其他方法,比如复制、粘贴等等。
在使用之前,首先需要导入 Keys 类,如下所示:
from selenium.webdriver.common.keys import Keys
下面列举了一些常用方法:
方法 | 说明 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 制表键(Tab) |
send_keys(Keys.ESCAPE) | 回退键(Esc) |
send_keys(Keys.ENTER) | 回车键(Enter) |
send_keys(Keys.CONTROL,'a') | 全选(Ctrl+A) |
send_keys(Keys.CONTROL,'c') | 复制(Ctrl+C) |
send_keys(Keys.CONTROL,'x') | 剪切(Ctrl+X) |
send_keys(Keys.CONTROL,'v') | 粘贴(Ctrl+V) |
send_keys(Keys.F1…Fn) | 键盘 F1…Fn |
keys.down(value,element=None) | 按下键盘上的某个键 |
keys.up(value,element=None) | 松开键盘上的某个键 |
示例如下:
- from selenium import webdriver
- # 引入 Keys 模块
- from selenium.webdriver.common.keys import Keys
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- # 输入框输入内容
- driver.find_element_by_id("kw").send_keys("C语言中文网H")
- # 删除多输入的一个H
- driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
- #单击“百度”一下查找
- driver.find_element_by_id("su").click()
- time.sleep(3)
- driver.quit()
其它键盘操作方法,如下所示:
- # 输入空格键 + “Python教程”
- driver.find_element_by_id("kw").send_keys(Keys.SPACE)
- driver.find_element_by_id("kw").send_keys("Python教程")
- # ctrl+a 全选输入框内容
- driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
- # ctrl+x 剪切输入框内容
- driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
- # ctrl+v 粘贴内容到输入框
- driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
- # 使用回车键来代替单击操作click
- driver.find_element_by_id("su").send_keys(Keys.ENTER)
无界面浏览器
Chromedriver 每一次运行都要打开浏览器,并执行相应的输入、搜索等操作,这样会导致浏览器交互能力变差,浪费许多时间。 Selenium 为了增强浏览器的交互能力,允许您使用无头浏览器模式,也就是无界面浏览器,它被广泛的应用于爬虫和自动化测试中。通过以下代码可以设置无头浏览器模式:
- from selenium import webdriver
- import time
- options=webdriver.ChromeOptions()
- options.add_argument('--headless')#无界面浏览
- driver=webdriver.Chrome(options=options)
- driver.get('https://www.baidu.com')
- kw1=driver.find_element_by_id('kw')
- print(driver.title)
- time.sleep(3)
- #关闭当前界面,只有一个窗口
- driver.close()
- #关闭所有界面
- driver.quit()
除了可以设置无头界面之外,Selenium 还支持其他一些浏览器参数设置,如下所示:
opption.add_argument('--window-size=600,600') #设置窗口大小
opption.add_argument('--incognito') #无痕模式
opption.add_argument('--disable-infobars') #去掉chrome正受到自动测试软件的控制的提示
opption.add_argument('user-agent="XXXX"') #添加请求头
opption.add_argument("--proxy-server=http://200.130.123.43:3456")#代理服务器访问
opption.add_experimental_option('excludeSwitches', ['enable-automation'])#开发者模式
opption.add_argument('blink-settings=imagesEnabled=false') #禁止加载图片
opption.add_argument('lang=zh_CN.UTF-8') #设置默认编码为utf-8
opption.add_extension(create_proxyauth_extension(
proxy_host='host',
proxy_port='port',
proxy_username="username",
proxy_password="password"
))# 设置有账号密码的代理
opption.add_argument('--disable-gpu') # 这个参数可以规避谷歌的部分bug
opption.add_argument('--disable-javascript') # 禁用javascript
opption.add_argument('--hide-scrollbars') # 隐藏滚动条
执行JS脚本
WebDriver 提供了 execute_script() 方法来执行 JavaScript 代码,比如控制浏览器的滚动条。示例如下:
- from selenium import webdriver
- from time import sleep
- # 访问百度
- driver=webdriver.Chrome()
- driver.get("http://www.baidu.com")
- # 最大化浏览器窗口
- driver.maximize_window()
- # 搜索
- driver.find_element_by_id("kw").send_keys("C语言中文网")
- driver.find_element_by_id("su").click()
- sleep(3)
- # 通过js代码设置滚动条位置,数值代表(左边距,上边距)
- js="window.scrollTo(100,500);"
- #执行js代码
- driver.execute_script(js)
- sleep(5)
- driver.quit()
如果想了解更多关于 Selenium 的知识,请参考官方文档:https://www.selenium.dev/documentation/en/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~