本篇文章将介绍selenium自动化测试工具。看完这篇文章,完全有能力写出一个抢课脚本。文章最后有一个教务网的实战案例,包括验证码识别,自动化处理流程分析。
1.环境搭建
1.1下载驱动程序
以谷歌浏览器为例
下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads
1.2安装selenium
pip install selenium
1.3 基本测试
编写代码,如果程序能正常启动,那么环境搭建就没有问题。
from selenium import webdriver
dirver_path = r"C:\Users\gmbjzg\Desktop\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path=dirver_path)
driver.get("https://www.baidu.com")
2.常用API详解
2.1元素定位
我们可以通过以下几种方式定位元素
id选择器
driver.find_element_by_id('kw')
类选择器
driver.find_element_by_class_name('submit')
标签选择器
driver.find_element_by_tag_name('input')
xpath定位
driver.find_element_by_xpath('//div')
css选择器
driver.find_element_by_css_selector('#box>.top')
还可以根据input标签的name属性定位表单元素
driver.find_element_by_name('pwd')
2.2表单元素操作
input 输入框
模拟输入
inputTag = driver.find_element_by_id('pwd')
inputTag.send_keys('python')
清空输入框
inputTag.clear()
button 按钮
模拟点击
inputTag = driver.find_element_by_id('kw')
inputTag.click()
checkbox 记住我
模拟点击
rememberTag = driver.find_element_by_id("remember")
rememberTag.click()
select 下拉菜单
模拟选中选项
from selenium.webdriver.support.ui import Select
selectTag = Select(driver.find_element_by_name("Menu"))
selectTag.select_by_index(1)
selectTag.select_by_index(2)
3.链式调用
from selenium.webdriver import ActionChains
dirver_path = r"C:\Users\gmbjzg\Desktop\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path=dirver_path)
# 定位标签
inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
# 链式调用
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.click(submitTag)
actions.perform()
4.获取网页cookie
获取网页所有cookie信息
driver.get_cookies()
获取某个cookie值
driver.get_cookie(key)
5.页面标签切换
# 打开一个新的标签页(JS注入)
driver.execute_script("window.open(%s)" % url)
# 切换到新页面
driver.switch_to_window(driver.window_handles[1])
6.等待页面加载
隐式等待(强制等待几秒钟)
driver = webdriver.Chrome(executable_path=driver_path)
driver.get("https://www.douban.com/")
driver.implicitly_wait(10)
显示等待(如果元素加载完成,则不再等待,指定等待多长时间后不再等待)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
driver.get("http://www.baidu.com")
element = WebDriverWait(driver, 10).until(
expected_conditions.presence_of_element_located((By.ID, "pwd"))
)
7.关闭页面和浏览器
示例代码如下
driver.close() # 关闭当前页面
driver.quit() # 退出浏览器
8.案例实战
最后以自动登录某教务系统为例作结束本篇文章
网址:http://jw.zhku.edu.cn/home.aspx
第一步,打开网页定位元素
我们遇到的第一个问题就是这个网站是使用iframe标签嵌套的,如果直接定位元素是无法获取的。需要先切换到iframe标签,再进行操作。
示例代码如下
# 切换到iframe标签
driver.switch_to.frame("frm_login")
第二步,获取标签元素
# 元素获取
xhInputTag = driver.find_element_by_id("txt_asmcdefsddsd")
pwdInputTag = driver.find_element_by_id("txt_psasas")
yzmInputTag = driver.find_element_by_id("txt_sdertfgsadscxcadsads")
imgCodeTag = driver.find_element_by_id("imgCode")
submitTag = driver.find_element_by_name("btn_login")
第三步,表单填值
# 表单填值
actions = ActionChains(driver)
actions.move_to_element(xhInputTag)
actions.send_keys_to_element(xhInputTag, "学号")
actions.move_to_element(pwdInputTag)
actions.send_keys_to_element(pwdInputTag, "密码")
actions.move_to_element(yzmInputTag)
这里遇到了第二个问题就是需要识别图片验证码。并且首页加载的时候,图片验证码是不显示的,需要先点击一下验证码输入框。
示例代码如下
yzmInputTag.click()
获取验证码
imgCodeTag.screenshot('yzm.jpg')
识别验证码,直接调用第三方接口。这个验证码识别接口是在百度上随手一搜的,大家可自行找一个打码平台。
图鉴验证码识别:http://www.ttshitu.com/
# 识别验证码
def base64_api(uname, pwd, img, typeid):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"]
return ""
# 3 代表中英文
yzmCode = base64_api('账号', '密码', 'yzm.jpg', 3)
验证码输入
输入验证码
actions.send_keys_to_element(yzmInputTag, yzmCode)
actions.move_to_element(submitTag)
actions.click(submitTag)
第四步, 登录执行
执行
actions.perform()
第五步,去除弹窗确认
当我们成功登录之后,会有一个别处已下线的弹窗确认,我们需要去除这个弹窗确认 示例代码如下
# 5.执行
driver.switch_to.alert.dismiss()
完整代码如下:
from selenium import webdriver
from selenium.webdriver import ActionChains
import base64
import json
import requests
dirver_path = r"C:\Users\gmbjzg\Desktop\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path=dirver_path)
driver.get("http://jw.zhku.edu.cn/home.aspx")
# 切换到iframe标签
driver.switch_to.frame("frm_login")
# 1.元素获取
xhInputTag = driver.find_element_by_id("txt_asmcdefsddsd")
pwdInputTag = driver.find_element_by_id("txt_psasas")
yzmInputTag = driver.find_element_by_id("txt_sdertfgsadscxcadsads")
imgCodeTag = driver.find_element_by_id("imgCode")
submitTag = driver.find_element_by_name("btn_login")
# 5.表单填值
actions = ActionChains(driver)
actions.move_to_element(xhInputTag)
actions.send_keys_to_element(xhInputTag, "")
actions.move_to_element(pwdInputTag)
actions.send_keys_to_element(pwdInputTag, "")
actions.move_to_element(yzmInputTag)
yzmInputTag.click()
# 2.获取验证码
imgCodeTag.screenshot('yzm.jpg')
# 3.识别验证码
def base64_api(uname, pwd, img, typeid):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"]
return ""
yzmCode = base64_api('', '', 'yzm.jpg', 3)
# 4.输入验证码
actions.send_keys_to_element(yzmInputTag, yzmCode)
actions.move_to_element(submitTag)
actions.click(submitTag)
# 5.执行
actions.perform()
# 6.去除弹窗确认
driver.switch_to.alert.dismiss()
通过这个案例,相信大家对selenium工具的使用已经有初步的认识啦!更多好玩的东西就留给大家自己发掘了。
最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!