一、元素定位
1、含义:元素定位就是通过元素的信息或元素的层级结构来定位元素的
2、方式:
- id
- name
- class_name
- tag_name
- link_text
- partial_link_text
- XPath
- CSS
3、 定位方法:
#selenium 3.x 版本使用:
driver.find_element_by_xxx(xxx) # xxx为上述8种类型
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.xxx, xxx)
拓展:driver.find_elements_by_xxx()是用来定义一组元素的,返回类型为列表,访问方式与列表相同(与上述方法相比element多了个s)
2.1 id定位
(1)说明:id定位就是通过元素的id属性来定位元素的,HTML规定id属性在整个HTML文档中必须是唯一的。
(2)id定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_id(id)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.ID, id)
2.2 name定位
(1)说明:name定位就是根据元素name属性来定位的,HTML文档中name的属性值可以重复。
(2)name定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_name(name)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.NAME, name)
2.3 class_name定位
(1)说明:class_name定位就是根据元素class属性来定位元素,HTML通过使用class来定义元素的样式。
(2)class_name定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_class_name(class_name)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME, class_name)
2.4 tag_name定位
(1)说明:tag_name定位就是通过标签名来定位,HTML本质就是由不同的tag组成,每一种标签一般在页面中会存在多个,所以不方便进行精确定位, 一般很少使用。
(2)tag_name定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_tag_name(tag_name)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.TAG_NAME, tag_name)
注意:如果存在多个相同标签,则返回符合条件的第一个标签
2.5 link_text定位
(1)说明:link_text定位是专门用来定位超链接元素(<a>标签</a>),并且是通过超链接的文本内容来定位元素。
(2)link_text定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_link_text(link_text)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.LINK_TEXT, link_text)
link_text:为超链接的全部文本内容
2.6 partial_link_text定位
(1)说明:partial_link_text定位是对link_text定位的补充,link_text使用全部文本内容匹配元素, 而partial_link_text可以使用局部来匹配元素,也可以使用全部文本内容匹配元素。
(2)partial_link_text定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_partial_link_text(partial_link_text)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.PARTIAL_LINK_TEXT, partial_link_text)
partial_link_text:可以传入a标签局部文本-能表达唯一性
2.7 XPath定位
(1)介绍:XPath即为XML Path的简称,它是一门在 XML 文档中查找元素信息的语言。HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中定位元素。
(2)XPath定位策略:
1、路径-定位
- 绝对路径格式:以/html根节点开始,使用/来分隔元素层级(不建议使用)
- 相对路径格式:以//开始,//input 或 //*
2、利用元素属性-定位
- 格式://input[@id='属性值'] 或者 //*[@id='属性值']
3、属性与逻辑结合-定位(多个属性)
- 格式://*[@name='属性值' and @class='属性值']
4、层级与属性结合-定位(找父属性)
- 格式://*[@id='p1']/input
(3)XPath定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_xpath(xpath)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, xpath)
(4)XPath-延伸
//*[text()="xxx"] # 文本内容是xxx的元素
//*[contains(@attribute,'xxx')] # 属性中含有xxx的元素
//*[starts-with(@attribute,'xxx')] # 属性以xxx开头的元素
注意:1、一般见识使用指定标签名称,不使用*代替,效率比较慢。
2、无论是绝对路径和相对路径,/后面必须为元素的名称或者*
3、扩展:在工作中,如果能使用相对路径绝对不使用绝对路径。
2.8 CSS定位
(1)介绍:CSS(Cascading Style Sheets)是一种语言,它用来描述HTML元素的显示样式,在CSS中,选择器是一种模式,用于选择需要添加样式的元素,在Selenium中也可以使用这种选择器来定位元素。
(2)CSS定位方式:
#selenium 3.x 版本使用:
driver.find_element_by_css_selector(css_selector)
#selenium 4.x 版本使用:
from selenium.webdriver.common.by import By
driver.find_element(By.CSS_SELECTOR, css_selector)
(3)CSS定位常用策略
1、id选择器
- 说明:根据元素id属性来选择
- 格式:#id
2、class选择器
- 说明:根据元素class属性来选择
- 格式:.class
3、元素选择器
- 说明:根据元素的标签名选择
- 格式:element
4、属性选择器
- 说明:根据元素的属性名和值来选择
- 格式:[attribute=value] 或者 element[attribute=value]
5、层级选择器
- 说明:根据元素的父子关系来选择
- 格式1:element1>element2 element2必须为element1的直接子元素
- 格式2:element1 element2 element2为element1的后代元素
- 提示:>与空格的区别,大于号必须为相邻子元素,空格则不用。
(4)CSS延伸
input[type^='p'] # type属性以p字母开头的元素
input[type$='d'] # type属性以d字母结束的元素
input[type*='w'] # type属性包含w字母的元素
二、元素操作、浏览器操作方法
1、元素常用的操作方法
- 使用方法: 定位元素.方法
- 例:driver.find_element(By.ID, 'su').click()
click() # 单击元素
send_keys(value) # 模拟输入
clear() # 清除文本
拓展:send_keys("文件路径及文件名")可以上传文件,只适用于input标签
js点击:
使用场景:当页面进行点击操作时,由于selenium运行速度过快,页面还未加载完全,导致先加载的其他元素被点击,系统报错
使用方法:
element = self.base_find_element(By.Xpath,"//*[text()='点击登录']") # 括号里为定位信息
driver.execute_script("arguments[0].click();", element)
2、操作浏览器的常用方法
- 使用方法:driver.方法(前提:driver = webdriver.Chrome())
- 例:driver.maximize_window() # 窗口最大化
maximize_window() # 最大化浏览器窗口 --> 模拟浏览器最大化按钮
set_window_size(width, height) # 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)
set_window_position(x, y) # 设置浏览器窗口位置 --> 设置浏览器位置
back() # 后退 --> 模拟浏览器后退按钮
forward() # 前进 --> 模拟浏览器前进按钮
refresh() # 刷新 --> 模拟浏览器F5刷新
close() # 关闭当前窗口 --> 模拟点击浏览器关闭按钮
quit() # 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
title # 获取页面title
current_url # 获取当前页面URL
提示:
1. driver.title 和 driver.current_url 没有括号,应用场景:一般为判断上步操作是否执行成功
2. driver.maximize_window() 一般为前置代码,在获取driver后,直接编写最大化浏览器
3. driver.close()与driver.quit()区别:
close():关闭当前主窗口
quit():关闭由driver对象启动的所有窗口
提示:如果当前只有1个窗口,close与quit没有任何区别。
3、获取元素信息的常用方法
- 使用方法: 定位元素.方法
- 例:driver.find_element(By.ID, 'su').get_attribute("id")
size # 返回元素大小
text # 获取元素的文本
get_attribute("xxx") # 获取属性值,传递的参数为元素的属性名
is_displayed() # 判断元素是否可见
is_enabled() # 判断元素是否可用
is_selected() # 判断元素是否选中,用来检查复选框或单选按钮是否被选中
提示:
1. text和size调用时无括号
2. get_attribute应用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确
3. is_displayed、is_enabled、is_selected,在特殊应用场景中使用。
三、鼠标和键盘操作
1、鼠标操作的方法
说明:在Selenium中将操作鼠标的方法封装在ActionChains类中
导包:from selenium.webdriver import ActionChains
实例化对象: action = ActionChains(driver)
方法:
1. context_click(element).perform() # 右击 --> 模拟鼠标右键点击效果
2. double_click(element).perform() # 双击 --> 模拟鼠标双击效果
3. drag_and_drop(source, target).perform() # 拖动 --> 模拟鼠标拖动效果
4. move_to_element(element).perform() # 悬停 --> 模拟鼠标悬停效果
5. perform() # 执行 --> 此方法用来执行以上所有鼠标操作
2、常用的键盘操作方法
- 使用方法:定位元素.send_keys(方法)
- 例:driver.find_element(By.ID, 'su').send_keys(Keys.BACKSPACE)
导包:from selenium.webdriver import Keys
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)
四、元素等待
1、概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程
2、元素等待类型:
(1)隐式等待:定位元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException。
方法:driver.implicitly_wait(timeout) # 一般设置30秒
(timeout:为等待最大时长,单位:秒)
说明:隐式等待为全局设置(只需要设置一次,就会作用于所有元素)
(2)显式等待:定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出超时异常 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"))
3、两种元素等待的区别
- 显示等待:针对单个元素生效
- 隐式等待:针对全局元素生效
五、下拉选择框、弹出框、滚动条操作
1、下拉选择框
(1)说明:下拉选择框就是HTML中<select>元素
(2)操作方法
- 使用方法:Select(driver.find_element(By.NAME,'name')).select_by_index(1)
说明:Select类是Selenium为操作select标签特殊封装的
实例化对象:
select = Select(element)
element: <select>标签对应的元素,通过元素定位方式获取
操作方法:
1. select_by_index(index) # 根据option索引来定位,从0开始
2. select_by_value(value) # 根据option属性 value值来定位
3. select_by_visible_text(text) # 根据option显示文本来定位
2、弹出框操作
(1)弹出框类型:
- alert 警告框
- confirm 确认框
- prompt 提示框
(2)处理方法:
1. 获取弹出框对象
alert = driver.switch_to.alert
2. 调用:
alert.text # 返回alert/confirm/prompt中的文字信息
alert.accept() # 接受对话框选项
alert.dismiss() # 取消对话框选项
3、滚动条
(1)说明:一种可控制页面显示范围的组件
(2)操作方法:
1. 设置JavaScript脚本控制滚动条
js = "window.scrollTo(0,1000)"
(0:左边距;1000:上边距;单位像素)
2. selenium调用执行JavaScript脚本的方法
driver.execute_script(js)
六、frame切换、多窗口切换
1、frame切换
(1)介绍:HTML页面中的一种框架,主要作用是在当前页面中指定区域显示另一页面元素
(2)操作方法:
方法:
1.driver.switch_to.frame(frame_reference) # 切换到指定frame的方法
frame_reference:可以为frame框架的name、id或者定位到的frame元素
2.driver.switch_to.default_content() # 恢复默认页面方法
注意:在frame中操作其他页面,必须先回到默认页面,才能进一步操作
2、多窗口切换
(1)说明
(2)操作方法:
- 句柄:英文handle,窗口的唯一识别码
driver.current_window_handle # 获取当前窗口句柄
driver.window_handles # 获取所有窗口句柄
driver.switch_to.window(handle) # 切换指定句柄窗口
七、窗口截图、验证码处理
1、窗口截图
方法: driver.get_screenshot_as_file(imgpath)
imgpath:图片保存路径
2、验证码
(1)说明:一种随机生成的信息(数字、字母、汉字、图片、算术题)等为了防止恶意的请求行为,增加应用的安全性。
(2)处理方式:
- 去掉验证码(测试环境)
- 设置万能验证码(测试、线上环境)
- 验证码识别技术(不推荐使用,准确率低)
- 记录cookie(推荐使用)
(3)cookie跳过登录方法
- 使用方法:driver.方法
方法:
1. get_cookie(name) # 获取指定cookie
name:为cookie的名称
2. get_cookies() # 获取本网站所有本地cookies
3. add_cookie(cookie_dict) # 添加cookie
cookie_dict:一个字典对象,必选的键包括:"name" and "value"
提示:添加cookie后必须使用driver.refresh()刷新方法,否则看不到登录效果
八、文件上传
1、input标签文件上传
使用场景:如果页面需要上传文件,通常在页面源代码中都能找到input标签元素
el = driver.find_element(By.Xpath, "//*[@name='file']")
el.send_keys(r'E:\data\test.png')
注意:上传的文件需要使用绝对路径表示文件位置及文件名
2、打开window系统弹窗上传文件
使用场景:当页面上传文件需要打开window系统弹窗上传文件,这时候selenium就起不到控制系统的作用,这时候就需要其他工具辅助
使用工具:
- pywinauto:根据GUI元素/控件实现文件上传
- pyautogui:使用坐标系统定位元素,可以跨平台使用,不支持中文输入(可以使用剪切板)
3、文件上传并发问题
通过系统弹窗上传文件简单直接,但是当程序需要并发操作时,这种方法实现文件上传就会变的很麻烦。如果程序需要并发执行上传文件,最好还是通过input标签,使用send_keys()方法实现上传文件