软测入门(三)Selenium(Web自动化测试基础)

news2024/10/2 22:26:38

Selenium(Web端自动测试)

Selenium是一个用于Web应用程序测试的工具:中文是

  • 开源
  • 跨平台:linux、windows、mac
  • 核心:可以在多个浏览器上进行自动化测试
  • 多语言

Selenium WebDriver控制原理

  • Selenium Client Library:通过他们提供的库来编写脚本,可以使用Java、Python等进行编写脚本
  • JSON Wire Protocol是在HTTP服务器之间传输信息的REST风格的API。
  • Browser Drivers:浏览器驱动,不同浏览器会有一个单独的浏览器驱动程序
  • Browsers:Selenium 支持的浏览器,Firefox、Chrome、IE、Safar等

安装环境

  • Python 3.5以上

  • 安装PyCharm

  • 安装selenium包(在pycharm或者cmd中)

    # 安装
    pip install selenium
    
    # 卸载
    pip uninstall selenium
    
    # 查看
    pip show selenium
    
  • WebDriver安装

    谷歌Driver国内镜像:http://npm.taobao.org/mirrors/chromedriver/

    注意要去下载和自己电脑谷歌浏览器相匹配的版本

    全局:下载解压缩后,可以将webdriver的路径配置到环境变量中,方便使用

    局部:下载解压缩后,将可执行文件放入到本地项目目录中

入门案例

import time

from selenium.webdriver.chrome.service import Service
from selenium import webdriver

# 定义chrome驱动去地址
path =  Service('chromedriver.exe')

# webdriver 获取浏览器对象
driver = webdriver.Chrome(service = path)

# 准备一个网址
url = "https://www.baidu.com/"
driver.get(url)

# 模拟时间
time.sleep(5)

# 回收资源
driver.quit()

元素定位

普通定位

如百度的输入框,输入文字后+点击查询

在这里插入图片描述

通过ID定位那么可以在代码中进行定位

from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 定义chrome驱动去地址
path = Service('chromedriver.exe')

# webdriver 获取浏览器对象
driver = webdriver.Chrome(service=path)

# 准备一个网址
url = "https://www.baidu.com/"
driver.get(url)

# 根据id查询到元素,发送关键词
driver.find_element(By.ID, "kw").send_keys("阿卡丽")

# 同理找到查询按钮的id,执行click事件
driver.find_element(By.ID, "su").click()

time.sleep(5)

# 回收资源
driver.quit()

其他定位:name,tag_name,class_name等

在这里插入图片描述

a标签定位

# 定位a标签, link_text | partial_link_text
# 方式一(完整)
driver.find_element(By.LINK_TEXT, "hao123").click()

# 方式二(模糊)
driver.find_element(By.PARTIAL_LINK_TEXT, "hao1").click()

需要注意的是:如果相同的规则会对应多个标签,那么这些方法只会返回第一个标签,除非使用的是find_elements()方法

CSS选择器定位

了解下CSS选择器基本知识

在这里插入图片描述

# 通过CSS选择器
# id
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("阿卡丽")
# 属性选择器
driver.find_element(By.CSS_SELECTOR, "[name=wd]").send_keys("阿卡丽")

xpath获取元素

xpath=xml path

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSvzKOqF-1677652557333)(imgs3/4.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVasXHVs-1677652557333)(imgs3/5.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETC0VGRr-1677652557334)(imgs3/6.png)]

# 通过XPAth定位
driver.find_element(By.XPATH, "//*[@id='kw']").send_keys("阿卡丽")
driver.find_element(By.XPATH, "//*[@id='su']").click()

driver.find_element(By.XPATH, "//*[text()='hao123']").click()

浏览器其他操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-382JrOLL-1677652557334)(imgs3/7.png)]

# 设置最大化
driver.maximize_window()

# 设置浏览器 宽高像素
driver.set_window_size(1920, 1080)

# 设置窗口位置
driver.set_window_position(200, 200)

# 刷新
driver.refresh()

# 前进
driver.forward()

# 后退
driver.back()

# 关闭 当前页面
driver.close()

# 关闭浏览器
driver.quit()

# 获取浏览器属性
print(driver.title) 
print(driver.current_url)

页面等待

某些html元素可能加载稍微慢些,那么我们的测试脚本就需要进行页面等待完毕后,再执行测试过程。

