UI自动化常用操作

发布时间 2023-06-26 13:32:52作者: zhupan96

浏览器常用操作

from selenium import webdriver
import time

driver = webdriver.Chrome()

最大化浏览器

driver.maximize_window()

隐式等待

driver.implicitly_wait(5)    # 秒
# 隐式等待为全局设置(只需要设置一次,就会作用于所有元素)

强制等待

time.sleep(2)    # 秒

刷新页面

driver.refresh()

关闭当前窗口

driver.close()
# 当前窗口:所谓的当前窗口是指实例化浏览器驱动之后第一个打开的窗口,实例化的浏览器驱动对象(driver)只能存一个页面。

关闭浏览器

driver.quit()

获取当前页面标题

driver.title

获取当前页面地址

driver.current_url

元素常用操作

element = driver.find_element(By.XPATH, "//*[text()='验证码']")

模拟输入

element.send_keys('value')

模拟点击

element.click()

清除文本

element.clear()

获取图片规格大小

print(element.size)
# 场景:首页各种楼层展示的图片规格大小需要验证

获取元素的文本

print(element.text)
# 场景:在搜索商品之后我们要验证价格和商品名称信息,那么就需要获取元素对应的文本信息

获取元素的属性值

print(element.get_attribute("href"))
# 场景:在页面很多商品图片或banner都是一些带跳转超链接,需要通过获取其跳转的属性地址来判断是否正确

判断元素是否可见

element.is_displayed()
# 场景:网站上部分信息需要根据当前登录的用户等级来分内容显示,那么这些限制显示的内容可能就是通过不可见来设置

判断元素是否可用

element.is_enabled()
# 场景:在部分重要网站上注册时的时候如果不勾选同意协议,则无法点击注册按钮

判断元素是否选中

element.is_selected()
# 场景:在注册时,协议经常是一种默认勾选的状态,需要制定的,所以我们也需要进行验证

鼠标操作

# 导包
from selenium.webdriver import ActionChains
# 实例化鼠标对象
action = ActionChains(driver)
# 调用鼠标方法

# 模拟鼠标右键点击效果
action.context_click(element)
# element表示所要右击的元素对象通过元素定位的方式找回来
# 场景:在web项目中有很多功能需要右击之后才会以菜单的形式展示出来,那么需要通过右击交互才能进行操作

# 模拟鼠标悬停效果
action.move_to_element(element)
# element表示所要悬停的元素对象,通过元素定位的方法找回来
# 场景:例如电商首页商品分类列表鼠标悬停时的二级类

# 执行鼠标操作
action.perform()
# 必须调用perform()方法才能执行鼠标事件

double_click(element) # 双击 --> 模拟鼠标双击效果

drag_and_drop(source, target) # 拖动 --> 模拟鼠标拖动效果
# 源元素   source = driver.find_element_by_id(xxx)
# 目标元素 target = driver.find_element_by_id(xxx)
# 调用方法 action.drag_and_drop(source, target).perform()

键盘操作

# 模拟输入字符串
# 输入:element.send_keys("字符串")
# 1. send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
# 2. send_keys(Keys.SPACE) 空格键(Space)
# 3. send_keys(Keys.TAB) 制表键(Tab)
# 4. send_keys(Keys.ESCAPE) 回退键(Esc)
# 5. send_keys(Keys.ENTER) 回车键(Enter)
# 6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
# 7. send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

# 模拟单个特殊按键
# 导包:
from selenium.webdriver.common.keys import Keys
#格式:
element.send_keys(Keys.按键属性)
 

# 模拟组合按键
# 导包:
from selenium.webdriver.common.keys import Keys
# 格式:
element.send_keys(Keys.按键属性,"字母键")

窗口截图

# 作用:在手工测试中,提交bug时我们一般会将错误的场景截图并且提交到禅道,方便开发进行问题定位,对于自动化来讲,出现问题的时候我们也需要分析对应错误的地方,所以有了截图之后更加容易错误定位错误。
# 方法:
driver.get_screenshot_as_file(filepath)
# 注意点:
  # 1、文件名必须是以图片结尾的后缀 .png .jpg
  # 2、filepath表示图片文件的完整路径名包含目录和文件名,目录必须保证是真实存在的,代表着所要存储的目录必须先手工创建好。
# 处理图片重名的方法
file_name = "./test-{}.png".format(time.strftime("%Y%m%d%H%M%S"))
# 格式化字符串一定要注意大小写
driver.get_screenshot_as_file(file_name)

下拉选择框

# 操作方法:
# 1. select_by_index(index) --> 根据option索引来定位,从0开始
# 2. select_by_value(value) --> 根据option属性 value值来定位
# 3. select_by_visible_text(text) --> 根据option显示文本来定位

#导包
from selenium.webdriver.support.select import Select

select = Select(driver.find_element(By.XPATH, "//*[text()='sdjhsdh']"))
select.select_by_index(2) # 根据索引实现
select.select_by_value("sh") # 根据value属性实现
select.select_by_visible_text("A北京") # 根据文本内容实现

