背景

写这个脚本纯属是觉得好玩而已,一开始以为很简单,看了大部分网上的代码确实很简单就那么几行,自己也就想试试,后来发现由于这个还涉及了一些html的知识点发现还是没那么简单的,从一开始获取登入按钮的input id到后面打卡按钮无法使用发现还使用了iframe 嵌套的东东,几天下来都是泪;然后网上也很少发现这种比较完整的一条龙教程;所以干脆把这次的过程在这里写成笔记形式记录下,也可以供网友参考参考,文中如有错误请多多指教。

一、环境准备

这里只简单的列下开发时的环境版本:注意版本对应关系一定要对要不然会让你走很多弯路

- python 3.6.2

  • 我是去官网下载的:python官方下载链接
  • 安装方法网上自行搜索 我参照的是:python安装步骤

- selenium 3.13.0

  • 这个可以直接接着pip如果python没有装请先安装pip安装参考:selenium安装步骤

- chrome v59

- chromedriver v2.3

  • chrome与chromedriver 安装时需要有对对应关系的如果关系对不上会出现比如网页打开无法正常输入地址等各种问题,以下时参照网上资料说明安装:注意:再次提醒下面的版本关系对应很重要
  • 这里我们将下载的driver直接放到python的可执行目录这样可以减少配置系统环境变量
  • selenium自动化测试资源整理(含所有版本chrome、chromedriver、firefox下载链接)
  • 从官网更新日志查看各浏览器对应的selenium版本
  • selenium之 chromedriver与chrome版本映射表(更新至v2.40)

二、开发脚本

其实这里代码内容很简单,网上代码随便抓都是,只是要搬过来自己用就未必能用,还是会涉及其他东西需要注意的,废话不多说直接贴源码:

#实现公司上网认证及自动打卡
from time import sleep
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys#上网自动认证函数
def conn():#driver = webdriver.Firefox()driver = webdriver.Chrome()#driver = webdriver.Ie()driver.maximize_window()#设置隐式时间等待driver.implicitly_wait(8) driver.get('http://192.168.1.1/webAuth/')# une 可以通过浏览器F12 然后点击那个鼠标箭头按钮  接着鼠标指到哪里就能定位到哪个元素得到对应的input id、name如果没有则可以用xpath解决#获取对应元素的xpath 可以通过浏览器F12模式定位到对应元素源码然后右键拷贝xpath即可,当然可以通过googel浏览器的xpath helper 更简单#说明1111111111driver.find_element_by_name("une").clear()driver.find_element_by_name("une").send_keys('test')elem_pwd = driver.find_element_by_name("passwd")elem_pwd.clear()elem_pwd.send_keys('test')# 这里我一开始就是因为浏览器版本和chromedrive不对(浏览器版本太高导致下面Keys.ENTER一直无法生效)elem_pwd.send_keys(Keys.ENTER)#elem_pwd.send_keys(Keys.RETURN) //与上面一个一样# 如果元素没有id和name name用xpath 获取 当然我们这里登入借助密码输入之后按类似回车的 效果 省去点击登入按钮#driver.find_element_by_xpath("/html/body/form/div/div/ul/li[2]/table/tbody/tr[3]/td/div/input[1]").click()sleep(2)#driver.close()#直接关闭浏览器driver.quit()#上班打卡函数
def login():#driver = webdriver.Firefox()driver = webdriver.Chrome()#driver = webdriver.Ie()driver.maximize_window()driver.implicitly_wait(8) # 设置隐式时间等待# us ps 分别是账号密码框对应的xpath 这里时xpath的绝对路径虽然网友说不推荐,没办法对xpath不熟就怎么简单怎么来吧# 再次提醒下 这个网页元素对应的xpath可以借助火狐、chrome的F12模式定位到对应按钮、方框的源码后,直接右键复制=》xpath即可得到绝对路径xpath# 如果嫌麻烦可以直接在chrome 下载个xpath helper  然后ctrl+shift+x 开启、shitf+x 然后移动鼠标到对应位置即可显示xpathus ="/html/body/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td[3]/input"ps ="//*[@id=\"logonpassfield\"]"# 输入要打开的页面driver.get('http://test.login.cn/irj/servlet/prt/portal/prtroot/com.sap.portal.navigation.portallauncher.default')driver.find_element_by_xpath(us).clear()driver.find_element_by_xpath(us).send_keys("test")driver.find_element_by_xpath(ps).clear()driver.find_element_by_xpath(ps).send_keys('test')#如果用下面这两个就不用去找 对应的登入按钮了 相当于直接输完密码按回车#elem_pwd.send_keys(Keys.ENTER)#elem_pwd.send_keys(Keys.RETURN)# 通过xpath绝对路径查找登入按钮 后直接click 点击driver.find_element_by_xpath("/html/body/form/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td[6]/table/tbody/tr/td[1]/a/img").click()#这里一定要记得 由于网页中嵌套了多层iframe 得从最顶层一级级进入直到最后需要按钮所在那层我这边是在第3个iframe里面所以要一层层进入下面3个#这个到底是在那一层也是可以接着比如火狐浏览器F12模式,定位到对应元素源码时最底下的一栏可看出来 有如下字样:iframe#iLeftIframe 其中#后面即为frame id#说明2222222222driver.switch_to_frame('ivuFrm_page0ivu0')driver.switch_to_frame('EISBottom')driver.switch_to_frame('iLeftIframe')# 下面是另外一种查找中进入方式 类似 like 包含文件#driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'http://bem.cscs.cn:81/mis/EISTop.aspx')]"))#driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'/mis/EISIndex.aspx')]"))#driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'../hrs/work/UserWork.aspx')]"))#找到需要按的按钮单击它 我这里会跳到新的页面去,下面分别时上班按钮和下班按钮,#上班按钮按下去之后就欧克了所以可以单击完后即可关闭浏览器driver.find_element_by_id("ibOn").click()#如果是上班这里可以关闭浏览器了如果是下班就按下面的逻辑来要到新网页单击某个按钮,我这里测试脚本就搞个简单的上班按钮即可#--------------------------下面注释的是下班卡还不是很完整没包括填写工时,方法都是一样的这里就描述了,我是测试过可以用的#下班按钮要到新的页面点击保存才行, 下面这3个效果一样#driver.find_element_by_id("ibOff").click()#driver.find_element_by_xpath("//*[@id=\"ibOff\"]").click()#driver.find_element_by_xpath("//*[@id=\"ibOff\"]").send_keys(Keys.ENTER)#弹出窗口处理这里也是没软用可以不处理#a=driver.switch_to_alert()#print(a.text)#a.accept()  # 等同于点击“确认”或“OK”#a.dismiss()  # 等同于点击“取消”或“Cancel”#回到第一级 这里目前没软用#driver.switch_to.default_content()#由于上面单击之后切到新的页面了所以这里需要切换页面 得到selenium打开的浏览器的所有句柄 切换导最后一个句柄 下班按钮才需要哦#all_handle = driver.window_handles#driver.switch_to_window(all_handle[-1])# 到新的页面点击某个按钮如果这里不切过来会导致find_element_by_xpath 失败找不到元素#driver.find_element_by_xpath("//*[@id=\"btnsave\"]").click()sleep(2)#关闭浏览器driver.quit()#driver.Dispose()if __name__=='__main__':#调用函数登入打卡print("上班打开......")login()while True:#这里加入30分钟判断一次系统网络是否正常,如果异常则进行上网认证exit_code = os.system('ping www.baidu.com')if exit_code:print("网络异常准备重新认证")conn()else:print("网络正常无需认证")#休眠30分钟sleep(60*30)

