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