操作浏览器常用方法
1. maximize_window() 最大化浏览器窗口 --> 模拟浏览器最大化按钮
2. set_window_size(width, height) 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)
3. set_window_position(x, y) 设置浏览器窗口位置 --> 设置浏览器位置
4. back() 后退 --> 模拟浏览器后退按钮
5. forward() 前进 --> 模拟浏览器前进按钮
6. refresh() 刷新 --> 模拟浏览器F5刷新
7. close() 关闭当前窗口 --> 模拟点击浏览器关闭按钮
8. quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
9. title 获取页面title
10. current_url 获取当前页面URL
获取元素信息的常用方法
1. size 返回元素大小
2. text 获取元素的文本
3. get_attribute("xxx") 获取属性值,传递的参数为元素的属性名
4. is_displayed() 判断元素是否可见
5. is_enabled() 判断元素是否可用
6. is_selected() 判断元素是否选中,用来检查复选框或单选按钮是否被选中
提示:
size、text:为属性,调用时无括号;如:xxx.size
鼠标操作常用方法
说明:在Selenium中将操作鼠标的方法封装在ActionChains类中
实例化对象:
action = ActionChains(driver)
方法:
1. context_click(element) 右击 --> 模拟鼠标右键点击效果
2. double_click(element) 双击 --> 模拟鼠标双击效果
3. 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()
4. move_to_element(element) 悬停 --> 模拟鼠标悬停效果
5. perform() 执行 --> 此方法用来执行以上所有鼠标操作
说明:在ActionChains类中所有提供的鼠标事件方法,在调用的时候所有的行为都存储在ActionChains对
象中,
而perform()方法就是真正去执行所有的鼠标事件。
强调:必须调用perform()方法才能执行鼠标事件
为了更好的学习其他方法,我们先学习perform()执行方法,因为所有的方法都需要执行才能生效
鼠标右键案例:
导包:from selenium.webdriver.common.action_chains import ActionChains
实例化ActionChains对象:action = ActionChains(driver)
调用右键方法:action.context_click(element)
执行:action.perform()
键盘操作常用方法
导包:from selenium.webdriver.common.keys import 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)
示例代码:
# 定位用户名 element = driver.find_element_by_id("userA")
# 输入用户名 element.send_keys("admin1")
# 删除1 element.send_keys(Keys.BACK_SPACE)
# 全选 element.send_keys(Keys.CONTROL, 'a')
# 复制 element.send_keys(Keys.CONTROL, 'c') # 粘贴 driver.find_element_by_id('passwordA').send_keys(Keys.CONTROL, 'v')
元素等待
隐式等待
概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元 素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出元素 不存在的异常 NoSuchElementException
实现方式:
方法:driver.implicitly_wait(timeout)
(timeout:为等待最大时长,单位:秒)
说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)
显示等待
概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出超时异常 TimeoutException 。
实现方式:
1. 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait
2. WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver:浏览器驱动对象
2). timeout:超时的时长,单位:秒
3). poll_frequency:检测间隔时间,默认为0.5秒
3. 调用方法 until(method):直到...时
1). method:函数名称,该函数用来实现对元素的定位
2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id("userA")
4. element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA") )python
显示等待案例:
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Firefox()
driver.get("file:///D:/webAutoTest/page/注册A.html")element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA")) element.send_keys("admin")
time.sleep(3)
driver.quit()
显式与隐式区别
1. 作用域:隐式为全局元素,显式等待为单个元素有效
2. 使用方法:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中
3. 达到最大超时时长后抛出的异常不同:隐式为NoSuchElementException,显式等待为TimeoutException
下拉框操作
思路:先定位到要操作的option元素,然后执行点击操作
select类
说明:Select类是Selenium为操作select标签特殊封装的。
实例化对象:
select = Select(element)
element: <select>标签对应的元素,通过元素定位方式获取,
例如:driver.find_element_by_id("selectA")
操作方法:
1. select_by_index(index) --> 根据option索引来定位,从0开始
2. select_by_value(value) --> 根据option属性 value值来定位
3. select_by_visible_text(text) --> 根据option显示文本来定位
select类实现步骤分析
1. 导包 Select类 --> from selenium.webdriver.support.select import Select
2. 实例化Select类 select = Select(driver.find_element_by_id("selectA"))
3. 调用方法:select.select_by_index(index)
示例代码
from selenium.webdriver.support.select
import Select
select = Select(driver.find_element_by_id("selectA"))
select.select_by_index(2) # 根据索引实现
select.select_by_value("sh") # 根据value属性实现
select.select_by_visible_text("A北京") # 根据文本内容实现
弹出框操作
网页中常用的弹出框有三种
1. alert 警告框
2. confirm 确认框
3. prompt 提示框
弹出框处理方法
说明:Selenium中对处理弹出框的操作,有专用的处理方法;并且处理的方法都一样
1. 获取弹出框对象 alert = driver.switch_to.alert
2. 调用
alert.text --> 返回
alert/confirm/prompt中的文字信息
alert.accept() --> 接受对话框选项
alert.dismiss() --> 取消对话框选项
示例代码
# 定位alerta按钮
driver.find_element_by_id("alerta").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:上边距;单位像素)
2. 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切换方法
说明:在Selenium中封装了如何切换frame框架的方法
方法:
1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢复默认页面方法
案例
打开‘注册实例.html’页面,完成以下操作
1). 填写主页面的注册信息
2). 填写注册页面A中的注册信息
3). 填写注册页面B中的注册信息
1. 完成主页面注册信息;
2. 调用frame切换方法(switch_to.frame("myframe1"))切换到注册用户A框架中
3. 调用恢复默认页面方法(switch_to.default_content())
4. 调用frame切换方法(switch_to.frame("myframe2"))切换到注册用户B框架中
浏览器窗口切换
说明:在Selenium中封装了获取当前窗口句柄、获取所有窗口句柄和切换到指定句柄窗口的方法;
句柄:英文handle,窗口的唯一识别码
方法:
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
窗口截图
说明:
在Selenium中,提供了截图方法,我们只需要调用即可
方法:
driver.get_screenshot_as_file(imgpath)
imgpath:图片保存路径
代码实例:
driver.get_screenshot_as_file("./img/img01.jpg")
验证码的处理方式
说明:Selenium中并没有对验证码处理的方法,在这里我们介绍一下针对验证码的几种常用处理方式
方式:
1). 去掉验证码
(测试环境下-采用)
2). 设置万能验证码
(生产环境和测试环境下-采用)
3). 验证码识别技术
(通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie
(通过记录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"
案例
BDUSS是登录百度后的唯一身份凭证(*.baidu.com),拿到BDUSS就等于拿到帐号的控制权, 通行贴吧、知道、百科、文库、空间、百度云等百度主要产品。
1. 登录baidu,登录成功后抓取 (BDUSS)
2. 使用add_cookie()方法,添加 (BDUSS)键和值
3. 调用刷新方法 driver.refresh()
示例代码
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()