webdriver
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:\python\webdriver\frame.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:\python\shuiyin.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:\python\zxw.jpg") sleep(2) # 打开百度页面并截图 driver.get("http://www.baidu.com") driver.get_screenshot_as_file(r"E:\pyhon\baidu.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()