Selenium基础学习
Selenium基础学习
Selenium组件
-
Selenium IDE:是一个测试集成开发环境,可以结合FF录制脚本,并对脚本编辑和调试
特点:1.很容易在页面上就行录制
2.能自动通过id,name,xpath就行定位
3.自动执行Selenium命令
4.能够进行高度和设置断点
5.录制的脚本能生成各种语言
6.能在各个阶段添加断言
-
Selenium RC:Selenium Remote Control
组成:Server端和Client端
Server:负责启动和关闭浏览器,类似与HTTP
CLient:各种编程语言设计的开发库构成
RC提供了一个代理服务器,可以用程序语言编写测试用例,可以与其他框架进行集成测试
-
Selenium Webdriver
-
Selenium Grid
selenium定位方式
八大定位方式:
1.id:
driver.find_element(By.ID,'kw').send_keys('中共一大')
2.name:
driver.find_element(By.NAME,'wd').send_keys('yiyi')
3.class_name
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('yiyi')
4.link_text
driver.find_element(By.LINK_TEXT,'依依(汉语词汇) - 百度百科').click()
5.partial_link_text
driver.find_element(By.PARTIAL_LINK_TEXT,'依依').click()
6.tag_name
driver.find_element(By.TAG_NAME,'标签名称')
7.css_selector
driver.find_element(By.CSS_SELECTOR,'#kw') ->id:#
driver.find_element(By.CSS_SELECTOR,'.s_ipt') ->class:.
driver.find_element(By.CSS_SELECTOR,'[name=wd]') ->name
8.xpath
一、绝对路径:/
driver.find_element(By.XPATH,'//html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[2]/input')
二、相对路径://
相对路径+属性[@属性=属性值]
#通过id属性
driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys(“test”)
#通过class定位
driver.find_element(By.XPATH,'//*[@class="s_ipt"]').send_keys(“test”)
#通过name定位
driver.find_element(By.XPATH,'//*[@name="wd"]').send_keys(“test”)
#通过其他属性进行定位
driver.find_element(By.XPATH,'//*[@autocomplete="off"]')
通过文本属性进行定位
driver.find_element(By.XPATH,'//*[text()="新闻"]')
相对路径+通配符(*)
driver.find_element(By.XPATH,'//*[@id="su"]')
属性组合定位(逻辑运算符and、or等)
driver.find_element(By.XPATH,'//*[@autocomplete="off" and @class="s_ipt"]').send_keys(“test”)
#模糊匹配:contains
driver.find_element(By.XPATH,'//a[contains(text(),"hao")]") # 文本模糊匹配
driver.find_element(By.XPATH,'//input[contains(@class,"s_btn")]') # class属性模糊匹配,其它类似
css_selector
css属性定位:
css选择器策略 | 示例 | 说明 |
---|---|---|
#id | #telA | 选择id="telA"的所有元素 |
.class | .telA | 选择 class="telA”的所有元素 |
[属性名=属性值] | [name=telA] | 除了id和class属性,其他属性的定位格式 |
[attribute] | [target] | 选择带有target 属性所有元素 |
* | * | 选择所有元素 |
[attribute^=value] | a[src^="https"] | 选择其src 属性值以"https”开头的每个元素 |
[attribute$=value] | a[src$=".pdf"] | 选择其src属性以".pdf“结尾的所有元素 |
[attribute*=value] | a[src*="abc"] | 选择其src 属性中包含“abc"子串的每个元素 |
[attribute~=value] | a[title~=flower] | 定位标签属性title值中有独立flower词汇的节点 |
[attribute=value] | a[lang=en] | 用于选取带有以指定值开头的属性值的元素 |
css标签定位
css选择器策略 | 示例 | 说明 |
---|---|---|
element | p | 定位所有 元素 |
标签名[属性名=属性值] | input#telA | 定位id属性值为telA的所有元素 |
css层级关系定位
css选择器策略 | 示例 | 说明 |
---|---|---|
element,element | div,p | 选择所有 元素和所有 元素 |
element element | div p | 选择 元素内部的所有 元素。包括子孙后代 |
element>element | div>p | 选择父元素为 元素的所有 元素。只包括子代 |
element+element | div+p | 选择紧接在 元素之后的所有 元素。同辈元素 |
css索引定位
css选择器策略 | 示例 | 说明 |
---|---|---|
:only-child | p:only-child | 选择属于其父元素的唯一子元素的每个 元素 |
:nth-child(n) | p:nth-child(2) | 选择属于其父元素的第二个子元素的每个 元素 |
:nth-last-child(n) | p:nth-last-child(2) | 同上,从最后一个子元素开始计数 |
:nth-of-type(n) | p:nth-of-type(2) | 选择属于其父元素第二个 元素的每个 元素 |
:nth-last-of-type(n) | p:nth-last-of-type(2) | 同上,但是从最后一个子元素开始计数 |
css元素状态定位
选择器 | 例子 | 例子描述 |
---|---|---|
:empty | p:empty | 选择没有子元素的每个 元素(包括文本节点) |
:target | #news:target | 选择当前活动的 #news 元素 |
:enabled | input:enabled | 选择每个启用的 元素 |
:disabled | input:disabled | 选择每个禁用的 元素 |
:checked | input:checked | 选择每个被选中的 元素 |
:not(selector) | :not(p) | 选择非 元素的每个元素 |
等待方式
强制等待
time.sleep(1)
隐式等待
隐式等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。隐式等待对整个driver的周期都起作用。
implicitly_wait(time)
显示等待
第三种是显式等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。
它主要的意思就是:程序每隔time秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
显式等待调用方法:
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
这里需要特别注意的是until或until_not中的可执行方法method参数
python+selenium
一:环境搭建
python+pychram+selenium+chrome(谷歌驱动)
项目默认规则
- py文件必须以test_开头或者__test结尾
- 类名必须以Test开头
- 用例测试必须以test_开头
如果元素定位不到,该如何分析:
1.元素没有加载完成
2.置于框架中(Frame)
3.元素不可用,不可读,不可见
4.动态属性,动态Div层
定位一个元素的前提:元素一定要唯一
自动化测试条件:
编辑语言:python java
设计模式:POM 关键字驱动模式
用例管理:unittest pytest
数据驱动:ddt pytest.mark.parameters
二次封装:excel 封装、数据库封装等等。。。
日志监控:logger日志收集
异常处理:try except
jenkins: 持续集成
Docker:镜像容器技术
分布式运行:Grid
二:Selenium组件
-
Selenium IDE:是一个测试集成开发环境,可以结合FF录制脚本,并对脚本编辑和调试
特点:1.很容易在页面上就行录制
2.能自动通过id,name,xpath就行定位
3.自动执行Selenium命令
4.能够进行高度和设置断点
5.录制的脚本能生成各种语言
6.能在各个阶段添加断言
-
Selenium RC:Selenium Remote Control
组成:Server端和Client端
Server:负责启动和关闭浏览器,类似与HTTP
CLient:各种编程语言设计的开发库构成
RC提供了一个代理服务器,可以用程序语言编写测试用例,可以与其他框架进行集成测试
-
Selenium Webdriver
-
Selenium Grid
三:八大定位方法
-
八大定位方式:
1.id:
driver.find_element(By.ID,'kw').send_keys('中共一大')
2.name:
driver.find_element(By.NAME,'wd').send_keys('yiyi')
3.class_name
driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('yiyi')
4.link_text
driver.find_element(By.LINK_TEXT,'依依(汉语词汇) - 百度百科').click()
5.partial_link_text
driver.find_element(By.PARTIAL_LINK_TEXT,'依依').click()
6.tag_name
driver.find_element(By.TAG_NAME,'标签名称')
7.css_selector
driver.find_element(By.CSS_SELECTOR,'#kw') ->id:# driver.find_element(By.CSS_SELECTOR,'.s_ipt') ->class:. driver.find_element(By.CSS_SELECTOR,'[name=wd]') ->name
8.xpath
一、绝对路径:/ driver.find_element(By.XPATH,'//html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[2]/input') 二、相对路径:// 相对路径+属性[@属性=属性值] #通过id属性 driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys(“test”) #通过class定位 driver.find_element(By.XPATH,'//*[@class="s_ipt"]').send_keys(“test”) #通过name定位 driver.find_element(By.XPATH,'//*[@name="wd"]').send_keys(“test”) #通过其他属性进行定位 driver.find_element(By.XPATH,'//*[@autocomplete="off"]') 通过文本属性进行定位 driver.find_element(By.XPATH,'//*[text()="新闻"]') 相对路径+通配符(*) driver.find_element(By.XPATH,'//*[@id="su"]') 属性组合定位(逻辑运算符and、or等) driver.find_element(By.XPATH,'//*[@autocomplete="off" and @class="s_ipt"]').send_keys(“test”) #模糊匹配 driver.find_element(By.XPATH,'//a[contains(text(),"hao")]") # 文本模糊匹配 driver.find_element(By.XPATH,'//input[contains(@class,"s_btn")]') # class属性模糊匹配,其它类似
四:浏览器操作方法以及获取元素的定位方法
浏览器的操作方法:
# 方法
driver.maximize_window() # 最大化浏览器
driver.set_window_size(w,h) # 设置浏览器大小 单位像素 【了解】
driver.set_window_position(x,y) # 设置浏览器位置 【了解】
driver.back() # 后退操作
driver.forward() # 前进操作
driver.refrensh() # 刷新操作
driver.close() # 关闭当前主窗口(主窗口:默认启动那个界面,就是主窗口)
driver.quit() # 关闭driver对象启动的全部页面
driver.title # 获取当前页面title信息
driver.current_url # 获取当前页面url信息
获取元素的方法:
#方法:
text #获取元素的文本; 如:driver.text
size #获取元素的大小: 如:driver.size
get_attribute #获取元素属性值;如:driver.get_attribute("id") ,传递的参数是元素的属性名
is_displayed #判断元素是否可见 如:element.is_displayed()
is_enabled #判断元素是否可用 如:element.is_enabled()
is_selected #判断元素是否被选中 如:element.is_selected()
五:框架处理方法
1.进入框架:frame(iframe)
driver.switch_to.frame("menu-frame")
2.出框架
driver.switch_to.default_content()
六:下拉框处理
第一步:选中所有的下拉框:select()
sel=select(driver.find_element(By.Name,"name名称")) //定位元素,切换为select对象
第二步:选中下拉框里的数据
<select>
<option value ="volvo">Volvo</option>
<option value ="saab">Saab</option>
<option value="opel">Opel</option>
<option value="audi">Audi</option>
</select>
方式一:通过value值进行获取
sel.select_by_value("volve")
方式二:通过文本进行选择:
sel.select_by_visible_text("Volvo")
eg:当有特殊符号 ,选不中
方式三:通过下标选择:index
sel.select_by_index("3") #选择数据为:Audi
七:自动化步骤(unittest框架)
1.自动化基础使用
#导入selenium
from selenium import webdriver
#导入时间
import time
#打开浏览器
driver = webdriver.Chrome()
#加载网页
driver.get('url')
#时间睡眠
time.sleep(3)
#关闭浏览器
driver.quit()
2.导入unittest使用,unittest是python内置的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件
#第一步:导入unittest
import unittest
#第二步:新建一个类继承unittest.TestCase
class TestCase(unittest.TestCase):
#第三步:写一个test开头的方法
def test_login(self):
3.运行方式
#执行整个模块
python -m unittest 模块名.py
#执行当个方法
python -m ubittest test_case.TestCase.test_login
八:Element其他定位处理
1.当遇见xpath不唯一时,有可能是一个列表,则定位列表的内容为:例如多选框
#find_elements:代表的是定位一组元素
a = driver.find_elements(By.XPATH,"定位路径")
2.处理弹窗窗口
#弹窗方式:alert(只有确定)、confirm(有确定和取消)、prompt(有确定有取消还可以输入值)
#进入弹窗
a = driver.switch_to.alert
#点击确定
a.accept()
#点击取消
a.dismiss()
#获得文本
a.text()
#输入值
a.send_key()
九:设计模式(封装代码)+ unittes前后置处理
Pom模式+关键字驱动模式
Pom模式:Page object model 页面对象模型
好处:
解决线性脚本的问题
解决代码不能重复利用的问题
解决后期的维护问题
架构分三层:
1.基础层: base 主要放selenium原生方法:如find_element
2.页面对象模型:po 主要用于放页面的元素和页面的动作(pageobject)以及断言
3.测试用例层:testcase 存放测试用例以及测试数据
关系:页面对象层调用基础层的方法,测试用例层调用页面对象层的方法
unittes前后置处理:
setup:在测试用例之前的准备工作
teardown:在测试用例之后的结束工作
十:断言
unittest断言用于判断实际结果与预期结果是否一致
#判断两个值是否相等
self.assertEqual()
#判断一个值是否为true
self.assertTrue()
#判断一个值是否在另一个值里
self.assertIn()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