python+selenium实现登录账户后自动点击的示例


Posted in Python onDecember 22, 2017

公司在codereview的时候限制了看代码的时间,实际上不少代码属于框架自动生成,并不需要花费太多时间看,为了达标,需要刷点时间(鼠标点击网页固定区域)。我想到可以利用自动化测试的手段完成这种无效的体力劳动。

首先,明确一下需求:

  1. 自动打开网页
  2. 登陆账号 
  3. 每隔一定时间点击一下固定区域

我想到的方案有两个,sikuli或者python+selenium。sikuli的优点是逻辑操作简单直接,使用图片作为标示,缺点是需要窗口固定,并且无法后台运行。selenium稍复杂一定,但是运行速度快,窗口可以遮挡。

这里简单记录一下使用Python+selenium的小例子。

使用的版本为Python3.3以及selenium2,Windows环境(现在已经支持3.0以上的了,多处论坛博客没有更新)。

首先是软件的安装,Python不赘述了,记得设置环境变量。

下面安装selenium,如果已经安装过pip。直接运行一下命令。

pip install -U selenium

另一种方式,https://pypi.python.org/packages/source/s/selenium/selenium-2.52.0.tar.gz下载并解压。这里简述一下windows版本,其实Unix下也差不多,使用Wget下载一下安装。

使用命令(setup一般用于第三方模块的安装):

cd c:\Python3\xxxx
python setup.py install

安装过程中可能会出现ImportError: No module named setuptools,这是因为缺少setuptools模块,Python默认不安装。

在http://pypi.python.org/pypi/setuptools上面提供了各系统的安装包和安装指南,对于Windows系统,下载https://bootstrap.pypa.io/ez_setup.py自动化安装脚本。

运行:

python ez_setup.py

完成后再安装selenium即可。

这里用我自己的实例简单的讲解一下流程。

第一步先完成打开浏览器。

selenium2结合了selenium和webdriver,直接引入各个浏览器相应的驱动,打开即可,注意chrome驱动可能需要另行安装。

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')

打开网页后需要登录,F12打开浏览器调试器,小箭头选取元素,查看登录框账号和密码的属性,一般都有ID。selenium可以通过以下各个方法获取元素并进行各种操作,具体解释请看上方链接文档:

  1. find_element_by_id
  2. find_element_by_name
  3. find_element_by_xpath
  4. find_element_by_link_text
  5. find_element_by_partial_link_text
  6. find_element_by_tag_name
  7. find_element_by_class_name
  8. find_element_by_css_selector

其中id最为有效方便,优先考虑。选取完元素之后可以通过WebDriver API调用模拟键盘的输入和鼠标的点击操作。代码如下:

username="qun" 
passwd="passwd"
browser = webdriver.Firefox()
browser.get('https://www.xxx.com')
browser.implicitly_wait(10)
elem=browser.find_element_by_id("loginFormUserName")
elem.send_keys(username)
elem=browser.find_element_by_id("loginFormPassword")
elem.send_keys(passwd)
elem=browser.find_element_by_id("loginFormSubmit")
elem.click()

一般登录之后页面都会跳转到新的网页上,如何获取新的网页呢?这里有个窗口句柄的概念,通过切换窗口句柄来完成。注意!有时候元素在一个frame里面的时候,也需要通过swtich切换。这里出现一个wait函数(上面也有),是因为页面加载需要时间,很可能在点击之后元素才加载出来,下一节详细解释一下wait。

browser.implicitly_wait(10)
browser.switch_to_window(browser.window_handles[-1])

之后选取需要点击的区域,这里使用 xpath定位,因为在自动化测试的过程中,很有可能元素无法通过id,name等方法定位(不少人就是不写,爱table套table,我也么办法),xpath就有了用武之地。常用的偷懒方法是Firefox安装xpath插件,右键直接获取。这里不介绍,因为不提倡,使用插件会造成代码里充斥这样的东西:

XPath(/html/body/div/div[3]/div[2]/div[4]/p[2])

不到万不得已,尽可能使用元素的特征来定位,比如按钮的name。

或者通过父元素定位子元素。

username =browser.find_element_by_xpath("//input[@name='username']")
clear_button = browser.find_element_by_xpath("//form[@id='loginForm']/input[4]")

代码如下,网上经常出现的By的用法需要引入包。

from selenium.webdriver.common.by import By

这里使用另外一个函数,我不知道有什么区别- -。

for i in range(100):
  elem=WebDriverWait(browser, 30).until(
    lambda x:x.find_element_by_xpath("//table[@class='aaa']"/td[1]))
  elem.click()
  time.sleep(20)
  print ("click",i)

然后这里还要提一下wait函数,在selenium2中延迟等待分为两种,显示等待和隐式等待。  

显示等待

显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception。

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )

隐式等待

注意,隐式等待是告诉设置所有dom元素在寻找某个元素的时候,如果没立即找到,再尝试这么长时间。

browser.implicitly_wait(10) # seconds

两者的区别在于一个是自己直接管理超时对象,一个是交给webdriver去做。

当然也可以用休眠的方法干等。记得引入time包。

time.sleep(20)

这里只是简单的演示一下用法,有许多可以改进的地方,没有封装函数,么有使用多线程并发执行多个例程。以后有需求再改进。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
Python实现的排列组合计算操作示例
Oct 13 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
python 检查是否为中文字符串的方法
Dec 28 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
python与js主要区别点总结
Sep 13 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
python实现决策树
Dec 21 #Python
python利用sklearn包编写决策树源代码
Dec 21 #Python
python实现决策树分类算法
Dec 21 #Python
Python语言描述机器学习之Logistic回归算法
Dec 21 #Python
python Crypto模块的安装与使用方法
Dec 21 #Python
python编写Logistic逻辑回归
Dec 30 #Python
python+selenium识别验证码并登录的示例代码
Dec 21 #Python
You might like
如何用PHP实现插入排序?
2013/04/10 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
jquery.validate的使用说明介绍
2013/11/12 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
Python中url标签使用知识点总结
2020/01/16 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
策划助理岗位职责
2013/11/18 职场文书
精彩的广告词
2014/03/19 职场文书
环保倡议书50字
2014/05/15 职场文书
企业愿景口号
2015/12/25 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