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:当有特殊符号&nbsp,选不中

方式三:通过下标选择: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()
posted @   没事别找我  阅读(158)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示