python+selenium实现登录账户后自动点击的示例
作者:lijun538 发布时间:2021-07-26 05:40:21
公司在codereview的时候限制了看代码的时间,实际上不少代码属于框架自动生成,并不需要花费太多时间看,为了达标,需要刷点时间(鼠标点击网页固定区域)。我想到可以利用自动化测试的手段完成这种无效的体力劳动。
首先,明确一下需求:
自动打开网页
登陆账号
每隔一定时间点击一下固定区域
我想到的方案有两个,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可以通过以下各个方法获取元素并进行各种操作,具体解释请看上方链接文档:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
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)
这里只是简单的演示一下用法,有许多可以改进的地方,没有封装函数,么有使用多线程并发执行多个例程。以后有需求再改进。
来源:http://blog.csdn.net/lijun538/article/details/50695914
猜你喜欢
- 如下所示:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional
- 需求场景,五百个文件里面,选取50个指定文件,放入新的文件夹里。1、准备工作1 安装python环境可能会报错,并且pip install
- 一:安装Anaconda和Tensorflow步骤:1:从官方网站下载Anacondahttps://www.anaconda.com/do
- 利用PHP中的thinkphp5进行项目开发,将view一道项目跟目录下进入到/www/wwwroot/xxxx/application/c
- 本文实例讲述了Python生成器定义与简单用法。分享给大家供大家参考,具体如下:一、什么是生成器在Python中,由于受到内存的限制,列表容
- 引言python中的模块、库、包有什么区别?module:一个 .py 文件就是个 modulelib:抽象概念,和另外两个不是一类,只要你
- 一、项目效果学校宿舍今天搬家,累麻了,突然发现展示处理的也很粗糙,就这样吧嘿嘿~~~二、核心流程1、openCV读取视频流、在每一帧图片上画
- 安装方法一: ①进入python文件夹执行指令(前提是支持pip指令):pip3 install Beautifulsoup4②回
- msgpackMessagePack是一种高效的二进制序列化格式。它允许你在多种语言(如JSON)之间交换数据。但它更快更小。golang
- declare @t varchar(255),@c varchar(255) declare table_cursor cursor fo
- 对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比。在本质上,list的排序和内
- 1 概述1.1 贪心算法贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选
- 我们学习编程,在学习的时候,会有想把有用的知识点保存下来,我们可以把知识点的内容爬下来转变成pdf格式,方便我们拿手机可以闲时翻看,是很方便
- mysql中全连接full join...on...用法大部分开发者可能会困惑,为什么我的sql语句怎么写都是错的。很简单因为full jo
- 除了使用Django内置表单,有时往往我们需要自定义表单。对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误&qu
- 一、条件简化我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器会为我们简化这
- 索引概述介绍索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这
- 1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句:CREA
- 多数据插入只要写一次insert,可以插入多条数据基本语法:insert into 表名 [(字段列表)] values (值列表), (值
- 实验环境:windows 7,anaconda 3(Python 3.5),tensorflow(gpu/cpu)函数介绍:标准化处理可以使