当前位置: 首页 > article >正文

web自动化学习笔记

目录

  • 一、web自动化测试环境搭建
  • 二、web自动化测试第一个脚本
  • 三、selenium 8种定位方式
    • 3.1、通过id定位
    • 3.2、通过name定位
    • 3.3、通过tag_name(标签名)定位
    • 3.4、通过class值进行定位
    • 3.5、通过链接文本定位
    • 3.6、通过部分链接文本定位
    • 3.7、通过xpath定位
    • 3.8、通过css选择器定位
    • 3.9、定位动态元素
    • 3.10、定位带空格的复合class属性
  • 三、元素常用操作
  • 四、页面常用操作
    • 4.1、浏览器操作
    • 4.2、键盘操作 keys
    • 4.3、鼠标操作 ActionChains
    • 4.4、JS操作
      • 4.4.1、日期控件
      • 4.4.2、滚动条
    • 4.5、下拉列表
    • 4.6、弹出框、警告框
    • 4.7、文件上传
  • 五、三大等待
    • 5.1、强制等待 time.sleep()
    • 5.2、智能等待(隐式等待) driver.implicitly_wait()
    • 5.3、显示等待
  • 六、三大切换
    • 6.1、窗口切换
    • 6.2、切换iframe或frame
    • 6.3、
  • 七、常用方法封装

一、web自动化测试环境搭建

1、安装selenium(第三方库)
cmd命令:pip install selenium
2、安装浏览器(谷歌浏览器)
常见浏览器:chrome浏览器、Firefox浏览器
3、安装浏览器驱动
谷歌浏览器驱动:chromedriver.exe
Firefox浏览器驱动:geckodirver.exe
特别注意事项:下载驱动版本必须与浏览器的版本一致

二、web自动化测试第一个脚本

from selenium import  webdriver
# 创建浏览器对象
driver = webdriver.Chrome()
# 访问百度
driver.get("https://www.baidu.com")

执行后,自动访问了百度

三、selenium 8种定位方式

3.1、通过id定位

driver.find_element_by_id()

示例:
①、F12获取输入框元素的id值

在这里插入图片描述
②、执行代码

from selenium import  webdriver
import  time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位搜索框
el_select = driver.find_element_by_id("kw")
# 输入csdn
el_select.send_keys("csdn")

③、执行后效果
在这里插入图片描述

3.2、通过name定位

driver.find_element_by_name()

示例:还是百度的搜索框

from selenium import  webdriver
import  time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位搜索框
el_select = driver.find_element_by_name("wd")
# 输入csdn
el_select.send_keys("csdn")

3.3、通过tag_name(标签名)定位

该元素要么唯一,要么第一位,一般不用此方法

el_select = driver.find_element_by_tag_name("input")

3.4、通过class值进行定位

driver.find_element_by_class_name()

示例:还是百度的搜索框

from selenium import  webdriver
import  time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位搜索框
el_select = driver.find_element_by_class_name("s_ipt")
# 输入csdn
el_select.send_keys("csdn")

3.5、通过链接文本定位

driver.find_element_by_link_text()

示例:
①、例如想定位百度网页的新闻,并点击
在这里插入图片描述
②、执行代码

from selenium import  webdriver
import  time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位新闻
el_click = driver.find_element_by_link_text("新闻")
# 点击新闻
el_click.click()

3.6、通过部分链接文本定位

driver.find_element_by_partial_link_text()

示例:还是定位百度网页的新闻,并点击

from selenium import  webdriver
import  time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 强制等待2s
time.sleep(2)
# 定位含有新的链接(新闻)
el_click = driver.find_element_by_partial_link_text("新")
# 点击
el_click.click()

3.7、通过xpath定位

driver.find_elements_by_xpath()

3.8、通过css选择器定位

driver.find_element_by_css_selector()

3.9、定位动态元素

如163邮箱登录iframe标签中id值末尾是一串动态的数字
在这里插入图片描述

①、contains 包含某字符串的元素

//标签名[contains(@元素名, '元素值')]
el_iframe = driver.find_element_by_xpath('//*[contains(@id,"x-URS-iframe")]')

②、starts-with 以某字符串开始的元素

//标签名[starts-with(@元素名, '元素值')]
el = driver.find_element_by_xpath('//*[starts-with(@id,"x-URS-iframe")]')

③、ends-with 以某字符串结尾的元素

//标签名[ends-with(@元素名, '元素值')]
el = driver.find_element_by_xpath('//*[ends-with(@id,"xxxx")]')

3.10、定位带空格的复合class属性

下图可以看出class值有空格,如果直接用class_name的方式定位,会报错,此时可以采用css_selector方式定位

driver.find_element_by_css_selector('[class="title-content  c-link c-font-medium c-line-clamp1"]')

