本篇文章将介绍selenium
自动化测试工具。看完这篇文章,完全有能力写出一个抢课脚本。文章最后有一个教务网的实战案例,包括验证码识别,自动化处理流程分析。
1.环境搭建 1.1下载驱动程序
以谷歌浏览器为例
下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads
1.2安装selenium
1.3 基本测试
编写代码,如果程序能正常启动,那么环境搭建就没有问题。
1 2 3 4 5 6 7 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元素定位
我们可以通过以下几种方式定位元素
1 driver.find_element_by_id('kw' )
1 driver.find_element_by_class_name('submit' )
1 driver.find_element_by_tag_name('input' )
xpath
定位
1 driver.find_element_by_xpath('//div' )
css
选择器
1 driver.find_element_by_css_selector('#box>.top' )
还可以根据input
标签的name属性定位表单元素
1 driver.find_element_by_name('pwd' )
2.2表单元素操作
input
输入框
模拟输入
1 2 inputTag = driver.find_element_by_id('pwd') inputTag.send_keys('python')
清空输入框
button
按钮
模拟点击
1 2 inputTag = driver.find_element_by_id('kw' ) inputTag.click()
checkbox
记住我
模拟点击
1 2 rememberTag = driver.find_element_by_id("remember" ) rememberTag.click()
select
下拉菜单
模拟选中选项
1 2 3 4 5 6 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.链式调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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
信息
获取某个cookie值
5.页面标签切换 1 2 3 4 driver.execute_script("window.open(%s)" % url) driver.switch_to_window(driver.window_handles[1 ])
6.等待页面加载 隐式等待(强制等待几秒钟)
1 2 3 4 5 driver = webdriver.Chrome(executable_path=driver_path) driver.get("https://www.douban.com/") driver.implicitly_wait(10)
显示等待(如果元素加载完成,则不再等待,指定等待多长时间后不再等待)
1 2 3 4 5 6 7 8 9 from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditionsfrom 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.关闭页面和浏览器 示例代码如下
1 2 driver.close() driver.quit()
8.案例实战 最后以自动登录某教务系统为例作结束本篇文章
网址:http://jw.zhku.edu.cn/home.aspx
第一步,打开网页定位元素
我们遇到的第一个问题就是这个网站是使用iframe
标签嵌套的,如果直接定位元素是无法获取的。需要先切换到iframe
标签,再进行操作。
示例代码如下
1 2 # 切换到iframe标签 driver.switch_to.frame("frm_login")
第二步,获取标签元素
1 2 3 4 5 6 # 元素获取 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")
第三步,表单填值
1 2 3 4 5 6 7 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)
这里遇到了第二个问题就是图片验证码,我们需要识别图片验证码。并且首页加载的时候,图片验证码是不显示的,需要先点击一下验证码输入框
示例代码如下
获取验证码
1 imgCodeTag.screenshot('yzm.jpg' )
识别验证码,直接调用第三方接口。这个验证码识别接口是在百度上随手一搜的,大家可自行找一个打码平台。
图鉴验证码识别:http://www.ttshitu.com/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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 )
验证码输入
1 2 3 4 输入验证码 actions.send_keys_to_element(yzmInputTag, yzmCode) actions.move_to_element(submitTag) actions.click(submitTag)
第四步, 登录执行
第五步,去除弹窗确认 当我们成功登录之后,会有一个别处已下线的弹窗确认,我们需要去除这个弹窗确认 示例代码如下
1 2 # 5.执行 driver.switch_to.alert.dismiss()
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 from selenium import webdriverfrom selenium.webdriver import ActionChainsimport base64import jsonimport 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" ) 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' )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 ) actions.send_keys_to_element(yzmInputTag, yzmCode) actions.move_to_element(submitTag) actions.click(submitTag) actions.perform() driver.switch_to.alert.dismiss()
通过这个案例,相信大家对selenium工具的使用已经有初步的认识啦!更多好玩的东西就留给大家自己发掘了。
参考文档
1.https://selenium-python.readthedocs.io/installation.html#introduction
2.https://www.cnblogs.com/wulisz/p/7722178.html
3.https://blog.csdn.net/huilan_same/article/details/52200586