Selenium
介绍
Selenium是一个用于Web应用程序的自动化测试工具
特点
1.开源、免费
2.多浏览器支持:FireFox、Chrome、IE、Opera、Edge;
3.多平台支持:Linux、Windows、MAC;
4.多语言支持:Java、Python、Ruby、C#、JavaScript、C++;
5.对Web 页面有良好的支持;
6.简单(API 简单)、灵活(用开发语言驱动);
7.支持分布式测试用例执行。
环境搭建
基于Python环境搭建
步骤
Python开发环境(自行百度搭建)
安装Selenium包
安装浏览器(一般都有,跳过)
安装浏览器驱动--保证能够用程序驱动浏览器,实习自动化测试
安装selenium包
前提:Python3安装完毕且能正常运行
PIP工具
pip是一个通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。
以下命令在doc命令行中操作
安装
pip install selenium
卸载
pip uninsatll selenium
查看
pip show selenium
安装浏览器驱动
Chrome浏览器驱动下载地址
/mirrors/chromedriver/
找到自己浏览器对应的版本后下载,然后进行解压,并设置path
当然,可以通过简便path操作,将下载好的驱动解压至python目录下
Firefow浏览器下载地址
/mozilla/geckodriver/releases/
操作与上述一致
实操
元素定位
方式
id
name
class_name
tag_name
link_text
partial_link_text
XPath
CSS
id定位
通过元素的id属性来定位元素
前提:元素有id属性
有id属性,优先使用
方法(selenium版本不同,方法略有不同,在此的版本是4.5.0)
element = driver.find_element("id","kw")
name定位
通过元素的name属性进行定位
方法
element = driver.find_element("name","wd")
class_name定位
通过元素的class_name属性进行定位
方法
element = driver.find_element("class name","s_ipt")
link_text定位
通过超链接元素进行定位,link_text为超链接的全部文本内容
方法
element = driver.find_element("link text","新闻")
partial_link_text定位
通过超链接元素进行定位,partial_link_text为超链接的部分文本内容
方法
element = driver.find_element("partial link text","新")
XPath定位
通过标签路径进行定位
方法
element = driver.find_element("xpath", "//*[@id='kw']")
CSS选择器定位
通过标签路径进行定位
方法
element = driver.find_element("css selector", "#kw")
示例
该例子是通过百度首页进行测试
先通过谷歌打开百度首页
按F12进入调试界面
然后通过按钮找到对应元素的标签,再获取到id、name等属性
代码
from selenium import webdriverfrom time import sleep# 创建WebDriver对象driver = webdriver.Chrome()# 设置打开的网址url = ""# 使用浏览器打开指定页面driver.get(url)# 根据id获取# driver.find_element("id","kw").send_keys("查询")# driver.find_element("id","su").click()# 根据name获取# driver.find_element("name","wd").send_keys("美女")# driver.find_element("id","su").click()# 根据class name 获取# driver.find_element("class name","s_ipt").send_keys("美女")# driver.find_element("id","su").click()# 根据link text获取# driver.find_element("link text","新闻").click()# 根据 partial link text获取# driver.find_element("partial link text","新").click()# 根据CSS选择器获取# driver.find_element("css selector", "#kw").send_keys("美女")# driver.find_element("css selector", "#su").click()# driver.find_element("css selector", "[name=wd]").send_keys("美女")# driver.find_element("css selector", "#su").click()# driver.find_element("css selector",".s_ipt").send_keys("美女")# driver.find_element("css selector", "#su").click()# print(driver.find_element("css selector", "input"))# 根据Xpath获取# driver.find_element("xpath", "//*[@id='kw']").send_keys("美女")# driver.find_element("xpath", "//*[@id='kw']").clear()# 元素的其他操作# driver.find_element("xpath", "//*[@id='kw']").send_keys("美女")# driver.find_element("xpath", "//*[@id='kw']").clear()# print(driver.find_element("xpath", "//*[@id='kw']").size)# print(driver.find_element("xpath", "//*[@id='su']").text)# print(driver.find_element("xpath", "//*[@id='kw']").get_attribute())# driver.find_element("xpath", "//*[@id='su']").click()# 隐式等待# driver.find_element("css selector",".s_ipt").send_keys("美女")# driver.find_element("css selector", "#su").click()# print(driver.find_element("css selector", "a"))# driver.implicitly_wait(10)sleep(3)# 关闭浏览器driver.quit()
元素操作
目的
1.需要让脚本模拟用户给指定元素输入值
2.需要让脚本模拟人为删除元素的内容
3.需要让脚本模拟点击操作
元素常用操作方法
click() 单击元素
send_keys(value) 模拟输入
clear() 清除文本
可参照上述代码
模拟鼠标
拖动
使用场景
在网页中将一个元素拖动到指定地方
方法
chains.drag_and_drop(driver.find_element("id", "div1"), driver.find_element("id", "div2"))
移动鼠标
使用场景
在网页中移动鼠标
方法
chains.move_to_element(driver.find_element("xpath", "//*[@id='zc']/fieldset/button"))
双击
使用场景
在网页中模拟鼠标双击操作
方法
chains.double_click(driver.find_element("id", "selectA"))
代码
前置页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>拖拽div</title><style type="text/css">div{position:absolute;width:150px;height:150px;background-color:red;}</style><script type="text/javascript"><!--function drag(obj){if (typeof obj == "string") {var obj = document.getElementById(obj);obj.orig_index=obj.style.zIndex;//设置当前对象永远显示在最上层}obj.onmousedown=function (a){//鼠标按下this.style.cursor="move";//设置鼠标样式this.style.zIndex=1000;var d=document;if(!a) a=window.event;//按下时创建一个事件var x=a.clientX-document.body.scrollLeft-obj.offsetLeft;//x=鼠标相对于网页的x坐标-网页被卷去的宽-待移动对象的左外边距var y=a.clientY-document.body.scrollTop-obj.offsetTop;//y=鼠标相对于网页的y左边-网页被卷去的高-待移动对象的左上边距d.onmousemove=function(a){//鼠标移动if(!a) a=window.event;//移动时创建一个事件obj.style.left=a.clientX+document.body.scrollLeft-x;obj.style.top=a.clientY+document.body.scrollTop-y;}d.onmouseup=function (){//鼠标放开document.onmousemove=null;document.onmouseup = null;obj.style.cursor="normal";//设置放开的样式obj.style.zIndex=obj.orig_index;}}}--></script></head><body><div id="div1" style="width:100px;height:100px;z-index:99"> </div><div id="div2" style="left:170px; background-color:blue; z-index:98"></div><script type="text/javascript"><!--drag("div1");drag("div2");--></script></body></html>
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="UTF-8"><title>注册A</title><style type="text/css">body{background: #F0F0F0}#zc{width: 500px;background: #C7C7E2;padding: 10px;margin-top: 10%;margin-left: 30%}input{padding: 5px;background: #f8f8f8}button{padding: 8px; background: #f8f8f8;border-radius: 5px}button:hover{padding: 10px; background: #2F4F4F}input:focus{background: #FFC0CB}/*span{display: none}*/</style><script type="text/javascript"></script></head><body><form action=""><div id="zc"><fieldset><legend>注册用户A</legend><p id="p1"><label for="userA">账号A</label><input type="textA" name="userA" id="userA" placeholder="账号A" required="" value=""> </p><p><label for="password">密码A</label> <input type="password" name="passwordA" id="passwordA" placeholder="密码A" value=""></p><p><label for="telA">电话号码A</label><input type="telA" name="telA" id="telA" placeholder="电话A" class="telA haha" value=""></p><p><label for="emailA">电子邮件A</label><input type="emailA" name="emailA" id="emailA" placeholder="电子邮箱A" value=""></p><button type="submitA" value="注册A" title="加入会员A">注册用户A</button><hr><p><span>Span_tagName</span></p><p><a href="" id="fwA" target="_blank">访问 百度 网站</a></p><p><a href="" id="AAA">AA 百度 网站</a></p><p><a href="" rel="nofo"></a></p><p><a href="logout">我是a标签A</a></p><p><a href="" rel="">退出</a></p><hr><p><select name="selecta" id="selectA"><option value="bj">A北京</option><option value="sh">A上海</option><option value="gz">A广州</option><option value="cq">A重庆</option></select></p><hr><form action=""><label for=""><input type="radio" name="fruit" value="pga" id="pga">A苹果</label><label for=""><input type="radio" name="fruit" value="jza" id="jza">A橘子</label><label for=""><input type="radio" name="fruit" value="xja" id="xja">A香蕉</label><label for=""><input type="radio" name="fruit" value="lia" id="lia" checked="">A梨</label><label for=""><input type="radio" name="fruit" value="xga" id="xga">西瓜</label></form><form action=""><input type="checkbox" name="checkbox" value="汽车" id="qcA">汽车A<br><input type="checkbox" name="checkbox" value="购物" id="gwA">购物A<br><input type="checkbox" name="checkbox" value="旅游" id="lyA" readonly="">旅游A <br><input type="checkbox" name="checkbox" value="音乐" id="yyA"disabled="">音乐A <br><input type="button" value="取消A" disabled="" id="cancelA"><br><input type="button" value="alerta" id="alerta" onclick="al()"> <br><input type="file" name="upfilea" value=""></form></fieldset> </div><script>function al(){alert('我被被点击啦!')}</script></form><!-- <a href="" target="myframe1">新浪</a><a href="" target="myframe1">hao123</a><a href="" target="myframe2">淘宝</a><a href="" target="myframe2">百度</a><br><iframe src="" frameborder="1" height="500" width="48%" name="myframe1"></iframe><iframe src="" frameborder="1" height="500" width="48%" name="myframe2"></iframe> --></body></html>
from selenium import webdriverfrom mon.action_chains import ActionChainsfrom time import sleepdriver = webdriver.Chrome()# url = r"E:\python_code\python_test\drag.html"url = r"E:\python_code\python_test\注册A.html"driver.get(url)chains = ActionChains(driver)# 拖动# chains.drag_and_drop(driver.find_element("id", "div1"), driver.find_element("id", "div2"))# 移动鼠标,将鼠标放置在加入会员按钮上# chains.move_to_element(driver.find_element("xpath", "//*[@id='zc']/fieldset/button"))# 双击# chains.double_click(driver.find_element("id", "selectA"))chains.perform()sleep(3)driver.quit()
注意:需要执行这个方法chains.perform()才能够有效。
键盘操作
使用场景
模拟在网页上,使用键盘输入
代码
from selenium import webdriverfrom time import sleepfrom mon.keys import Keysdriver = webdriver.Chrome()url = ""driver.get(url)element = driver.find_element("id", "kw")element.send_keys("美女")element.send_keys(Keys.BACK_SPACE)element.send_keys(Keys.CONTROL, 'a')sleep(1)# 复制element.send_keys(Keys.CONTROL, 'c')element.send_keys(Keys.CONTROL, 'v')element.send_keys(Keys.CONTROL, 'v')sleep(3)driver.quit()
注意:固定的按键如control等按键,都有方法。
下拉框操作
使用场景
在一些网页上,需要对下拉框进行选择
代码
前置网页(上面的注册A页面)
from time import sleepfrom selenium import webdriverfrom selenium.webdriver.support.select import Selectdriver = webdriver.Chrome()url = r"E:\python_code\python_test\注册A.html"driver.get(url)ele = driver.find_element("id", "selectA")select = Select(ele)sleep(1)select.select_by_index(2)sleep(1)select.select_by_value("bj")sleep(1)select.select_by_visible_text("A重庆")sleep(3)driver.quit()
滚动条
使用场景
在网页中,将页面往下滑的操作
代码
from selenium import webdriverfrom time import sleep# 创建WebDriver对象driver = webdriver.Chrome()# 设置打开的网址url = ""# 使用浏览器打开指定页面driver.get(url)js_script = "window.scrollTo(0,10000)"driver.execute_script(js_script)driver.find_element("class name","HomeFooter-friendLinkItem").click()sleep(3)# 关闭浏览器driver.quit()
警告框
使用场景
在一些页面会弹出警告框,需要点击接受或者忽略
代码
前置页面
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>.box2{background: red;color: blue;}</style></head><body><!--第一级标签 2个div 1个a标签 --><!--第一个div标签中包含3个p标签,第一个p中包含1个a --><!--第二个div中包含3个p标签 --><!-- p>a --><!-- div+div+a --><div id="div1" class="box1" newattr="css_course new_attr"><p class="div1p1">div1 p1<a href="#">inner link text</a></p><p class="div1p2">div1 p2</p><p class="div1p3">div1 p3</p></div><div id="div2" class="box2"><p class="div2p1">div2 p1文本</p><p class="div2p2">div2 p2文本</p><p class="div2p3">div2 p3文本</p></div><a href="#">outter link text</a><br><input type="button" value="alert" onclick="alert('这是警告框')"><input type="button" value="confirm" onclick="confirm('这是确认框')"><input type="button" value="prompt" onclick="prompt('这是提示框')"></body></html>
from selenium import webdriverfrom time import sleep# 创建WebDriver对象driver = webdriver.Chrome()# 设置打开的网址url = r"E:\python_code\python_test\css_example.html"# 使用浏览器打开指定页面driver.get(url)driver.find_element("css selector", "[value=alert]").click()sleep(1)# 弹出框点击确定# driver.switch_to.alert.dismiss()# driver.switch_to.alert.accept()# print(driver.switch_to.alert.text)sleep(3)# 关闭浏览器driver.quit()
Frame切换
使用场景
在页面中存在多个窗体,需要切换窗体进行操作
代码
前置页面
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="UTF-8"><title>表单综合实例</title><style type="text/css">body{background: #F0F0F0}form{width: 500px;background: #C7C7E2;padding: 10px;margin-top: 10%;margin-left: 30%}input{padding: 5px;background: #f8f8f8}button{padding: 8px; background: #f8f8f8;border-radius: 5px}button:hover{padding: 10px; background: #2F4F4F}input:focus{background: #FFC0CB}/*span{display: none}*/</style><script type="text/javascript"></script></head><body><form action=""><div id="zc"><fieldset><legend>注册用户</legend><p id="p1"><label for="user">账号</label><input type="text" name="user" id="user" placeholder="账号" required="" value=""> </p><p><label for="password">密码</label> <input type="password" name="password" id="password" placeholder="密码" value=""></p><p><label for="tel">电话号码</label><input type="tel" name="tel" id="tel" placeholder="电话" class="tel" value=""></p><p><label for="email">电子邮件</label><input type="email" name="email" id="email" placeholder="电子邮箱" value="" aa="ddd"></p><button type="submit" value="注册" title="加入会员">注册用户</button><hr><p><span>Span_tagName</span></p><p><a href="" id="fw" target="_blank">访问 新浪 网站</a></p><p><a href="" id="AA">AA 新浪 网站</a></p><p><a href="注册A.html" id="ZCA" target="_blank">注册A网页</a></p><p><a href="注册B.html" id="ZCB" target="_blank">注册B网页</a></p><p><a href="" rel="nofo"></a></p><p><a href="logout">我是a标签</a><s/p><p><a href="" rel="">退出</a></p><hr><p><select name="select" id="select"><option value="bj">北京</option><option value="sh">上海</option><option value="gz">广州</option><option value="cq">重庆</option></select></p><hr><form action=""><label for=""><input type="radio" name="fruit" value="pg" id="pg">苹果</label><label for=""><input type="radio" name="fruit" value="jz" id="jz">橘子</label><label for=""><input type="radio" name="fruit" value="xj" id="xj">香蕉</label><label for=""><input type="radio" name="fruit" value="li" id="li" checked="">梨</label><label for=""><input type="radio" name="fruit" value="xg" id="xg">西瓜</label></form><form action=""><input type="checkbox" name="checkbox" value="汽车" id="qc">汽车<br><input type="checkbox" name="checkbox" value="购物" id="gw">购物<br><input type="checkbox" name="checkbox" value="旅游" id="ly" readonly="">旅游 <br><input type="checkbox" name="checkbox" value="音乐" id="yy"disabled="">音乐 <br><input type="button" value="取消" disabled="" id="cancel"><br><input type="button" value="alert" id="alert" onclick="al()"> <br><input type="file" name="upfile" value=""></form></fieldset> </div><script>function al(){alert('我被被点击啦!')}</script></form><a href="" target="myframe1">新浪</a><a href="" target="myframe1">hao123</a><a href="" target="myframe2">淘宝</a><a href="" target="myframe2">百度</a><br><iframe src="注册A.html" frameborder="1" height="500" width="48%" name="myframe1" id="idframe1"></iframe><iframe src="注册B.html" frameborder="1" height="500" width="48%" name="myframe2"></iframe> </body></html>
from time import sleepfrom selenium import webdriverdriver = webdriver.Chrome()url = r'E:\python_code\python_test\注册实例.html'driver.get(url)driver.switch_to.frame("myframe1")ele_user_a = driver.find_element("id", "userA")ele_user_a.send_keys("hahaha")sleep(1)driver.switch_to.default_content()driver.switch_to.frame("myframe2")ele_user_b = driver.find_element("id", "userB")ele_user_b.send_keys("wuwuwu")sleep(3)# 关闭浏览器driver.quit()
标签页切换
使用场景
页面中会出现多个标签页,需要进行切换后操作
代码
前置页面(上述注册示例.html)
from time import sleepfrom selenium import webdriverdriver = webdriver.Chrome()url = r'E:\python_code\python_test\注册实例.html'driver.get(url)handle_a = driver.current_window_handleprint(handle_a)driver.find_element("id","ZCA").click()sleep(1)for handle in driver.window_handles:driver.switch_to.window(handle)sleep(1)sleep(3)# 关闭浏览器driver.quit()
截图
使用场景
在操作的过程中,出现错误或一些操作需要进行记录
代码
from selenium import webdriverfrom time import sleep# 创建WebDriver对象driver = webdriver.Chrome()# 设置打开的网址url = ""# 使用浏览器打开指定页面driver.get(url)driver.get_screenshot_as_file(r"E:\python_code\python_test\douyu.png")sleep(3)# 关闭浏览器driver.quit()
cookie的处理
使用场景
在打开网页的时候,可能需要进行登录或权限校验的操作,可以在打开网页后添加cookie完成验证或登录
示例
打开百度网页并传输cookie进行登录
代码
from selenium import webdriverfrom time import sleep# 创建WebDriver对象driver = webdriver.Chrome()# 设置打开的网址url = ""# 使用浏览器打开指定页面driver.get(url)driver.maximize_window()sleep(5)# “BDUSS”的值和“BAIDUID”的值在登录后的页面中查找driver.add_cookie({"name": "BDUSS", "value": "xxx"})driver.add_cookie({"name": "BAIDUID", "value": "xxx"})sleep(5)driver.refresh()sleep(3)# 关闭浏览器driver.quit()
注意:别把BDUSS的值截漏了