在这里插入图片描述

三、元素常用操作

方法或属性说明
el.send_keys()输入数据
el.clear()清除数据
el.text获取文本内容
el.get_attribute获取属性值
el.submit()提交

示例代码:为了看清效果,加了好多等待😂

from selenium import  webdriver
import time
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 定位搜索框
el = driver.find_element_by_id("kw")
# 打印元素的属性
print(el.get_attribute('id'))
time.sleep(1)
# 输入csdn
el.send_keys("csdn")
time.sleep(2)
# 清除元素的内容
el.clear()
time.sleep(1)
# 刷新浏览器
driver.refresh()
time.sleep(1)
# 定位新闻
el2 = driver.find_element_by_link_text("新闻")
# 打印元素的文本
print(el2.text)

四、页面常用操作

4.1、浏览器操作

方法说明
get(url)浏览器发送请求
maximize_window()浏览器最大化
back()浏览器后退
forward()浏览器前进
refresh()刷新浏览器
close()关闭当前页面
quit()关闭浏览器

示例代码:

from selenium import  webdriver
import time
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 访问58
url_58 = "https://tj.58.com/"
driver.get(url_58)
# 页面后退
driver.back()
time.sleep(1)
# 页面前进
driver.forward()
time.sleep(1)
# 刷新页面
driver.refresh()
time.sleep(1)
# 关闭浏览器
driver.quit()

close()场景

from selenium import  webdriver
import time
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 定位新闻
el = driver.find_element_by_link_text("新闻")
# 点击新闻
el.click()
time.sleep(1)
# 打印当前页面url
print(driver.current_url)
# 关闭当前页面
driver.close()

上述代码,虽然点击新闻后到了新页面,但通过driver.current_url可以看出当前页面还是百度首页,所以关闭当前页面操作关闭的是百度首页,执行后只剩下新闻页面

4.2、键盘操作 keys

需要先导包

from selenium.webdriver.common.keys import Keys
方法说明
send_keys(Keys.CONTROL,“a”)全选
send_keys(Keys.CONTROL,“c”)复制
send_keys(Keys.CONTROL,“x”)剪切
send_keys(Keys.CONTROL,“v”)粘贴

代码示例:

from selenium import  webdriver
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 访问百度
url_bd = "https://www.baidu.com"
driver.get(url_bd)
# 浏览器最大化
driver.maximize_window()
time.sleep(2)
# 定位搜索框
el = driver.find_element_by_id("kw")
# 输入csdn
el.send_keys("csdn")
# ctrl+a
el.send_keys(Keys.CONTROL,"a")
time.sleep(1)
# ctrl+x
el.send_keys(Keys.CONTROL,"x")
time.sleep(1)
# ctrl+v
el.send_keys(Keys.CONTROL,"v")
time.sleep(1)
# ctrl+c
el.send_keys(Keys.CONTROL,"c")

4.3、鼠标操作 ActionChains

需要先导包

from selenium.webdriver import ActionChains
方法说明
ActionChains(driver).context_click(el).perform()点击鼠标右键,el为元素
ActionChains(driver).double_click(el).perform()鼠标双击
ActionChains(driver).move_to_element(el).perform()鼠标悬停

4.4、JS操作

4.4.1、日期控件

4.4.2、滚动条

# 通过JavaScript设置浏览器窗口的滚动条位置
js1 = "window.scrollTo(100, 450);"
driver.execute_script(js1)
# 实现滚动条从顶部到底部
js2 = "scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js2)
# 实现滚动条从浏览器底部到顶部
js3 = "scrollTo(document.body.scrollHeight,0)"
driver.execute_script(js3)
# 操作哪个元素,滚动条移动到元素附近(元素与页面的顶部对齐,元素与页面的底部对齐)
el = driver.find_element_by_xpath('//*[@id="3"]/h3/a/em')
# 元素与页面的底部对齐
js4 = "arguments[0].scrollIntoView(false);"
driver.execute_script(js4, el)
# 元素与页面的顶部对齐
js5 = "arguments[0].scrollIntoView(true);"
driver.execute_script(js5, el)

示例场景:

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 设置浏览器窗口大小,以保证能看到横向和纵向滑动条
driver.set_window_size(800, 600)
# 定位输入框并输入selenium
driver.find_element_by_id("kw").send_keys("selenium")
# 点击百度一下按钮
driver.find_element_by_id("su").click()
time.sleep(2)
# 定位元素:selenium安装教程 - 相关博客 - 开发者搜索
el = driver.find_element_by_xpath('//*[@id="3"]/h3/a/em')
# 滑动到元素与页面的底部对齐
js4 = "arguments[0].scrollIntoView(false);"
driver.execute_script(js4, el)
# 关闭浏览器
driver.quit()