等待方式:

  • 强制等待(不推荐)

    time.sleep(1)
    
  • 显示等待(导包太多,麻烦)

    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//*[@id='1']/div/div[1]/div/div[2]/a[2]/img")))
    driver.find_element(By.XPATH, "//*[@id='1']/div/div[1]/div/div[2]/a[2]/img").click()
    
  • 隐式等待

    # 隐式等待(等所有的元素)
    driver.implicitly_wait(5)
    

元素操作

操作

  • clear() 清除文本
  • send_keys() 模拟输入
  • click() 单击元素

元素属性获取

  • size : 返回元素大小
  • text :获取元素文本
  • get_attribute() 获取某个属性值
  • is_display() :元素是否可见
  • is_enabled() :元素是否可用
# 清除文本
driver.find_element(By.ID, "kw").clear()

print(driver.find_element(By.ID, "kw").size)                # 获取大小
print(driver.find_element(By.ID, "kw").text)                # 获取文本
print(driver.find_element(By.ID, "kw").is_enabled())        # 是否可用
print(driver.find_element(By.ID, "kw").is_displayed())      # 是否显示

print(driver.find_element(By.XPATH, "//*[text()='新闻']").get_attribute("href"))  # 获取属性

##########
{'height': 43, 'width': 549}

True
True
http://news.baidu.com/

模拟鼠标操作

selenium模拟鼠标操作:

  • 创建ActionChains对象,使用ActionChains对象的方法进行操作
    • context_click() : 鼠标右击
    • double_click() : 鼠标双击
    • drag_and_drop():拖动
    • move_to_element() : 悬停
  • 通过perform()执行以上的鼠标操作方法
import time

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)

action = ActionChains(driver)


action.context_click(driver.find_element(By.ID, "su")) # 右键
action.move_to_element(driver.find_element(By.CLASS_NAME, "soutu-btn")) # 悬停
action.drag_and_drop(driver.find_element(By.ID,"div1"), driver.find_element(By.ID,"div2")) # 拖拽,把一个元素拖拽到另一个元素中

# 执行
action.perform()

time.sleep(5)

driver.quit()

键盘操作

  • send_keys()

Keys类中封装了所有的键盘操作

在这里插入图片描述

实例

import time

from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = "https://www.baidu.com/"
driver.get(url)

el = driver.find_element(By.ID, "kw")
# 输入Python
el.send_keys("Python")
time.sleep(2)

# ctrl+a 全选
el.send_keys(Keys.CONTROL, "a")
# 退格
el.send_keys(Keys.BACKSPACE)

# 输入其他
el.send_keys("阿卡丽")
time.sleep(2)

el.send_keys(Keys.CONTROL, "a")
time.sleep(2)
# 复制
el.send_keys(Keys.CONTROL, "c")

el.send_keys(Keys.CONTROL, "a")
time.sleep(2)

# 粘贴
el.send_keys(Keys.CONTROL, "v")


time.sleep(5)

driver.quit()

下拉框

通过Select对象来处理,记得导Select

driver = webdriver.Chrome()
url = "https://manager.hezhuyun.net/"

driver.get(url)
# 获取页面 下拉框并且转换为 Select对象
select = Select(driver.find_element(By.ID, "selectA"))

# 根据索引选择
select.select_by_index(2)

# 根据value 值选择
select.select_by_value("bj")

# 根据 option 文本选择
select.select_by_visible_text("广州")

页面滚动

有些页面数据过多,采用懒加载模式,那么我们要选取一些懒加载元素,就必须触发页面滚动,让元素加载出来。

我们需要使用驱动来执行js的浏览器页面滚动代码来实现。

# 触发调动js代码 x轴不滚动, y轴向下滚动(当y轴滚动超过屏幕时将自动到最底部)
js_tr = 'window.scrollTo(0,10000)'
# 触发调动js代码
driver.execute_script(js_tr)

警告框

<button id="alertAAA" onclick="alert('我是警告框')">我是警告框</button>
driver = webdriver.Chrome()
url = "file:///D:/environment/python-workspace/testPY/index.html"

driver.get(url)

# 模拟一个弹框出现,点击 alterAAA后出现了一个警告框
driver.find_element(By.ID, "alertAAA").click()

# 获取警告框对象
alert = driver.switch_to.alert
print(alert.text)

time.sleep(2)
# 确定
alert.accept()
# 取消
# alert.dismiss()

time.sleep(5)

driver.quit()

Frame切换

需要注意:在一个网页中如果使用了iframe标签嵌套网页,那么对于驱动来讲,只能获取到当前的网页,嵌套的内部网页一般无法去获取里面的元素。那么就需要用到了Frame切换

