selenium的使用
selenium
一、自动化测试
1.1 认识自动化测试
让程序或工具代替人为对程序功能验证的过程
1.2 自动化适用场景
- 回归测试
- 压力测试
- 兼容性(1. 浏览器、2. 分辨率 3. 操作系统)
1.3 自动化测试优点
- 在最短时间内运行最多的bug
- 脚本重复运行
- 减少人为错误
- 克服手工测试局限性(图片大小)
1.4 自动化测试误区
- 自动化测试比手工厉害
- 自动化测试比手工发现更多bug
- 自动化测试可以完全替代手工测试
- 软件所有功能都适合自动化测试
1.5 自动化测试分类
- Web自动化测试
- 移动自动化测试(app自动化)
- 接口自动化(工具、代码)
- 单元测试
1.6 selenium的特点
- 开源、免费
- 跨平台(Linux windows mac)
- 支持多浏览器:谷歌 火狐 IE
- 支持多语言:python、java…等等
- 成熟稳定:已经被 谷歌、百度大型公司广泛使用
- 功能强大:支持商业化大部分功能,并且由于开源,可以定制化需求功能
1.7 selenium安装
通过pip包管理工具去安装
安装:
pip install selenium
查看:
pip show selenium
卸载:
pip uninstall selenium
扩展:
1. 安装指定版本 pip install selenium版本号 如:pip install selenium2.48.0
2. 如何查看可安装按本? 指定版本号为错误版本号
3. pip是python中包管理工具(可以安装,卸载、查看python工具)
4. pip list:查看通过pip包管理工具安装的插件或工具
1.8 浏览器及驱动安装
浏览器
火狐:可以官网或百度获取浏览器版本
谷歌:通过百度
驱动:
1. 火狐:https://github.com/mozilla/geckodriver/releases/
2. 谷歌:http://chromedriver.storage.googleapis.com/index.html
应用:
- 将浏览器驱动放到指定文件夹
- 将浏览器驱动所在目录添加到系统path环境变量中(选中我的电脑/此电脑-右键–>属性–>高级系统设置–>高级(环境变量)–>path(如果是wind7路径与路径之间需要添加分号))
注意:
- 浏览器驱动必须和浏览器版本对应(查看下载驱动时,有告知响应的浏览器版本)
- 获取浏览器48版本以下,内置驱动
1.9 第一个案例
# 导包
from selenium import webdriver
from time import sleep
# 获取浏览器驱动
driver = webdriver.Chrome()
# 打开url
driver.get("http://www.baidu.com")
# 暂停3秒
sleep(3)
# 关闭浏览器驱动
driver.quit()
二、slenium元素定位
2.1 id定位
id定位就是通过元素的id属性来定位元素,HTML规定id属性在整个HTML文档中必须是唯一的
element = driver.find_element_by_id(id)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过id定位并获取元素文本
element = driver.find_element_by_id("my_element")
text = element.text
print("元素的文本是:", text)
# 通过id定位并点击按钮
button = driver.find_element_by_id("my_button")
button.click()
driver.quit()
- 这个示例中,我们使用driver.find_element_by_id方法来定位具有特定id的元素,如"my_element"和"my_button"
- 然后,我们使用定位到的元素进行后续操作,比如获取文本内容或点击按钮
2.2 name定位
name定位就是根据元素name属性来定位。HTML文档中name的属性值是可以重复的
element = driver.find_element_by_name(name)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过name属性定位并获取元素文本
element = driver.find_element_by_name("username")
text = element.text
print("元素的文本是:", text)
# 通过name属性定位并输入文本
input_box = driver.find_element_by_name("q")
input_box.send_keys("Selenium")
# 通过name属性定位并点击按钮
button = driver.find_element_by_name("submit")
button.click()
driver.quit()
- 在这个示例中,我们使用driver.find_element_by_name方法来定位具有特定name属性的元素,如"username",“q"和"submit”
- 然后,我们可以使用这些定位到的元素进行各种操作,如获取文本内容、输入文本或点击按钮等
2.3 class_name定位
说明:class_name定位就是根据元素class属性值来定位元素。HTML通过使用class来定义元素的样式
前提:元素有class属性
注意:如果class有多个属性值,只能使用其中的一个
element = driver.find_element_by_class_name(class_name)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过class属性定位并获取元素文本
element = driver.find_element_by_class_name("my_class")
text = element.text
print("元素的文本是:", text)
# 通过class属性定位并点击按钮
button = driver.find_element_by_class_name("my_button")
button.click()
driver.quit()
- 在这个示例中,我们使用driver.find_element_by_class_name方法来定位具有特定class属性的元素,如"my_class"和"my_button"
- 然后,我们可以使用这些定位到的元素进行各种操作,如获取文本内容或点击按钮等
2.4 tag_name(标签名定位)
是通过元素的标签名称来定位,标签名(查看元素时尖括号(<)紧挨着的单词或字母就是标签名)
driver.find_element_by_tag_name("标签名")
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 找到第一个 <a> 标签并获取其属性值
element = driver.find_element_by_tag_name("a")
href = element.get_attribute("href")
print("第一个<a>标签的链接地址是:", href)
# 找到所有的 <input> 标签并遍历输出它们的值
elements = driver.find_elements_by_tag_name("input")
print("页面中的输入框数量:", len(elements))
for element in elements:
value = element.get_attribute("value")
print("输入框的值:", value)
driver.quit()
- 此案例先使用find_element_by_tag_name方法找到页面上第一个 < a >标签,并获取其href属性值
- 然后使用find_elements_by_tag_name方法找到所有的标签,并输出它们的值
注意:
如果页面中存在多个相同标签,默认返回第一个标签元素
2.5 link_text (链接文本定位)
link_text定位是专门用来定位超链接元素(< a>标签< /a>) ,并且是通过超链接的文本内容来定位元素
element = driver.find_element_by_link_text(link_text)
link_text:为超链接的全部文本内容
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过链接文本定位并点击链接
link = driver.find_element_by_link_text("More information...")
link.click()
# 获取新页面的标题
new_page_title = driver.title
print("新页面的标题是:", new_page_title)
driver.quit()
- 在此案例中,我们使用find_element_by_link_text方法来定位页面上的链接文本为"More information…"的链接
- 并使用click方法点击该链接。然后,我们使用title属性获取新页面的标题,并输出它
2.6 partial_link_text(部分链接文本定位)
partial_link_text定位是对link_text定位的补充,link_text使用全部文本内容匹配元素
而partial_link_text可以使用局部来匹配元素,也可以使用全部文本内容匹配元素
element = driver.find_element_by_partial_link_text(partial_link_text)
partial_link_text:可以传入a标签局部文本-能表达唯一性
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过部分链接文本定位并点击链接
partial_link = driver.find_element_by_partial_link_text("More")
partial_link.click()
# 获取新页面的标题
new_page_title = driver.title
print("新页面的标题是:", new_page_title)
driver.quit()
- 在这个案例中,我们使用find_element_by_partial_link_text方法来定位部分链接文本包含"More"的链接
- 并使用click方法点击该链接。然后,我们使用title属性获取新页面的标题,并输出它
2.7 Xpath定位
xpath是XML Path简称;
(xml是一种标记语言,焦点:数据存储于传递(配置文件) 后缀.XML)
常用的定位策略:
1.路径
1). 绝对路径:
语法:以单斜杠开头逐级开始编写,不能跳级。如:/html/body/div/p[1]/input
2). 相对路径
语法:以双斜杠开头,双斜杠后边跟元素名称,不知元素名称可以使用*代替。
如: //input 与 // *
- 路径结合属性
语法:在Xpath中,所有的属性必须使用@符号修饰 如://*[@id=‘id值’] - 路径结合逻辑(多个属性)
语法://*[@id=“id值” and @属性=‘属性值’] - 路径结合层级
语法://*[@id=‘父级id属性值’]/input
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过XPath定位并获取元素文本
element = driver.find_element_by_xpath("//h1")
text = element.text
print("h1标签的文本是:", text)
# 通过XPath定位并点击按钮
button = driver.find_element_by_xpath("//button[@id='my_button']")
button.click()
driver.quit()
- 在此案例中,我们使用find_element_by_xpath方法通过XPath来定位元素。第一个例子中,我们使用XPath //h1 定位第一个< h1>标签,并获取其文本内容
- 第二个例子中,我们使用XPath //button[@id=‘my_button’] 定位id属性为my_button的按钮,并使用click方法点击它
拓展:
- //*[text()=‘XXX’] # 定位文本值等于XXX的元素
提示:一般适合 p标签,a标签 - //*[contains(@属性,‘xxx’)] # 定位属性包含xxx的元素
提示:contains为关键字,不可更改 - //*[starts-with(@属性,‘xxx’)] # 定位属性以xxx开头的元素
提示:starts-with为关键字,不可更改
2.8 CSS定位
- CSS一种标记语言,焦点:数据的样式。控制元素的显示样式,就必须先找到元素,在css标记语言中找元素使用css选择器
- css定位就是通过css选择器工具进行定位
- 极力推荐使用,查找元素的效率比xpath高,语法比xpath更简单
driver.find_element_by_css_selector()
常见的定位策略:
- id 选择器
前提:元素是必须有id属性
语法:#id 如:#passwordA - class 选择器
前提:元素是必须有class属性
语法:.class 如:.telA - 元素选择器
语法:element 如:input - 属性选择器
语法:[属性名=属性值] - 层级选择器
语法:
1. p>input
2. p input
扩展:
1. [属性^=‘开头的字母’] # 获取指定属性以指定字母开头的元素
2. [属性$=‘结束的字母’] # 获取指定属性以指定字母结束的元素
3. [属性*=‘包含的字母’] # 获取指定属性包含指定字母的元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 通过CSS选择器定位并获取元素文本
element = driver.find_element_by_css_selector("h1")
text = element.text
print("h1标签的文本是:", text)
# 通过CSS选择器定位并点击按钮
button = driver.find_element_by_css_selector("#my_button")
button.click()
driver.quit()
- 在这个案例中,我们使用find_element_by_css_selector方法来定位元素
- 第一个例子中,我们使用CSS选择器 “h1” 定位第一个 < h1> 标签,并获取其文本内容
- 第二个例子中,我们使用CSS选择器 “#my_button” 定位id属性为my_button的按钮,并使用click方法点击它
三、元素操作、浏览器操作方法
3.1 元素常用操作方法
- click() 单击元素
- send_keys(value) 模拟输入
- clear() 清除文本
单击元素
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 单击按钮
button = driver.find_element_by_id("my_button")
button.click()
driver.quit()
模拟输入
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 模拟输入文本
input_box = driver.find_element_by_name("q")
input_box.send_keys("Selenium")
driver.quit()
清除文本
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 清除文本内容
input_box = driver.find_element_by_id("my_input")
input_box.clear()
driver.quit()
综合案例
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 单击按钮
button = driver.find_element_by_id("my_button")
button.click()
# 模拟输入文本
input_box = driver.find_element_by_name("q")
input_box.send_keys("Selenium")
# 清除文本内容
input_box = driver.find_element_by_id("my_input")
input_box.clear()
driver.quit()
3.2 浏览器操作
- maximize_window() 最大化浏览器窗口 --> 模拟浏览器最大化按钮
- set_window_size(width, height) 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)
- set_window_position(x, y) 设置浏览器窗口位置 --> 设置浏览器位置
- back() 后退 --> 模拟浏览器后退按钮
- forward() 前进 --> 模拟浏览器前进按钮
- refresh() 刷新 --> 模拟浏览器F5刷新
- close() 关闭当前窗口 --> 模拟点击浏览器关闭按钮
- quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
- title 获取页面title
- current_url 获取当前页面URL
# 最大化浏览器
driver.maximize_window()
# 刷新
driver.refresh()
# 后退
driver.back()
# 前进
driver.forward()
# 设置浏览器大小
driver.set_window_size(300,300)
# 设置浏览器位置
driver.set_window_position(300,200)
# 关闭浏览器单个窗口
driver.close()
# 关闭浏览器所有窗口
driver.quit()
# 获取title
title = driver.title
# 获取当前页面url
url = driver.current_url
3.3 获取元素信息
- size 返回元素大小
- text 获取元素的文本
- get_attribute(“xxx”) 获取属性值,传递的参数为元素的属性名
- is_displayed() 判断元素是否可见
- is_enabled() 判断元素是否可用
- is_selected() 判断元素是否选中,用来检查复选框或单选按钮是否被选中
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 获取按钮的文本内容
button = driver.find_element_by_id("my_button")
button_text = button.text
print("按钮的文本是:", button_text)
# 获取输入框的大小
input_box = driver.find_element_by_name("q")
input_box_size = input_box.size
print("输入框的尺寸是:", input_box_size)
# 获取链接的href属性
link = driver.find_element_by_link_text("Learn More")
link_href = link.get_attribute("href")
print("链接的href属性是:", link_href)
# 判断文本是否可见
text = driver.find_element_by_id("my_text")
is_visible = text.is_displayed()
print("文本是否可见:", is_visible)
# 判断按钮是否可用
is_enabled = button.is_enabled()
print("按钮是否可用:", is_enabled)
# 判断复选框是否选中
checkbox = driver.find_element_by_id("my_checkbox")
is_selected = checkbox.is_selected()
print("复选框是否选中:", is_selected)
driver.quit()
四、鼠标和键盘操作
4.1 鼠标操作
常见的鼠标操作有:点击、右击、双击、悬停、拖拽等,对于这些鼠标操作Selenium都封装了相
应的操作方法
4.2 为什么要操作鼠标
现在Web产品中存在丰富的鼠标交互方式,作为一个Web自动化测试框架,需要应对这些鼠标操
作的应用场景
4.3 鼠标操作的方法
在Selenium中将操作鼠标的方法封装在ActionChains类中
实例化对象:action = ActionChains(driver)
必须调用perform()方法才能执行鼠标事件
- context_click(element) 右击 --> 模拟鼠标右键点击效果
- double_click(element) 双击 --> 模拟鼠标双击效果
- drag_and_drop(source, target) 拖动 --> 模拟鼠标拖动效果
- move_to_element(element) 悬停 --> 模拟鼠标悬停效果
- perform() 执行 --> 此方法用来执行以上所有鼠标操作
4.4 鼠标右键-context_click()
对于点击鼠标右键,如果弹出的是浏览器默认的菜单,Selenium没有提供操作菜单选项的方法;
如果是自定义的右键菜单,则可以通过元素定位来操作菜单中的选项
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://example.com")
element = driver.find_element_by_id("my_element")
action = ActionChains(driver)
action.context_click(element).perform()
driver.quit()
4.5 鼠标双击-double_click()
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://example.com")
element = driver.find_element_by_id("my_element")
action = ActionChains(driver)
action.double_click(element).perform()
driver.quit()
4.6 鼠标拖动-drag_and_drop()
模拟鼠标拖动动作,选定拖动源元素释放到目标元素
- 源元素 source = driver.find_element_by_id(xxx)
- 目标元素 target = driver.find_element_by_id(xxx)
- 调用方法 action.drag_and_drop(source, target).perform()
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://example.com")
# 定位源元素和目标元素
source_element = driver.find_element_by_id("source_element")
target_element = driver.find_element_by_id("target_element")
# 进行拖拽操作
action = ActionChains(driver)
action.drag_and_drop(source_element, target_element).perform()
driver.quit()
- 在这个案例中,我们使用了driver.find_element_by_id()方法分别定位源元素和目标元素
- 然后,我们创建一个ActionChains对象,并调用drag_and_drop()方法来执行拖拽动作
- 将源元素拖拽到目标元素位置
- 最后,使用perform()方法来执行所有的鼠标动作
4.7 鼠标悬停-move_to_element()
模拟鼠标悬停在指定的的元素上
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("http://example.com")
# 定位要悬停的元素
element = driver.find_element_by_id("my_element")
# 鼠标悬停操作
action = ActionChains(driver)
action.move_to_element(element).perform()
driver.quit()
4.8 键盘操作
1). 模拟键盘上一些按键或者组合键的输入 如:Ctrl+C 、Ctrl+V;
2). Selenium中把键盘的按键都封装在Keys类中
4.9 Key类
导包:from selenium.webdriver.common.keys import Keys
4.10 常见的键盘操作
- send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
- send_keys(Keys.SPACE) 空格键(Space)
- send_keys(Keys.TAB) 制表键(Tab)
- send_keys(Keys.ESCAPE) 回退键(Esc)
- send_keys(Keys.ENTER) 回车键(Enter)
- send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
- send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
4.11 键盘案例
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://example.com")
# 定位文本框元素
text_box = driver.find_element_by_id("my_textbox")
# 在文本框中输入文字
text_box.send_keys("Hello World!")
# 删除最后一个字符
text_box.send_keys(Keys.BACK_SPACE)
# 输入一个空格
text_box.send_keys(Keys.SPACE)
# 输入制表符
text_box.send_keys(Keys.TAB)
# 模拟按下回退键
text_box.send_keys(Keys.ESCAPE)
# 模拟按下回车键
text_box.send_keys(Keys.ENTER)
# 模拟按下Ctrl+A全选文本
text_box.send_keys(Keys.CONTROL, "a")
# 模拟按下Ctrl+C复制文本
text_box.send_keys(Keys.CONTROL, "c")
driver.quit()
五、元素等待
5.1 什么是元素等待
在定位页面元素时如果未找到,会在指定时间内一直等待的过程
5.2 为什么要设置元素等待
- 网络速度慢
- 电脑配置低
- 服务器处理请求慢
5.3 元素等待类型
- 隐式等待
- 显式等待
5.4 隐式等待
概念:定位元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元
素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出元素
不存在的异常 NoSuchElementException
方法:
driver.implicitly_wait(timeout)
(timeout:为等待最大时长,单位:秒)
说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 设置隐式等待时间为10秒
driver.get("http://example.com")
element = driver.find_element_by_id("my_element")
driver.quit()
5.5 显式等待
概念:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该
元素,则间隔一段时间后再去定位元素; 如果在达到最大时长时还没有找到指定元素,则抛出超
时异常 TimeoutException
实现方法:
- 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait
- WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver:浏览器驱动对象
2). timeout:超时的时长,单位:秒
3). poll_frequency:检测间隔时间,默认为0.5秒 - 调用方法 until(method):直到…时
1). method:函数名称,该函数用来实现对元素的定位
2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id(“userA”) - element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id(“userA”)
)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://example.com")
# 设置等待条件,直到元素可被点击
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "my_element")))
# 执行后续操作
element.click()
driver.quit()
5.6 显式与隐式区别
- 作用域:隐式为全局元素,显式等待为单个元素有效
- 使用方法:隐式等待直接通过驱动对象调用,而显式等待方法封装在WebDriverWait类中
- 达到最大超时时长后抛出的异常不同:隐式为NoSuchElementException,显式等待为TimeoutException
六、下拉选择框
1、为什么单独使用下拉框?
- 如果option选项没有value值的化,css定位或其他定位就不太方便
2、使用Select类
实例化对象:
select = Select(element)
element: 标签对应的元素,通过元素定位方式获取,
例如:driver.find_element_by_id(“selectA”)
3、操作方法:
- select_by_index(index) --> 根据option索引来定位,从0开始
- select_by_value(value) --> 根据option属性 value值来定位
- select_by_visible_text(text) --> 根据option显示文本来定位
步骤:
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 import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get("http://example.com")
# 定位下拉框元素
select_element = driver.find_element_by_id("my_select")
# 创建Select对象
select = Select(select_element)
# 通过索引选择选项,索引从0开始
select.select_by_index(1)
# 通过可见文本选择选项
select.select_by_visible_text("Option 2")
# 通过值选择选项
select.select_by_value("option2")
driver.quit()
七、弹出框
网页中常用的弹出框有三种:
- alert 警告框
- confirm 确认框
- prompt 提示框
弹出框处理方法:
- 获取弹出框对象
alert = driver.switch_to.alert - 调用
alert.text --> 返回alert/confirm/prompt中的文字信息
alert.accept() --> 接受对话框选项
alert.dismiss() --> 取消对话框选项
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 点击触发弹出框的按钮
button = driver.find_element_by_id("my_button")
button.click()
# 切换到弹出框
alert = driver.switch_to.alert
# 获取弹出框中的文本信息
message = alert.text
print("弹出框信息:", message)
# 接受对话框选项
alert.accept()
# 取消对话框选项
# alert.dismiss()
driver.quit()
八、滚动条操作
滚动条:一种可控制页面显示范围的组件
- 在HTML页面中,由于前端技术框架的原因,页面元素为动态显示,元素根据滚动条的下拉而被加载
- 页面注册同意条款,需要滚动条到最底层,才能点击同意
实现方式:
- 设置JavaScript脚本控制滚动条
js = “window.scrollTo(0,1000)”
(0:左边距;1000:上边距;单位像素) - selenium调用执行JavaScript脚本的方法
driver.execute_script(js)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 使用JavaScript脚本控制滚动条
js_script = "window.scrollTo(0, 1000)"
driver.execute_script(js_script)
driver.quit()
九、frame切换、多窗口切换
9.1 frame切换
1、应用场景:
处于frame 中的元素,虽然可以获取元素信息,但是代码执行时无法定位元素,因此需要先切换到frame
,再进行元素定位操作
方法:
1). driver.switch_to.frame(frame_reference) --> 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢复默认页面方法
在frame中操作其他页面,必须先回到默认页面,才能进一步操作
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 切换到frame
frame_element = driver.find_element_by_id("frame_id")
driver.switch_to.frame(frame_element)
# 在frame中执行操作
# ...
# 返回默认的上下文(默认的frame)
driver.switch_to.default_content()
driver.quit()
9.2 多窗口切换
在HTML页面中,当点击超链接或者按钮时,有的会在新的窗口打开页面
方法:
1). driver.current_window_handle --> 获取当前窗口句柄
2). driver.window_handles --> 获取所有窗口句柄
3). driver.switch_to.window(handle) --> 切换指定句柄窗口
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 获取当前窗口句柄
current_window = driver.current_window_handle
print("当前窗口句柄:", current_window)
# 打开新窗口
driver.execute_script("window.open('http://example.com')")
# 获取所有窗口句柄
window_handles = driver.window_handles
print("所有窗口句柄:", window_handles)
# 切换到新的窗口
for handle in window_handles:
if handle != current_window:
driver.switch_to.window(handle)
break
# 在新窗口中执行操作
# ...
# 关闭当前窗口并切换回原始窗口
driver.close()
driver.switch_to.window(current_window)
driver.quit()
十、窗口截图、验证码处理
10.1 窗口截图
说明:把当前操作的页面,截图保存到指定位置
10.2 为什么要窗口截图
自动化脚本是由程序去执行的,因此有时候打印的错误信息并不是十分明确。如果在执行出错的时候
对当前窗口截图保存,那么通过图片就可以非常直观地看到出错的原因
10.3 窗口截图的方法
说明:在Selenium中,提供了截图方法,我们只需要调用即可
方法:
driver.get_screenshot_as_file(imgpath)
imgpath:图片保存路径
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 截取屏幕截图,并保存到指定路径
imgpath = "screenshot.png"
driver.get_screenshot_as_file(imgpath)
driver.quit()
10.4 验证码
说明:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性
10.5 为什么要学习验证码
在Web应用中,大部分系统在用户登录注册的时候都要求输入验证码,而我们在设计自动化测试脚本的时候,就需要面临处理验证码的问题
10.6 验证码的处理方式
方式:
1). 去掉验证码
(测试环境下-采用)
2). 设置万能验证码
(生产环境和测试环境下-采用)
3). 验证码识别技术
(通过Python-tesseract来识别图片类型验证码;识别率很难达到100%)
4). 记录cookie
(通过记录cookie进行跳过登录)
10.7 cookie
- Cookie是由Web服务器生成的,并且保存在用户浏览器上的小文本文件,它可以包含用户相关的信息。
- Cookie数据格式:键值对组成(python中的字典)
- Cookie产生:客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie数据
- Cookie使用:当浏览器再次请求该网站时,浏览器把请求的数据和Cookie数据一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态
应用场景:
- 实现会话跟踪,记录用户登录状态
- 实现记住密码和自动登录的功能
- 用户未登录的状态下,记录购物车中的商品
Selenium操作cookie:
说明:Selenium中对cookie操作提供相应的方法
方法:
get_cookie(name) --> 获取指定cookie
name:为cookie的名称
get_cookies() --> 获取本网站所有本地cookies
add_cookie(cookie_dict) --> 添加cookie
cookie_dict:一个字典对象,必选的键包括:"name" and "value"
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://example.com")
# 获取指定cookie
cookie = driver.get_cookie("cookie_name")
print("指定cookie:", cookie)
# 获取所有本地cookies
cookies = driver.get_cookies()
print("所有本地cookies:", cookies)
# 添加cookie
cookie_dict = {"name": "my_cookie", "value": "123456"}
driver.add_cookie(cookie_dict)
driver.quit()
-
在示例中,我们首先使用get_cookie()方法获取指定名为"cookie_name"的cookie,并将结果存储在cookie变量中
-
接下来,我们使用get_cookies()方法获取当前网页的所有本地cookies,并将结果存储在cookies变量中
-
然后,我们使用add_cookie()方法将一个名为"my_cookie"、值为"123456"的cookie添加到当前网页中