- 代码说明(注意还是针对如何获取对应的元素id及xpath这个解决了就好办多了)

  • 元素定位find_element_by_id 函数是需要指定对应元素的id的这个可以通过F12获取如果发现源码中没有类似input id 那么也可以用下面一种方法
  • 元素定位find_element_by_xpath 函数可以用绝对路径的xpath也可以用简写的,我这里只是为了写着玩就怎么简单怎么来直接用绝对路径这样省事,当然除了这两种方法获取元素还有其他方法具体的大家自己去找,参考文章中也有说到。
  • 有些网页涉及嵌套多层网页的比如本文中的打卡按钮发现是嵌套在第3层(有关键字iframe算一层)这时候一定要记得一层层进入,要不然会导致find_element_by_xpath、find_element_by_id无法定位到元素切记,具体怎么看在第几层看下面第3个图片说明(灰常重要)
  • 其中第一处说明见图
    下图就是获取输入用户名的元素iddriver.find_element_by_name("une")

    由于登录按钮没有id和name这里用xpath,下图就是获取登入按钮的xpathdriver.find_element_by_xpath("/html/body/form/div/div/ul/li[2]/table/tbody/tr[3]/td/div/input[1]")

  • 其中第二处说明通过浏览器的F12功能分析查看图标元素对应在网页中第几层iframe嵌套中见图
    通过下图得到了最终按钮所在的层次后需要通过代码一层层进入driver.switch_to_frame('ivuFrm_page0ivu0')
    driver.switch_to_frame('EISBottom')
    driver.switch_to_frame('iLeftIframe')

三、运行

到这里开发工作就完成了,运行很简单比如上面的脚步是保存在一个tt.py的文件中,那么只要在cmd(window的命令提示符)中输入python tt.py 即可执行;文中的脚步只是作为一个测试脚步具体应用比如定时执行还是开机执行,每小时执行,这些都可以通过改造上面的main函数内容,也可以直接写个window的批处理进行运行,网上好像还有将pytho脚步封装成exe的这个大家就自己琢磨去了