切换Frame后如果需要外部网页的元素,那么还要再切换回去。

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = "https://mail.qq.com"

driver.get(url)

driver.implicitly_wait(2)

# 原始页面的元素
print(driver.find_element(By.CLASS_NAME, "login_pictures_title").text)
# 切换至内部frame
driver.switch_to.frame("login_frame")
driver.find_element(By.ID, "u").send_keys("100001")

# 切换回原始页面里
driver.switch_to.default_content()
# 原始页面的元素
print(driver.find_element(By.CLASS_NAME, "login_pictures_title").text)

time.sleep(5)

driver.quit()

当然还有 switch_to.parent_frame()方法可回到父级的frame中。

页面窗口切换

浏览器中的多标签页的切换。handle意为控制者,在selenium中,通过一个随机生成的UUID来标识某个窗口。

需要先获取到标签页的句柄 handle

# 获取所有
driver.window_handles
# 获取当前的 handle
driver.current_window_handle

# 切换
driver.switch_to.window(handleName)


########################################实例###########################################
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
url = "https://www.baidu.com"

driver.get(url)
driver.maximize_window()

time.sleep(2)
print(driver.window_handles)

driver.find_element(By.ID, "kw").send_keys("阿卡丽")
driver.find_element(By.ID, "su").click()

driver.implicitly_wait(2)
driver.find_element(By.XPATH, "//*[@id='1']/div[1]/div[1]/div/div[1]/a[1]/img").click()

# 关闭上一个
driver.close()
# 由于现在只剩一个了,直接选择第一个handle即可
driver.switch_to.window(driver.window_handles[0])

driver.find_element(By.XPATH, "//*[@id='srcPic']/img").click()

time.sleep(5)
driver.quit()

截图

# 获取文件截图
driver.get_screenshot_as_file("imgs.png")

# 获取截图二进制数据流 bytes
#driver.get_screenshot_as_png()

Cookie处理

添加Cookie,需要涉及到登录或其他业务必须添加时

driver.add_cookie({"name":"DBUSS", "value":"通过Chrome浏览器工具查看"})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础——连接Xshell7

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

复位理论基础

先收集资料&#xff0c;了解当前常用的基础理论和实现方式 复位 初始化微控制器内部电路 将所有寄存器恢复成默认值确认MCU的工作模式禁止全局中断关闭外设将IO设置为高阻输入状态等待时钟趋于稳定从固定地址取得复位向量并开始执行 造成复位的原因 有多种引起复位的因素&…

客户关系管理挑战:如何保持客户满意度并提高业绩?

当今&#xff0c;各行业市场竞争愈发激烈&#xff0c;对于保持客户满意度并提高业绩是每个企业都面临的挑战。而客户关系管理则是实现这一目标的关键&#xff0c;因为它涉及到与客户的互动和沟通&#xff0c;以及企业提供优质的产品和服务。在本文中&#xff0c;我们将探讨客户…

使用Geth搭建多节点私有链

