简介
1.是什么
selenium是用来进行页面元素定位的第三方库,用来进行web自动化测试的工具,可以直接运行在浏览器中。
2.原理:
selenium在工作过程中有三个角色,selenium客户端、webdriver和浏览器
selenium客户端是开发者与selenium的交互接口,它会发送指令给webdriver
浏览器则接收来自webdriver的执行命令,完成相应的操作
元素定位
-
通过xpath定位
driver.find_element(By.XPATH, '元素路径')
1、绝对路径(不建议)
2、相对路径:从一个符合条件的元素开始,以//开头,后边必须跟标签名称或*(*表示所有标签)相对路径+索引
//from/span[1]
相对路径+属性定位: //标签名[@属性名1 = '属性值']
//input[@autocomplete = 'off']
相对路径+文本定位: //标签名[text() = 'x']
//span[text() = '按图片搜索']
-
通过CSS定位
driver.find_element(By.CSS_SELECTOR, '')
1.使用#表示id属性
driver.find_element(By.CSS_SELECTOR, "#user")
2.使用.表示class属性driver.find_element(By.CSS_SELECTOR, '.tel')
3.通过属性定位
[attribute = value]
4.通过部分属性值定位
通过attribute属性值从value开始的元素
[attribute^ = value]
查找attribute属性值中含有value的元素
[attribute* = value]
查找attribute属性值以value结尾的元素
[attribute$ = value]
5.组合选择器
##1、后代选择器:空格
表示div标签内所有的后代元素,子,孙,重孙等
div span
2、子代选择器:>
表示div内的子集span元素(只包含子类)
div>span
3、兄弟选择器:~
表示与第一个div是兄弟的,并且是第一个div之后的元素
div~div
4、子元素a:nth-child(1)
选择第n个里的元素
a:nth-chhild(1)
-
通过ID定位(ID属性)
driver.find_element(By.ID, "value")
-
通过class-name定位(class属性)
driver.find_element(By.CLASS_NAME, "value")
-
通过tag-name定位(tag_name)
driver.find_element(By.TAG_NAME, "input")
-
通过link_text定位(超链接)
driver.find_element(By.LINK_TEXT, "登录")
-
通过partial_link定位(超链接)
driver.find_element(By.PARTIAL_LINK_TEXT, "value")
浏览器操作
1.初始化浏览器对象
from selenium.webdriver import Chrome
# 创建一个浏览器对象,并且打开空页面
browser = Chrome()
2.访问指定网页
from selenium import webdriver
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
# 访问百度首页
browser.get(url)
3.设置浏览器大小
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get(url)
# 设置浏览器为全屏
browser.maximize_window()
time.sleep(2)
# 设置分辨率为500*500
browser.set_window_size(500, 500)
# 关闭浏览器
browser.close()
4.刷新页面
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()
browser.get(url)
# 刷新页面
try:
browser.refresh()
except Exception as e:
print("刷新失败")
5.获取页面基本属性
# 网页标题
print(browser.title)
# 获取当前网页网址
print(browser.current.url)
# 获取浏览器的名称
print(browser.name)
# 获取浏览器的网页源码
print(browser.page_sourse)
6.浏览器页面前进和后退
browser = webdriver.Chrome()
browser.maximize_window()
browser.get("https://www.baidu.com")
time.sleep(2)
browser.get("https://www.taobao.com")
time.sleep(2)
# 后退到百度页面
browser.back()
time.sleep(5)
# 前进到淘宝页面
browser.forward()
time.sleep(5)
等待操作
-
隐式等待
设置隐式等待
driver.implicitly_wait(15)
-
显示等待
动态的等待某个事件。
比如:某元素可以被定位到,某元素可以看到
实例化等待对象
设置等待时间loc
loc = (By.ID, "search-input")
按照设定的事件,不断地去定位元素
判断元素是否已加载
ele = WebDriverWait(driver, 10).until(EC.presence_of_element_located(loc))
判断元素是否可见
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc))
-
固定等待
sleep()
页面交互操作
1. 浏览器窗口切换操作
获取当前窗口的句柄:current_window_handle
返回当前浏览器的所有窗口句柄:window_handles
用于切换到对应的窗口:switch_to_windows()
from selenium import driver
import time
browser = webdriver.Chrome()
browser.maximize_window()
browser.get("http://www.baidu.com")
# 新建一个选项卡
browser.execute_script('window.open()')
print(browser.current_window_handle)
print(browser.window.handles)
# 跳转到第二个选项卡
borwser.switch_to_window(browser.window_handles[1])
browser.get("http://www.zhihu.com")
time.sleep(5)
# 回到第一个选项卡并打开淘宝
browser.switch_to_window(browser.window_handle[0])
browser.get("http://taobao.com")
2. html嵌套iframe操作
# 切入iframe
# 使用ID切换
driver.switch_to_frame("idframe2")
# 使用name切换
driver.switch_to_name("myframe2")
# 使用index切换,从0开始
driver.switch_to_frame(1)
3. 下拉框选项处理
涉及到select模块
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
import time
url = ""
browser = webdriver.Chrome()
browser.maximize_window()
browser.get(url)
# 获取到对应的标签
select_tag = browser.find_element(By.NAME, "帅哥")
# 根据索引值进行选择
Select(select_tag).select_by_index("2")
# 根据value进行选择
Select(select_tag).select_by_value("草儿")
# 根据文本值进行选择
Select(select_tag).select_by_visible_text("才哥")
time.sleep(5)
鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
# 点击操作
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
time.sleep(2)
# 定位到要右击的元素,这里选的新闻链接
click_tag = browser.find_element(By.LINK_TEXT, '新闻')
click_tag.click()
# ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数
# context_click(right_click):模拟鼠标双击,需要传入指定元素定位作为参数
# perform(): 执行ActionChains()中存储的所有操作,可以看作是执行之前的一系列操作
# 双击
# 定位到要双击的元素
double_click = browser.find_element(By.CSS_SELECTOR, '.accessibility-icon')
ActionChains(browser).double_click(double_click).perfrom()
# 右击
right_click = browser.find_element(By.CSS_SELECTOR, '.accessibility-icon')
ActionChains(browser).context_click(right_click).preform()
# 拖拽
# 开始位置
source = browser.find_element(By.CSS_SELECTOR, "#draggable")
# 结束位置
target = browser.find_element(By.CSS_SELECTOR, "#droppable")
# 执行拖拽
ActionChains(browser).drag_and_drop(source, target).perform()
# 悬停
# 定位悬停的位置
move = browser.find_element(By.ID, "s-usersetting-top")
# 执行悬停操作
ActionChains(browser).move_to_element(move).preform()
按键操作
from selenium.webdriver.common.keys import Keys
# 通过send_keys()方法来模拟键盘上的按键。
JS操作
验证码处理
unittest操作
unittest 框架是python自带的一个单元测试框架,可以进行自动化测试
unittest + selenium => webui 自动化测试
unittest + requests => 接口自动化测试
unittest + appnium = 移动应用自动化测试
1、unittest 核心要素
2、实际应用
- 定义测试用例
- testsuit和testrunner 实例化测试套件:suit01 = unittest.TestSuite()
加入测试方法:suit01.addTest(TestAdd001("test_01"))
实例化runner对象:run01 = unittest.TextTestRunner()
运行:run01.run(suit01)
- TestLoader 实例化runner
运行测试用例
- Fixture
方法级的
class Test(unittest.TestCase)
def setUp(self):
print("...")
def tearDown(self):
print("...")
类级的
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls)->None:
print("...")
def tearDownClass(cls)->None:
print("...")
模块级别的
-
用例的跳过
在方法前使用跳过,跳过该测试用例
@unittest.skipIf(条件, "message")
或者
@unittest.skip("message")
def test(self):
...
...