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基础教程之popen函数操作其它程序的输入和输出示例
Feb 10 Python
Django中URLconf和include()的协同工作方法
Jul 20 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
Python面向对象之继承代码详解
Jan 29 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
Feb 27 Python
python如何进行矩阵运算
Jun 05 Python
python 基于wx实现音乐播放
Nov 24 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 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
解析数组非数字键名引号的必要性
2013/08/09 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
php创建session的方法实例详解
2015/01/27 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
动态样式类封装JS代码
2009/09/02 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
新闻传媒系求职信范文
2014/04/19 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
旅游文化节策划方案
2014/06/06 职场文书
校长创先争优承诺书
2014/08/30 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
营销经理工作检讨书
2014/11/03 职场文书