使用Geth搭建多节点私有链 步骤 1.编辑初始化配置文件genesis.json {"config": {"chainId": 6668,"homesteadBlock": 0,"eip150Block": 0,"eip150Hash": "0x000000000000000000000000000000000000000000000000000000…

JDK下载安装与环境

&#x1f972; &#x1f978; &#x1f90c; &#x1fac0; &#x1fac1; &#x1f977; &#x1f43b;‍❄️&#x1f9a4; &#x1fab6; &#x1f9ad; &#x1fab2; &#x1fab3; &#x1fab0; &#x1fab1; &#x1fab4; &#x1fad0; &#x1fad2; &#x1fad1;…

回暖!“数”说城市烟火气背后

“人间烟火气&#xff0c;最抚凡人心”。在全国各地政策支持以及企业的积极生产运营下&#xff0c;经济、社会、生活各领域正加速回暖&#xff0c;“烟火气”在城市中升腾&#xff0c;信心和希望正在每个人心中燃起。 发展新阶段&#xff0c;高效统筹经济发展和公共安全&#…

JavaEE进阶第六课:SpringBoot配置文件

上篇文章介绍了SpringBoot的创建和使用&#xff0c;这篇文章我们将会介绍SpringBoot配置文件 目录1.配置文件的作用2.配置文件的格式2.1 .properties语法2.1.1.properties的缺点2.2 .yml语法2.2.1优点分析2.2.2配置与读取对象2.2.3配置与读取集合2.2.4补充说明3.设置不同环境的…

陪诊小程序开发|陪诊小程序有哪些功能

陪诊小程序主要就是一款为服务一些无法单独或者很难单独完成就诊流程的人&#xff0c;提供线上下单寻求专业人员陪同就医的一款小程序&#xff0c;陪诊员线上接单&#xff0c;线下为患者提供专业的医疗陪同就医服务。相对于陪诊小程序开发多少钱很多人更想知道陪诊小程序有哪些…

动态规划:leetcode 139.单词拆分、多重背包问题

leetcode 139.单词拆分leetcode 139.单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明&#xff1a;拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1&…

数据库设计规范1

数据库设计规范1 1.所有的表都必须有几个公共字段 这里建有删除标识&#xff0c;代表着我们所有的删除都是软删除。所以我们的删除操作其实是updata 2.id等数字类型的字段&#xff0c;不能知识bigint&#xff0c;应该是bigint unsigned 3.varchar默认长度为32&#xff0c;不…

MTK平台开发入门到精通(Thermal篇)热管理介绍

文章目录 一、热管理组成二、Linux Thermal Framework2.1、thermal_zone 节点2.2、cooling_device 节点三、Thermal zones沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍MTK平台的热管理机制,热管理机制是为了防止模组在高温下工作导致硬件损坏而存在的…

有趣的 Kotlin 0x10:操作符 ..<

操作符 …< ..< 操作符是 Kotlin 在 1.7.20 版本中引入的不包含尾部元素的左闭右开区间操作符。之前我们使用的比较多的操作符可能是 .. 和 until&#xff0c;两者均表示区间&#xff0c;前者是闭区间&#xff0c;后者则表示不包含末端元素的左闭右开区间。 OptIn(Expe…

C++ STL学习之【string类的模拟实现】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 The key is to keep company only with people who uplift you, whose presence calls forth your best. 关键是只与那些提升你的人在一起&#xff0c…

机器学习与目标检测作业(数组相加:形状需要满足哪些条件)

机器学习与目标检测&#xff08;数组相加:形状需要满足哪些条件&#xff09;机器学习与目标检测&#xff08;数组相加:形状需要满足哪些条件&#xff09;一、形状相同1.1、形状相同示例程序二、符合广播机制2.1、符合广播机制的描述2.2、符合广播机制的示例程序机器学习与目标检…

模电学习9. MOS管使用入门

模电学习9. MOS管使用入门一、mos管理简介1. 简介2. mos管理的特点3. MOS管的工作状态&#xff08;1&#xff09;放大功能&#xff08;2&#xff09;截止区&#xff08;3&#xff09;饱和区3. Mos管的分类&#xff08;1&#xff09;按照工作模式分类&#xff1a;&#xff08;2&…

25. K 个一组翻转链表

题目链接&#xff1a;https://leetcode.cn/problems/reverse-nodes-in-k-group/解题思路&#xff1a;先解决怎么翻转一段链表&#xff0c;然后在解决这道题。翻转一个链表reverse(head,tail)比如将链表1->2->3->4进行翻转&#xff0c;则翻转后的链表为&#xff1a;1&l…

Guitar Pro8免费吉他曲谱mySongBook

每周都会发布新的谱子&#xff0c;目前已有有数千首歌曲可供选择&#xff0c;在谱库中&#xff0c;您能找到 Guns N Roses&#xff0c;Miles Davis&#xff0c;Ed Sheeran 等人的经典曲目。开头我们先做一个小实验&#xff1a;现在打开你电脑里存放曲谱的文件夹&#xff0c;里面…

记录每日LeetCode 2373.矩阵中的局部最大值 Java实现

题目描述&#xff1a; 给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal &#xff0c;并满足&#xff1a; maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说&#xff0c;我们希…

基于Linux_ARM板的驱动烧写及连接、挂载详细过程(附带驱动程序)

文章目录前言一、搭建nfs服务二、ARM板的硬件连接三、putty连接四、挂载共享文件夹五、烧写驱动程序六、驱动程序示例前言 本文操作环境&#xff1a;Ubuntu14.04、GEC6818 这里为似懂非懂的朋友简单叙述该文章的具体操作由来&#xff0c;我们的主要目的是将写好的驱动程序烧进…

教你如何搭建设备-报修管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建设备-报修管理。1.2、应用场景对于故障的设备发起报修流程&#xff0c;指派人员维修&#xff0c;可查看设备维修记录。2、设置方法2.1、表单搭建1&#xff09;新建表单【设备档案-履历表】&#xff0c;字段设置如下&#xf…