最近在研究web自动化,登录时发现要输入验证码,之前在做手机app自动化时,就被验证码block了。这次做web时又遇到了,探索之后,发现有如下几个解决办法:

1.联系开发人员,让其帮忙在测试环境中注释掉验证码操作,这样极大方便了测试人员,同时也降低了在正式环境中跑测试,给系统带来的风险;

2.联系开发人员,修改成万能验证码。即在程序中留一个“后门”---设置一个“万能验证码”,只要用户输入这个“万能验证码”,程序就认为验证通过,否则按照原先的验证方式进行验证。

3.添加cookies

在使用webdriver测试中,cookie能够实现不必再次输入用户名密码进行登陆。

先介绍一下cookies的API:

  1>getDomain();返回cookies的域名

  2>getMaxAge();返回cookies的存活时间

  3>getName();返回cookies的名字

  4>getPath();返回cookies使用的路径

  5>getSecure();如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值

  6>getValue();返回cookies的值

  7>getVersion();返回cookies所遵从的协议版本

  8>setPath(String url);设置cookies的使用路径

  9>setSecure(Boolean flag);设置浏览器是否仅仅使用安全协议来发送cookies,例如使用https或ssl

  10>setValue(String newvaule);cookies创建后设置一个新的值

  11>setVersion();设置cookies所遵从的版本

  12>setComment(String purpose);设置cookies的注释

selenium webDriver通过driver.manage().getCookies()和driver.manage().addCookies(ck)获取并加载cookies。

先获取登录的cookies,并保存到browser.data下,之后打开网址时加载已经保存的cookies。

package com.demo.test.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Date;
import java.util.StringTokenizer;
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver; public class Cookies {
/**
* @author Yajing
*
*/
public static void addCookies() {
WebDriver driver = new FirefoxDriver();
driver.navigate()
.to("http://passport.chinahr.com/pc/tologin?backUrl=http://www.chinahr.com/beijing/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); WebElement user = driver.findElement(By.xpath(".//*[@id='account']"));
user.clear();
user.sendKeys("xxxxxxxxxxx");
WebElement password = driver.findElement(By
.xpath(".//*[@id='secretPWD']"));
password.clear();
password.sendKeys("xxxxxx"); try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} WebElement submit = driver.findElement(By
.xpath(".//*[@id='normalLogin']"));
// submit.submit();
submit.click(); try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} File file = new File("broswer.data");
try {
// delete file if exists
file.delete();
file.createNewFile();
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
for (Cookie ck : driver.manage().getCookies()) {
bw.write(ck.getName() + ";" + ck.getValue() + ";"
+ ck.getDomain() + ";" + ck.getPath() + ";"
+ ck.getExpiry() + ";" + ck.isSecure());
bw.newLine();
}
bw.flush();
bw.close();
fw.close(); } catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("cookie write to file");
}
} public static void main(String[] args) {
addCookies();
WebDriver driver = new FirefoxDriver();
driver.get("http://www.chinahr.com/beijing/");
try {
File file = new File("broswer.data");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
StringTokenizer str = new StringTokenizer(line, ";");
while (str.hasMoreTokens()) {
String name = str.nextToken();
String value = str.nextToken();
String domain = str.nextToken();
String path = str.nextToken();
Date expiry = null;
String dt;
if (!(dt = str.nextToken()).equals(null)) {
// expiry=new Date(dt);
System.out.println();
}
boolean isSecure = new Boolean(str.nextToken())
.booleanValue();
Cookie ck = new Cookie(name, value, domain, path, expiry,
isSecure);
driver.manage().addCookie(ck);
}
} } catch (Exception e) {
e.printStackTrace();
} driver.get("http://www.chinahr.com/beijing/");
}
}

有一点需要说明,在执行addCookies()打开浏览器的时候,登录的时候一定要保证登录时正确的,这样保存的browser.data才有效,否则之后还是不能自动登录。每次执行文件都会重新写browser.data文件,所以只需要执行一次addCookies()拿到正确的browser.data即可。

参考大神博客:http://www.cnblogs.com/tobecrazy/p/3985168.html