4.5、下拉列表

F12查看元素有select标签,说明可以使用下拉l列表的方法,这里使用的是自己本地的一个html文件
在这里插入图片描述
html文件:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
</head>
<body>
<p>今天吃什么</p>
<select name="eatwhate" id="eathow">
    <option value="gbjd">宫保鸡丁</option>
    <option value="mlt">麻辣烫</option>
    <option value="yxrs">鱼香肉丝</option>
    <option value="gbr">锅包肉</option>
<option value="hgj">火锅鸡</option>
</select>
</body>
</html>

先导入:

from selenium.webdriver.support.select import Select

# 创建对象
selsub = Select(下拉菜单元素)
方法说明
selsub.select_by_value()通过value值选择
selsub.select_by_visible_text()通过选项名称选择
selsub.select_by_index()通过选项索引值选择,从0开始

示例代码

from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
driver = webdriver.Chrome()
# 访问本地的html文件地址
driver.get('file:///C:/Users/Administrator/Desktop/%E4%B8%8B%E6%8B%89%E6%A1%86.html')
driver.maximize_window()
el = driver.find_element_by_xpath('//*[@id="eathow"]')
# 创建Select对象
selsub = Select(el)
# 通过value值选择
selsub.select_by_value('yxrs')
time.sleep(1)
# 通过选项名称选择
selsub.select_by_visible_text('火锅鸡')
time.sleep(1)
# 通过选项索引值选择,从0开始
selsub.select_by_index(3)
time.sleep(1)
driver.quit()

4.6、弹出框、警告框

4.7、文件上传

1、input标签

F12查看元素,如果是通过input标签实现的上传功能,可以通过输入的方法即通过send_keys()指定文件路径实现文件上传
在这里插入图片描述
示例代码:

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get(r"file:///C:/Users/Administrator/Desktop/test.html")
time.sleep(4)
# 定位选择文件元素
el_file=driver.find_element_by_id("f1")
# 输入文件路径
el_file.send_keys(r"C:\Users\Administrator\Pictures\测试图片\滑稽.jpg")

test.html文件代码参考:

<form action="/upload" method="post" enctype="multipart/form-data">
	姓名: <input type="text" name="username"><br>
    年龄: <input type="text" name="age"><br>
    头像: <input type="file" name="image" id="f1"><br>
    <input type="submit" value="提交">
</form>

.2、非input标签

①、使用第三方库pywin32

安装命令:pip install pywin32

from selenium import webdriver
import win32con
import win32gui
from selenium.webdriver import ActionChains
import time
import os

driver = webdriver.Chrome()
driver.get(r"file:///C:/Users/Administrator/Desktop/test.html")
time.sleep(4)
# 定位选择文件元素
el_file=driver.find_element_by_id("f1")
# 点击选择文件
ActionChains(driver).move_to_element(el_file).click().perform()

def upload(filePath, browser_type="Chrome"):
    if browser_type == "Chrome":
        title = "打开"
    else:
        title = "文件上传"
    # 根据spy++工具判断需要上传文件的窗口为几级窗口,输入文件路径的文本框有四级目录:#32770‐ComboBoxEx32 ‐ComboBox ‐Edit
    # 定位一级窗口 ‘打开’,即弹出的Windows界面
    dialog = win32gui.FindWindow("#32770", title)
    # 二级窗口
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)
    # 三级窗口
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None)
    # 定位到四级窗口,文件名输入框
    edit = win32gui.FindWindowEx(ComboBox, 0, "Edit", None)
    # 定位打开按钮,打开按钮只有两级目录:#32770‐Button 四级
    button = win32gui.FindWindowEx(dialog, 0, "Button", None)
    # 判断传参filePath路径是否存在
    if os.path.exists(filePath):
        # 文件名编辑框中输入文件路径
        win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)
        time.sleep(2)
        # 点击打开按钮
        win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
    else:
        # 抛出异常
        raise(filePath + "文件不存在")


filepath = r"C:\Users\Administrator\Pictures\测试图片\滑稽.jpg"
time.sleep(5)
# 调用upload方法并传入参数
upload(filePath=filepath)
print("文件上传成功")
time.sleep(5)
driver.quit()


②、第三方工具pyautogui

安装: pip install pyautogui

五、三大等待

5.1、强制等待 time.sleep()

使用时需先导包

import time

5.2、智能等待(隐式等待) driver.implicitly_wait()

给页面上所有的元素设置全局等待时间,只要在设置的时间范围内找到了元素,就会执行下一个代码,设置最多等待的时间

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(20)
url = 'https://www.baidu.com/'
driver.get(url)

5.3、显示等待

等待当前需要操作的元素 基于多种条件+等待元素
多种条件:等待元素可见?等待url跳转为xxx?等待新窗口出现?很多场景条件