参考文章

  • Selenuim+Python之元素定位总结及实例说明
  • Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)
  • selenium之 定位以及切换frame(iframe)

记一次用python selenium 通过chrome+chromedriver 实现公司内网上网自动登入认证、上班自动登入打卡python脚本笔记相关推荐

  1. python selenium headless chrome chromedriver 等安装

    python selenium 略 chrome: https://blog.csdn.net/zhuyiquan/article/details/79537623 6及以下版本不适用 6及以下版本不 ...

  2. 离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中)

    离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中) 参考文章: (1)离线安装python第三方库的实用方法:解决公 ...

  3. 公司内网批量安装python依赖包

    [ERROR]公司内网限制无法从外网自动下载依赖包 [解决方案]在私人电脑配置与公司电脑相同的python环境(python版本),找出要安装的所有依赖项,将其整合到一个requirements.tx ...

  4. Python selenium —— 用chrome的Mobile emulation模拟手机浏览器测试手机网页

    很多人发现chrome有项功能,就是在开发者工具里能够模拟手机打开网页,便想能否用selenium对此进行自动化测试.答案当然是yes! 今天博主便给大家分享下如何用chrome的MobileEmul ...

  5. 99 网络编程_传统网络工程师如何利用python实现公司内网IP地址信息查询?

      网   工   圈 网络工程师阿龙圈内最早的公益公众号,本号已认证!学网络关注我一个就够了(关注近5w+)关注听说99%的网工都来这里充电吖关注我,一个老HCIE(编号3558)带你轻松玩网络技术 ...

  6. python+selenium处理chrome显示通知弹框

    使用chrome打开weibo.com会出现以下界面的弹出框: 这东西不属于页面alert弹框,而是属于浏览器的设置项. 要关掉它,需要对浏览器进行属于配置.具体见下面脚本: 很多人学习python, ...

  7. python + selenium驱动 Chrome 浏览器,browsermobproxy记录har文件

    browsermobproxy是一个java编写的代理服务器,在自动测试中如果需要Chrome 浏览器network中的加载记录,就需要用 启动代理服务器,得到端口号,设置到谷歌的代理地址. brow ...

  8. Python+selenium 自动化-chrome驱动的下载安装

    chrome驱动下载 chrome驱动获取: chromedriver.storage.googleapis.com 如何查看对应浏览器版本的驱动: 不同的版本的驱动支持不同版本的浏览器,所以版本一定 ...

  9. python+selenium设置chrome代理的方式

    方式1: from selenium import webdriver from selenium.webdriver.common.desired_capabilities import Desir ...

最新文章

  1. RHEL5.1安装VM TOOL及中文乱码终极解决方案
  2. 完整版使用Shell脚本在多个服务器同时实现Mysql建表语句和删除表
  3. php下划虚线,什么是下划线符号
  4. 类的主动使用与被动使用等
  5. Win32ASM-进程学习【1】
  6. AcWing 143. 最大异或对
  7. oxite “传入的路由无效”解决方案
  8. 攻击者利用7号信令(SS7)中的漏洞从德国银行偷取钱财
  9. plsql 备份还原 教程_PLSQL导出还原数据库
  10. 简单脱壳教程笔记(6)---手脱FSG壳
  11. sfp寄存器_一种基于Linux系统读写光模块寄存器的方法与流程
  12. NPN和PNP的区别和总结
  13. Mac安装boost
  14. 细粒度的、安全高效的基于区块链数据溯源系统 Fine Grained, Secure and Efficient Data Provenance on Blockchain Systems(一)
  15. 安卓模拟器安装教程_无限多开仙境传说RO!第一安卓模拟器BlueStacks蓝叠安卓模拟器多开教程...
  16. 【app测试】adb常用指令及华为卸载预置软件
  17. 盘点SaaS在高歌猛进路上的16个坑,总有一个你会遇到
  18. Facebook /AdSense/Admob月入过万,你必须要懂的赚钱逻辑及赚钱心态
  19. Spark-core电商分析
  20. 为什么家庭群会引起焦虑,以及如何逃避它?

热门文章

  1. 2015年第六届蓝桥杯B组(C/C++)预赛题目及个人答案
  2. 使用iTOP进行CMDB资产管理
  3. PyTorch Geometric(PyG) torch_geometric.nn.conv.gcn_conv源码详解
  4. 新浪大赚,阿里吃亏------剖析阿里巴巴入股新浪微博
  5. Hi3798CV200DMD_VER.B SCH原理图
  6. 计算机科学数电吗,“不插电的计算机科学”, 你试过吗?
  7. @Transactional注解说明
  8. python爬虫解析数据包_Python网络爬虫之三种数据解析方式
  9. unbound部署DNS
  10. [Revit二次开发] 轴网交点创建柱子