zoukankan      html  css  js  c++  java
  • selenium2自动处理验证码

    最近在研究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

  • 相关阅读:
    第三次作业
    读大道至简第三章有感
    AlphaMobileControls介绍
    wince下GetManifestResourceStream得到的Stream是null的解决
    Wince下实现ImageButton
    windows phone 8的新特性
    没有开发者账号,如何解锁wp8设备
    windows phone8手机玩玩
    windows phone7开发环境配置错误
    如何解决office2007每次打开都要正在配置
  • 原文地址:https://www.cnblogs.com/yajing-zh/p/5121982.html
Copyright © 2011-2022 走看看