浏览器常用操作
from selenium import webdriver
import timedriver = 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脚本来达到操作滚动条的目的。
- 设置JavaScript脚本控制滚动条
js = "window.scrollTo(0,1000)"
(0:左边距;1000:上边距;单位像素)
- 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)
"""