selenium2自动处理验证码的更多相关文章

  1. Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

    日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...

  2. Selenium2+python自动化41-绕过验证码(add_cookie)

    前言 验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的.如果你能破解,说明你们公司的验证码吗安全级别不高,那就需要提高级别了. 对于验证码,要 ...

  3. Selenium2+python自动化41-绕过验证码(add_cookie)【转载】

    前言 验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的.如果你能破解,说明你们公司的验证码吗安全级别不高,那就需要提高级别了. 对于验证码,要 ...

  4. python selenium2 有关cookie操作实例及如何绕开验证码

    1.先看一下cookie是啥 cookie是访问web时服务器记录在用户本地的一系列用户信息(比如用户登录信息),以便对用户进行识别 from selenium import webdriver im ...

  5. 《selenium2 python 自动化测试实战》(12)——跳过验证码登录add_cookie

    微信公众号搜索“自动化测试实战”或扫描下方二维码添加关注~~~

  6. python selenium2 模拟点击+拖动 测试对象 58同城验证码

    #!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...

  7. Selenium2+python自动化13-Alert

    不是所有的弹出框都叫alert,在使用alert方法前,先要识别出它到底是不是alert.先认清楚alert长什么样子,下次碰到了,就可以用对应方法解决.alert\confirm\prompt弹出框 ...

  8. Selenium2学习-004-WebUI自动化实战实例-002-百度登录

    此文主要通过 百度登录 功能,进行 Selenium2 的实战实例讲解.文中所附源代码于 2015-01-17 23:33 亲测通过,敬请亲们阅览.同时,您也可参考此文进行其他网站(例如 京东.易迅. ...

  9. Selenium2+Python自动化测试实战

    本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用.后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的 ...

随机推荐

  1. LCD1602显示中文汉字

    小子在西藏 2011-11-25编写 特别说明笔者是上面的作者,感谢那些原意分享知识的人.时隔5年我又看到了笔者当年写的东西,我想这期间还有许许多多的人 今天写在博客上,愿更多后来者可以学习. LCD ...

  2. c#基础3-方法的重载静态和非静态,字段属性,方法

    方法的重载概念:方法的重载指的就是方法的名称相同给,但是参数不同.参数不同,分为两种情况1).如果参数的个数相同,那么参数的类型就不能相同.2).如果参数的类型相同,那么参数的个数就不能相同.***方 ...

  3. leetcode84 Largest Rectangle in Histogram

    思路: 使用单调栈计算每个位置左边第一个比它矮的位置和右边第一个比它矮的位置即可. 实现: #include <bits/stdc++.h> using namespace std; cl ...

  4. There is much opportunity for anyone willing to dedicate himself to his labors.

    There is much opportunity for anyone willing to dedicate himself to his labors.付出努力的人才有机会出人头地.

  5. 行框基线位置确定(line box 基线)

    在设置vertical-align属性(只有inline元素有效,对inline-block和block元素无效)时有一个属性值:baseline,那么这个基线是什么,怎么确定. 这个基线就是其所在行 ...

  6. Easyui validatebox后台服务端验证

    Easyui validatebox的验证提示十分好用,可是在实际项目的运用中,经常会遇到需要服务器验证后并返回验证结果信息,比如验证用户名.手机号.邮箱是否已存在.于是就想着怎么拓展Easyui的验 ...

  7. 日常-acm-韩信点兵

    相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排,五人一排,七人一排地变换队形,而他每次只看一眼队伍的排尾就知道人数了.输入包含多组数据,每组数据包含三个非负整数a,b,c,表示 ...

  8. 用GWT开发的HelloGWT程序

    GWT项目可以通过 命令行和Eclipse插件两种方法创建.创建GWT项目的命令是webAppCreator,具体使用方法可以看GWT的开发文档. Eclipse插件安装完成后,Eclipse的工具条 ...

  9. Python-OpenCV——Image inverting

    通常我们将读入的彩色图转化成灰度图,需要将灰度图反转得到掩码,如何正确快速的得到某个图像的反转图呢? 首先看一种看似很正确的写法,对其中每个像素进行如下处理: img[x,y] = abs(img[x ...

  10. Linux增加sudo用户

    1.  root用户编辑文件/etc/sudoers vi /etc/sudoers 2.  按yy复制行root   ALL=(ALL)      ALL 按p粘贴,修改 “root” 为添加的用户 ...