弹出框

说明:Selenium中对处理弹出框的操作,有专用的处理方法;并且处理的方法都一样
1. 获取弹出框对象 ...统一获取方式
alert = driver.switch_to.alert
2. 调用
alert.text --> 返回alert/confirm/prompt中的文字信息
alert.accept() --> 接受对话框选项
alert.dismiss() --> 取消对话框选项
网页中常用的弹出框有三种
1. alert 警告框
2. confirm 确认框
3. prompt 提示框

# 定位alerta按钮
driver.find_element(By.XPATH, "//*[text()='sdjhsdh']").click()
# 获取警告框
alert = driver.switch_to.alert
# 打印警告框文本
print(alert.text)
# 接受警告框
alert.accept()
# 取消警告框
alert.dismiss()

滚动条操作

说明:selenium中并没有直接提供操作滚动条的方法,但是它提供了可执行JavaScript脚本的方法,所以我们可以通过JavaScript脚本来达到操作滚动条的目的。

  1. 设置JavaScript脚本控制滚动条

js = "window.scrollTo(0,1000)"

(0:左边距;1000:上边距;单位像素)

  1. selenium调用执行JavaScript脚本的方法

driver.execute_script(js)

# 最底层
js1 = "window.scrollTo(0,10000)"
driver.execute_script(js1)
# 最顶层
js2 = "window.scrollTo(0,0)"
driver.execute_script(js2)

frame切换

frame:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素;

形式一:[了解]

形式二:

# 说明:在Selenium中封装了如何切换frame框架的方法
# 方法:
driver.switch_to.frame(frame_reference) # --> 切换到指定frame的方法
# frame_reference:可以为frame框架的name、id或者定位到的frame元素
driver.switch_to.default_content() # --> 恢复默认页面方法
# 在frame中操作其他页面,必须先回到默认页面,才能进一步操作

多窗口切换

说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;
句柄:英文handle,窗口的唯一识别码
方法:
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口

cookie

说明:Selenium中对cookie操作提供相应的方法

方法:

\1. get_cookie(name) --> 获取指定cookie

name:为cookie的名称

\2. get_cookies() --> 获取本网站所有本地cookies

\3. add_cookie(cookie_dict) --> 添加cookie

cookie_dict:一个字典对象,必选的键包括:"name" and "value"

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.add_cookie({'name':'BDUSS','value':'根据实际填写'})
time.sleep(3)
driver.refresh()
time.sleep(3)
driver.quit()

验证码

安装ddddocr: install ddddocr

# 1.导包
from selenium.webdriver.common.by import By
import ddddocr
from selenium import webdriver
import time


driver = webdriver.Chrome()
driver.maximize_window()  # 最大化窗口
driver.implicitly_wait(5)  # 隐式等待
# b.打开测试地址
driver.get('http://192.168.117.43/kcportal/#/login')
# c.实现登陆
driver.find_element(By.CLASS_NAME, "login-immediately").click()  # 点击首页登陆
driver.find_element(By.XPATH, "//form/div[1]/div/div/input").send_keys("kcczy1111")
driver.find_element(By.XPATH, "//form/div[2]/div/div/input").send_keys("88888888a")
# 处理验证码
# 定位验证码
ele_codeplc = driver.find_element(By.XPATH, "//form/div[3]/div/div/div[2]/img")
# 实例化对象
ocr = ddddocr.DdddOcr()
# 处理验证码图片,并生成字符串
code_text = ocr.classification(ele_codeplc.screenshot_as_png)
# 输入验证码
driver.find_element(By.XPATH, "//form/div[3]/div/div/input").send_keys(code_text)
time.sleep(5)
driver.find_element(By.CLASS_NAME, "login-submit").click()  # 点击首页登陆
time.sleep(5)
# 输入手机验证码
driver.find_element(By.XPATH, "//*[@placeholder='请输入验证码']").send_keys(1234)
# 点击确定
driver.find_element(By.CLASS_NAME, 'ep-button--primary').click()
time.sleep(5)

# 关闭浏览器
driver.quit()

"""
# 处理验证码  python版本控制在3.7到3.9
import ddddocr
定位验证码图片
ele_codeplc = driver.find_element(By.XPATH, "//form/div[3]/div/div/div[2]/img")
# 保存图片(不推荐写,还要删除,麻烦)
# with open('codepic.png', mode='wb') as f:
#     f.write(ele_codeplc.screenshot_as_png)

# 处理成字符串了
# ocr = ddddocr.DdddOcr()
# code_text = ocr.classification(ele_codeplc.screenshot_as_png)

code_text = ddddocr.DdddOcr().classification(ele_codeplc.screenshot_as_png)
# 输入处理的数据
driver.find_element(By.XPATH, "//form/div[3]/div/div/div[2]/img").send_keys( code_text)
"""