from selenium import webdriver
# 导入By
from selenium.webdriver.common.by import By
# 导入webdriver等待类
from selenium.webdriver.support.ui import WebDriverWait
# 导入预期条件设置类
from selenium.webdriver.support import expected_conditions as EC
# 创建一个浏览器
driver = webdriver.Chrome()
# 访问百度
url = 'http://www.baidu.com'
driver.get(url)


# 浏览器总共等待10秒,在10秒内,每隔0.5秒去使用id的方式定位一下元素,如果定位到,就结束等待,如果定位不到同时没有大于10秒,则继续等待
el = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,'lg')))

以显示等待为主,以强制等待为辅

六、三大切换

6.1、窗口切换

在页面点击某个链接后,会再打开一个标签页,想在新标签页上进行操作,需要先切换窗口,句柄是窗口的唯一标识,所以只需要切换句柄,就能到对应的标签页进行操作

# 获取窗口句柄列表
wins = driver.window_handles
# 切换到对应窗口
driver.switch_to.window(wins[0])

代码示例:

from selenium import webdriver
import time
# 创建一个浏览器对象
driver = webdriver.Chrome()
# 访问58
url = "https://tj.58.com/"
driver.get(url)
el = driver.find_element_by_link_text("租房")
# 打印当前浏览器句柄
print("点击之前的浏览器句柄是:", driver.window_handles)
print("点击之前的url地址是:", driver.current_url)
el.click()
print("点击之后的浏览器句柄是:", driver.window_handles)
print("点击之后的url地址是:", driver.current_url)
time.sleep(1)
wins = driver.window_handles
# 切换到之前的窗口
driver.switch_to.window(wins[0])

6.2、切换iframe或frame

方法说明
driver.switch_to.frame(a)切换框架,其中a可以是frame元素的name值、id值、索引值或 frame 对应的元素对象
driver.switch_to.default_content()切换到最外层框架
driver.switch_to.parent_frame()切换到上一层框架

有时候元素定位不到,可能是在iframe框架中,需要先切换到框架内,在进行定位,例如163邮箱登录页面,账号框和密码框以及登录按钮等都在iframe标签内
在这里插入图片描述

代码示例:

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 打开163邮箱
driver.get('http://mail.163.com/')
# 浏览器最大化
driver.maximize_window()
time.sleep(5)
# 定位登录框对应的iframe元素
el_iframe = driver.find_element_by_xpath('//*[contains(@id,"x-URS-iframe")]')
# 切换到iframe中
driver.switch_to.frame(el_iframe)
# 定位账号输入框
email = driver.find_element_by_name('email')
# 输入邮箱账号
email.send_keys('ceshi@163.com')
# 定位密码输入框
password = driver.find_element_by_name('password')
# 输入密码
password.send_keys('123456')
# 定位登录按钮
login_btn = driver.find_element_by_id('dologin')
# 点击登陆按钮
login_btn.click()
time.sleep(3)

6.3、

七、常用方法封装


http://www.kler.cn/news/315348.html

相关文章:

  • K8s 之控制器的定义及详细调用案例
  • SpringBoot 整合 Caffeine 实现本地缓存
  • UDP_SOCKET编程实现
  • 行阶梯形矩阵的定义,通过正例和反例说明如何判断一个矩阵是不是行阶梯形矩阵
  • 9月22日,每日信息差
  • 基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统
  • 基于Python+SQLite的课程管理系统
  • Spring boot中常用注解解释
  • 汽车焊机数据通信:Profinet转Canopen网关的神奇连接
  • 新160个crackme - 062-syllogism-crackme1
  • GlusterFS 分布式文件系统
  • 初识 performance_schema:轻松掌握MySQL性能监控
  • 基于深度学习的因果关系建模
  • [论文笔记]MRRNET
  • 树和二叉树的概念以及结构
  • 关于IT行业
  • 智慧火灾应急救援航拍检测数据集(无人机视角)
  • 【编程底层原理】Java对象头的详细结构、锁机制及其优化技术,以及逃逸分析和JIT技术在性能优化中的作用
  • 无损转换:严选4个视频mkv转mp4格式的方法
  • Python青少年简明教程目录
  • MySQL 数据库备份与恢复详解
  • 1042 Shuffling Machine,1050 String Subtractio
  • uniapp自定义Tabbar教程
  • pg入门18—如何使用pg gis
  • 大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元
  • 绑定变量对于SQL性能的影响
  • Python练习宝典:Day 1 - 选择题 - 基础知识
  • Go搭建TcpSocket服务器
  • 华润电力最新校招社招润择认知能力测评:逻辑推理数字计算语言理解高分攻略
  • K8s容器运行时,移除Dockershim后存在哪些疑惑?