selenium是用来进行页面元素定位的第三方库,用来进行web自动化测试的工具,可以直接运行在浏览器中。
selenium在工作过程中有三个角色,selenium客户端、webdriver和浏览器
selenium客户端是开发者与selenium的交互接口,它会发送指令给webdriver
浏览器则接收来自webdriver的执行命令,完成相应的操作
driver.find_element(By.XPATH, '元素路径')
# 相对路径+索引
//from/span[1]
# 相对路径+属性定位: //标签名[@属性名1 = '属性值']
//input[@autocomplete = 'off']
# 相对路径+文本定位: //标签名[text() = 'x']
//span[text() = '按图片搜索']
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>里的元素
a:nth-chhild(1)
driver.find_element(By.ID, "value")
driver.find_element(By.CLASS_NAME, "value")
driver.find_element(By.TAG_NAME, "input")
driver.find_element(By.LINK_TEXT, "登录")
driver.find_element(By.PARTIAL_LINK_TEXT, "value")
from selenium.webdriver import Chrome
# 创建一个浏览器对象,并且打开空页面
browser = Chrome()
from selenium import webdriver
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
# 访问百度首页
browser.get(url)
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()
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()
browser.get(url)
# 刷新页面
try:
browser.refresh()
except Exception as e:
print("刷新失败")
# 网页标题
print(browser.title)
# 获取当前网页网址
print(browser.current.url)
# 获取浏览器的名称
print(browser.name)
# 获取浏览器的网页源码
print(browser.page_sourse)
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()
获取当前窗口的句柄: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")
# 切入iframe
# 使用ID切换
driver.switch_to_frame("idframe2")
# 使用name切换
driver.switch_to_name("myframe2")
# 使用index切换,从0开始
driver.switch_to_frame(1)
涉及到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()方法来模拟键盘上的按键。
unittest 框架是python自带的一个单元测试框架,可以进行自动化测试
unittest + selenium => webui 自动化测试
unittest + requests => 接口自动化测试
unittest + appnium = 移动应用自动化测试
实例化测试套件:suit01 = unittest.TestSuite()
加入测试方法:suit01.addTest(TestAdd001("test_01"))
实例化runner对象:run01 = unittest.TextTestRunner()
运行:run01.run(suit01)
实例化runner
运行测试用例
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):
...
...