這是我第一次發博客,若有問題,請多多指教!
本次是為了幫忙解決,如果在平時自動化遇到有驗證碼填寫的情況,我們如何成功登錄情況。
- 思路:
首先我們先將驗證碼復制並保存成一個圖片,然后使用tesseract-ocr這個光學軟件識別成txt文件,接着我們只要讀取txt文件的內容即可
2. 使用工具:
Eclipse、selenium、火狐、log4j、AUTOIT_3.3.14.1、tesseract-ocr
3. 安裝軟件
I. eclipse安裝,直接網上下載並安裝即可
II.Selenium和log4j,這兩個是個jar包,只需要下載下來即可,然后我們建立項目的時候,可以建立一個文件lib保存起來
如圖:

如何使用這兩個jar包?項目à右鍵—>構建路徑à配置購置路徑à點擊添加jarj即可

III.火狐安裝,建議默認安裝吧。免得到時候在代碼還需添加一句尋找火狐的路徑
IV.AUTOIT_3.3.14.1安裝,為什么安裝這個呢?是為了解決window自帶的操作,例如保存,因為我需要用到另存為圖片,所以這個可以幫我解決。安裝嘛,我是直接一直next
V. tesseract-oc,同理安裝,不過需要重啟一下電腦,它才會把路徑寫入path
- 解決驗證碼的步驟
public static void baoCunTuPian(WebDriver driver) throws AWTException, InterruptedException{
//右鍵點擊瀏覽器的屬性
Actions action = new Actions(driver);
action.contextClick(driver.findElement(By.id("ImageButton1"))).build().perform();
System.out.print("右鍵打開瀏覽器屬性成功\n");
Robot robot = new Robot();
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_DOWN);
System.out.print("移動到查看圖像");
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_DOWN);
System.out.print("移動到復制圖像" +
"\n");
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_DOWN);
System.out.print("移動到復制圖像地址\n");
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_DOWN);
System.out.print("移動到將圖像另存為\n");
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_ENTER);
Thread.sleep(1000);
System.out.print("點擊圖像彈出另存\n");
robot.keyRelease(KeyEvent.VK_DOWN);//釋放向下鍵,不然在此之前的條目將起作用
Thread.sleep(1000);
try {
Runtime.getRuntime().exec("c:\\test11.exe");//運行保存
System.out.print("保存圖片成功\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
這段代碼分兩部分來解讀:右鍵彈出屬性和保存圖片

我們將鼠標的位置指向驗證碼的圖片,然后右鍵點擊
如圖:

然后我們需要找到“將圖像另存為”

這段代碼就是描述我們如何找到另存並保存起來
接着,彈出來的另存為的操作就不再是java能夠操作的了,我們這時候需要用到另外類似VB的腳本語言,於是我們的AUTOIT登場了。

使用AutoitInfo.exe來定位


然后打開我們的腳本編寫工具SciTE.exe

PS:其實下面的那段代碼我也不是很懂

本段代碼是為了清理我要存在圖片路徑是否存在同名,如果同名先刪除同名圖片

這段代碼是將我們另存的圖片名為a.png,然后保存到c盤。
我們寫好了這段代碼之后,接着使用ctrl+F7,即可將它變為EXE文件。如果報病毒,請不要理它,保證百分百沒有病毒的。

好了我們接着就需要調用我們的腳本。我的腳本名字為test11.exe,保存在本機的C盤
OK,我們現在就已經把圖片的保存位置搞定。接着我們需要用tesseract-ocr這個軟件來識別我們的圖片內容,使用的代碼是dos命令,
命令如下:tesseract.exe c:/a.png c:/a -psm 6
意思是:將C盤下的a.png識別並保存到C盤的a.txt
有些人用 tesseract.exe c:/a.png c:/a -l 就解決了,我的不知道為何需要用-psm 6才能解決
我們將這條命令保存為.bat格式即可

然后,我們用java的Runtime.getRuntime().exec() 這個方法就可以調用。
既然已經保存為文件格式,那么我們就需要來讀取文件的內容,讀取文件內容的代碼,我也不講述了
public static String txt2String(File file){
String result = "";
try{
BufferedReader br = new BufferedReader(new FileReader(file));//構造一個BufferedReader類來讀取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次讀一行
result = result + "\n" +s;
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return result;
}
主方法調用
File file = new File("c:/a.txt");//讀取文件
System.out.println(txt2String(file)+"a");
存在的問題:orc識別率還是很低,登錄成功幾率還沒有超過90%,有待提高
解決方案:訓練orc的識別率(有時間再推出類似相關的文章)
