1、第一个自动化测试脚本
# 第一个自动化测试脚本
from selenium import webdriver
from time import sleep
# 加载浏览器驱动
driver = webdriver.Firefox()
# 打开163邮箱页面
driver.get("https://mail.163.com/")
print(driver.title)
sleep(3)
# 打开百度首页
driver.get("http://www.baidu.com")
print(driver.title)
sleep(3)
# 关闭浏览器
driver.quit()
2、浏览器操作脚本
'''
浏览器操作
浏览器窗口大小设置
页面前进后退
页面刷新
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('http://www.baid.com')
# 窗口最大化
driver.maximize_window()
sleep(2)
driver.get("http://www.baidu.com")
# 自定义出口大小
driver.set_window_size(400, 800)
# 窗口刷新
driver.refresh()
sleep(2)
# 回退
driver.back()
sleep(2)
# 前进
driver.forward()
sleep(2)
# 退出
driver.quit()
3、元素定位
元素定位
元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素。
webdriver提供了一系列的元素定位方法,常用的有:
id、name、class name、link text、partial link text、tag name、xpath、css selector
(1)、id和name定位
'''
元素定位
元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素。
webdriver提供了一系列的元素定位方法,常用的有:
id、name、class name、link text、partial link text、tag name、xpath、css selector
打开百度首页,在搜索框自动输入"selenium"关键词,然后点击搜索按钮,查看搜索页面
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_name('wd').send_keys("加油")
sleep(2)
driver.find_element_by_id('su').click()
(2)、tag name定位
'''
元素定位之tag name
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
#定位标签名为input的元素
driver.find_element_by_tag_name('input').send_keys('selenium')
#获取页面所有标签名为input的标签
driver.find_elements_by_tag_name('input')[0].send_keys('selenium')
sleep(3)
driver.quit()
(3)、class name定位
'''
元素定位之class name
根据标签中属性class来进行定位的一种方法
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
driver.find_element_by_id('su').click()
sleep(2)
driver.quit()
(4)、link text定位
'''
元素定位之link text
link_text定位就是根据超链接文字进行定位
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
driver.find_element_by_link_text('新闻').click()
sleep(3)
driver.find_element_by_partial_link_text('新').click()
sleep(2)
driver.quit()
(5)、XPath定位
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
绝对定位和相对定位
'''
元素定位之xpath
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力
绝对定位和相对定位
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
#绝对路径定位
driver.find_element_by_xpath("/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input").send_keys('selenium')
#相对定位
#利用元素属性定位 定位到input标签中为kw的元素
driver.find_element_by_xpath("//input[@id='kw']").send_keys('selenium')
#定位input标签中name属性为的wd元素
driver.find_element_by_xpath("//input[@name='wd']").send_keys('selenium')
#定位所有标签元素中,class属性为s_ipt的元素
driver.find_element_by_xpath(("//*[@class='s_pt']")).send_keys('Python')
driver.find_element_by_id('su').click()
sleep(3)
driver.quit()
层级与逻辑组合定位
'''
元素定位之xpath
层级与逻辑定位
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
# 层级和属性结合定位 输入用户名和密码
driver.find_element_by_xpath("//form[@id='loginForm']/ul/input[1]").send_keys('selenium')
driver.find_element_by_xpath("//form[@id='loginForm']/ul/input[2]").send_keys('123456')
sleep(3)
# 逻辑运算组合定位
driver.find_element_by_xpath("//input[@class='loinp' and @name='username']").send_keys('selenium')
sleep(2)
driver.quit()
(6)、css定位
selenium极力推荐使用CSS定位,而不是xpath来定位元素,原因是css定位比xpath定位速度快,语法也更加简洁
css常用定位方法:
find_element_by_css_selector()
#id id选择器根据id属性来定位元素
.class class选择器根据class属性值来定位元素
[attribute='value']根据属性来定位元素
element>element 根据元素层级来定位 父元素>子元素
'''
元素定位之css
selenium极力推荐使用CSS定位,而不是xpath来定位元素,原因是css定位比xpath定位速度快,语法也更加简洁
css常用定位方法:
find_element_by_css_selector()
1、#id id选择器根据id属性来定位元素
2、.class class选择器根据class属性值来定位元素
3、[attribute='value']根据属性来定位元素
4、element>element 根据元素层级来定位 父元素>子元素
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 根据id来定位
driver.find_element_by_css_selector('#kw').send_keys('selenium')
sleep(3)
# 根据class定位
driver.find_element_by_css_selector('.s_ipt').send_keys('selenium')
sleep(3)
# 通过属性定位
driver.find_element_by_css_selector("[autocomplete='off']").send_keys("selenium")
sleep(3)
driver.find_element_by_id('su').click()
sleep(2)
# 通过元素层级定位
driver.find_element_by_css_selector("form#loginForm>ul>input").send_keys('selenium')
driver.find_element_by_css_selector("form#loginForm>ul>input[type='password']").send_keys('selenium')
driver.quit()
(7)、下拉菜单选项定位
根据选项元素标签定位
'''
元素定位之下拉菜单元素定位
1、根据选项元素标签定位
在我要自学网登录页面选择指定的保留时间
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get('http://www.zxw.net')
sleep(1)
# 根据option标签定位
driver.find_element_by_tag_name('option')[1].click()
driver.find_element_by_css_selector('[value="1"]').click()
sleep(2)
driver.quit()
使用Select类定位
'''
元素定位之下拉菜单元素定位
2、使用Select类定位
'''
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select
driver = webdriver.Firefox()
driver.get("http://www.zxw.net")
sleep(2)
# 利用Select类来进行定位
select = Select(driver.find_element_by_css_selector("[name='CookieDate]"))
select.select_by_index(2)
select.select_by_visible_text('留一年')
select.select_by_value("1")
sleep(2)
driver.quit()
4、鼠标操作
鼠标操作
实现思路:
需要引入ActionChains类
然后定位相关元素
在ActionChains().调用相关鼠标操作方法
'''
鼠标操作
实现思路:
需要引入ActionChains类
然后定位相关元素
在ActionChains().调用相关鼠标操作方法
'''
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.maximize_window()
driver.find_element_by_css_selector("#kw").send_keys('python')
# 获取搜索框元素对象
element = driver.find_element_by_css_selector("#kw")
sleep(3)
# 双击操作
ActionChains(driver).double_click(element).perform()
sleep(2)
# 右击操作
ActionChains(driver).context_click(element).perform()
sleep(3)
# 鼠标悬停
above = driver.find_element_by_css_selector(".pf")
ActionChains(driver).move_to_element(above).perform()
sleep(2)
driver.quit()
5、键盘操作
'''
键盘操作
在百度搜索关键词python,然后将关键词复制或剪切到搜狗搜索框进行搜索
'''
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_css_selector("#kw").send_keys("python")
sleep(2)
# 键盘全选操作Ctrl+a
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL, 'a')
# 键盘选择复制或剪切操作Ctrl+c、Ctrl+x
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL, 'c')
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL, 'x')
# 打开搜狗页面
driver.get("http://www.sogou.com")
sleep(2)
# 粘贴复制内容
driver.find_element_by_css_selector(".sec-input").send_keys(Keys.CONTROL, 'v')
sleep(2)
# 点击搜索按钮
driver.find_element_by_xpath("//input[@id='stb]").click()
driver.find_element_by_css_selector("#stb").click()
sleep(3)
driver.quit()
6、元素等待
显示等待
'''
元素等待
概念:
显示等待是针对某一个元素进行相关等待判定
隐式等待不针对某一元素进行等待,全局元素等待
相关模块:
WebDriverWait显示等待针对元素必用
expected_conditions预期条件类(里面包含方法可以调用,用于显示等待)
NoSuchElementException用于隐式等待抛出异常
By用于元素定位
案例:检测百度页面搜索按钮是否存在,存在就输入关键词"selenium"然后点击
'''
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
sleep(2)
driver.find_element_by_css_selector("#kw").send_keys("selenium")
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'su')))
element.click()
sleep(3)
driver.quit()
隐式等待
'''
隐式等待
'''
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import sleep, ctime
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
sleep(2)
# 隐式等待时间设定5秒
driver.implicitly_wait(5)
# 检测搜索框是否存在
try:
print(ctime())
driver.find_element_by_css_selector("#kw").send_keys("python")
driver.find_element_by_css_selector("#su").click()
except NoSuchElementException as msg:
print(msg)
finally:
print(ctime())
sleep(3)
driver.quit()
7、嵌套页面元素定位
frame.html
<html> <title>Frame Test</title> <body> <div> <iframe id="search" src="http://www.sogou.com" width="800" height="500"></iframe> </div> </body> </html>
'''
frame嵌套页面元素定位
案例:在frame.html文件中定位搜狗搜索页面,进行搜索操作
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
# 设置网页文件路径,r代表路径转义
file_path = r"E:pythonwebdriverframe.html"
driver.get(file_path)
# 切换到frame页面内
driver.switch_to.frame("search")
# 定位到搜索框按钮输入关键词
driver.find_element_by_css_selector("#query").send_keys("python")
sleep(2)
driver.find_element_by_css_selector("#stb").click()
sleep(2)
driver.quit()
8、多窗口切换
'''
多窗口切换操作
案例:打开我要自学网seleniu课程主页,然后打开2-1课程详情页面,再回到课程主页打开3-1课程详情页面
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.zxw.net")
# 获取课程主页打窗口句柄
selenium_index = driver.current_window_handle
sleep(2)
# 点击2-1课程链接,进入课程详情页面
driver.find_element_by_partial_link_text("2-1").click()
sleep(3)
# 跳转到课程主页窗口,点击3-1课程
driver.switch_to.window(selenium_index)
sleep(3)
driver.find_element_by_partial_link_text("3-1").click()
sleep(3)
driver.quit()
9、警告弹窗处理
'''
警告弹窗处理
案例:点击百度首页设置按钮,然后保存弹出警告窗口进行相关处理
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_link_text("设置").click()
sleep(2)
driver.find_element_by_link_text("搜索设置").click()
sleep()
driver.find_element_by_link_text("保存设置").click()
driver.find_element_by_link_text("恢复默认").click()
alert = driver.switch_to.alert()
alert.accept()
sleep(2)
driver.quit()
10、上传文件
'''
上传文件
案例:在百度搜索上传本地图片进行搜索
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.find_element_by_css_selector(".soutu-btn").click()
sleep(3)
driver.find_element_by_css_selector(".upload-pic").send_keys(r"E:pythonshuiyin.png")
sleep(3)
driver.quit()
11、浏览器滚动条操作
'''
滚动条控制操作
案例:打开我要自学网页面,然后将滚动条拖到最底部,再拖到顶部
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.zxw.net")
#将滚动条拖到最底部
js = "var action=document.documentElement.scrollTop=10000"
driver.execute_script(js)
sleep(2)
#将滚动条拖到最顶部
js = "var action=document.documentElement.scrollTop=0"
driver.execute_script(js)
sleep(2)
driver.quit()
12、网页自动截图
'''
网页自动截图
案例:分别打开我要自学网页面和百度页面,然后进行截图
'''
from selenium import webdriver
from time import sleep
# 加载浏览器驱动
driver = webdriver.Firefox()
# 打开我要自学网页面并截图
driver.get("http://www.zxw.net")
driver.get_screenshot_as_file(r"E:pythonzxw.jpg")
sleep(2)
# 打开百度页面并截图
driver.get("http://www.baidu.com")
driver.get_screenshot_as_file(r"E:pyhonaidu.jpg")
sleep(2)
driver.quit()
13、Cookie处理
'''
Cookie处理
Cookie是存储在用户本地终端上的数据,实际上是一小段的文本信息
Cookie的作用是帮助Web站点保存有关访问者的信息,方便用户的访问。如记住用户名密码实现自动登录
'''
from selenium import webdriver
from time import sleep
# 加载浏览器驱动
driver = webdriver.Firefox()
driver.get("http://www.zxw.net")
# 获取Cookie信息
cookie = driver.get_cookie()
print(cookie)
print(cookie[0])
sleep(3)
# 添加Cookie信息
driver.add_cookie({"name": "test", "value": "jiayou"})
for cookie in driver.get_cookie():
print("%s--%s" % (cookie['name'], cookie['value']))
driver.quit()
14、基于Cookie绕过验证码自动登录
'''
基于Cookie绕过验证码自动登录
'''
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 手动添加cookie
driver.add_cookie({'name': 'BAIDUID', 'value': 'aaaaaaaaaa'})
driver.add_cookie({'name': 'BDUSS', 'value': 'bbbbbbbbbbb'})
sleep(2)
driver.refresh()
sleep(3)
driver.quit()