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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM