最近新入職了一家公司,果真一進去就給了一個很大的坑。模擬用戶登陸XX網站 。這是要玩圖像識別的節奏啊。。。嚇尿了 趕忙度娘一波。html
`java
<dependency> <groupId>org.sele~~~~niumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.0</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>3.141.0</version> </dependency> <dependency>~~~~ <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>2.41.0</version> </dependency>`
其中chromedriver.exe能夠在網址http://chromedriver.storage.g... 注意版本問題, 查看本地chrom版本並下載對應的chromedriver.exe, 版本對應可在版本明細中的notes.txt頁面查看web
public class SeleniumUtil { private static final ChromeOptions chromeOptions = new ChromeOptions(); static { System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe"); Map<String, Object> chromePrefs = CollUtil.newHashMap(); //禁止彈窗 chromePrefs.put("profile.default_content_settings.popups", 0); //下載地址 // chromePrefs.put("download.default_directory", "C://xx//"); //禁止圖片加載 // chromePrefs.put("profile.managed_default_content_settings.images", 2); //userAgent=ie11 String userAgentIE11="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"; chromePrefs.put("profile.general_useragent_override", userAgentIE11); HashMap<String, Object> mobileEmulation = new HashMap<String, Object>(); //用iPhone X 屏幕啓動 // mobileEmulation.put("deviceName","iPhone X"); chromeOptions.setExperimentalOption("prefs",chromePrefs); chromeOptions.setExperimentalOption("mobileEmulation",mobileEmulation); /***********************************如下設置啓動參數******************************************/ //消除安全校驗 chromeOptions.addArguments("--allow-running-insecure-content"); //啓動最大化,防止失去焦點 chromeOptions.addArguments("--start-maximized"); //關閉gpu圖片渲染 chromeOptions.addArguments("--disable-gpu"); } /** * 獲取瀏覽器對象直接操做 * @return */ public static WebDriver build(ChromeOptions chromeOptions) { WebDriver dr = new ChromeDriver(chromeOptions); dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); return dr; } /** * 獲取瀏覽器對象直接操做 * @return */ public static WebDriver build() { return SeleniumUtil.build(chromeOptions); } public static final String SOCIAL_INSURANCE_URL = "自定義須要模擬的網址"; /** * 查詢頁面元素並設置值 * @param driver * @param szsbEnum * @param var1 */ public static void findAndSave(WebDriver driver,SzsbEnum szsbEnum,CharSequence... var1){ WebElement element ; if ((element = findElement(driver,szsbEnum))!= null) element.sendKeys(var1); } /** * 搜索頁面元素而且點擊 * @param driver * @param szsbEnum */ public static void findAndClick(WebDriver driver,SzsbEnum szsbEnum){ findElement(driver,szsbEnum).click(); } /** * 搜索頁面元素而且點擊 * @param driver * @param szsbEnum */ public static void findAndClick(WebDriver driver,SzsbEnum szsbEnum,ThreadLocal<Map<SeleniumUtil.SzsbEnum,Integer>> threadLocal){ Integer integer = threadLocal.get().get(szsbEnum); if (integer == null){ findElement(driver,szsbEnum).click(); }else { findElement(driver,szsbEnum,integer).click(); } } /** * 搜索頁面元素而且點擊 * @param driver * @param szsbEnum */ public static void findAndClick(WebDriver driver,SzsbEnum szsbEnum,int wait){ findElement(driver,szsbEnum,wait).click(); } /** * 查詢單個頁面元素 * @param driver * @param szsbEnum * @param wait 等待因子 * @return */ public static WebElement findElement(WebDriver driver,SzsbEnum szsbEnum,int wait){ WebElement element = null; int a = 0; By[] bys = szsbEnum.getBy(); for (By by : bys) { if (a > bys.length*3) break; //判斷元素是否可用 WebElement element1 = null; try { element1 = driver.findElement(by); } catch (Exception e) { e.printStackTrace(); } if (element1!=null && element1.isDisplayed() && element1.isEnabled()){ element = element1; }else { a++; try { Thread.sleep(wait*1000); } catch (InterruptedException e) { e.printStackTrace(); } } } if (element == null) throw new SelemiumNotFoundException("Selenium cannot find element : " + szsbEnum.by,szsbEnum); return element; } /** * 查詢單個頁面元素 * @param driver * @param szsbEnum * @return */ public static WebElement findElement(WebDriver driver,SzsbEnum szsbEnum){ return findElement(driver,szsbEnum,1); } /** * 查詢頁面多個頁面元素 * @param driver * @param szsbEnum * @return */ public static List<WebElement> findElements(WebDriver driver,SzsbEnum szsbEnum){ return driver.findElements(szsbEnum.getBy()[0]); } public enum SzsbEnum{ /* login */ USER_NAME_INPUT_SELECT(By.id("userNameInput")), LOGIN_YZM_ID(By.id("yzm")), USER_PWD_INPUT_SELECT(By.id("userPwdInput")), INFO_ALERT(By.className("dw-res-wnd-header-closebtn-ext")), // INFO_ALERT(By.id("dw_button_f3e0d7a3_a373_4df1_b1ae_25ee3adad2d3")), LOGIN_BUTTON(By.xpath("//div[@id='f_cont']/div[1]/div[1]/div[1]/form/div[6]/div[1]")), INDEX_CBDJGL(By.id("returnYwsb('F02000')")), INDEX_RYPLCB(By.id("grcbdjgl-p2")), INDEX_RYPLTJ(By.id("grcbdjgl-p4")), INDEX_STOP_DRBPWJ(By.xpath("//div[contains(string(),'導入報盤文件')]")), INDEX_STOP_DRBPWJ_NEXT(By.name("btn_goNext")), INDEX_FILEUPLOAD(By.name("fileupload")), // INDEX_FORM(By.id("__dw_sform_form_1b997ea4_2600_4c95_bd35_59883bc7514a_form")), INDEX_FILEUPLOAD_BTN(By.name("btnUpload")), LOGIN_VALIDATA_INPUT(By.id("validatecode1")); private By[] by; SzsbEnum(By... by){ this.by = by; } public By[] getBy(){ return this.by; } } }
`chrome
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.3.1</version> <exclusions> <exclusion> <groupId>com.sun.jna</groupId> <artifactId>jna</artifactId> </exclusion> </exclusions> </dependency>
`api
訓練庫下載地址 : https://sourceforge.net/projects/tess4j/files/瀏覽器
下載完以後解壓 將 tessdata 複製到resource目錄下安全
下載地址 :https://sourceforge.net/projects/opencvlibrary/files/4.1.1/opencv-4.1.1-vc14_vc15.exe/download
下載完是一個.exe 文件 直接安裝以後會生成一個目錄
將jar包引入項目
`框架
<dependency> <groupId>org.opencv</groupId> <artifactId>opencv</artifactId> <version>4.1.1</version> <scope>system</scope> <systemPath>${project.basedir}/lib/opencv-411.jar</systemPath> </dependency>`
還沒完 將剛纔目錄下的 x64 目錄下有個opencv_java411.dll文件 ,放到項目的resource目錄下,而後在項目初始化中引入
`maven
String opencvLib = System.getProperty("user.dir") + "\\src\\main\\resources\\opencv"; addLibraryDir(opencvLib); System.load(opencvLib+"\\opencv_java411.dll");
`
addLibraryDir 代碼也貼一下ide
public void addLibraryDir(String libraryPath) throws IOException { try { Field field = ClassLoader.class.getDeclaredField("usr_paths"); field.setAccessible(true); String[] paths = (String[]) field.get(null); for (int i = 0; i < paths.length; i++) { if (libraryPath.equals(paths[i])) { return; } } String[] tmp = new String[paths.length + 1]; System.arraycopy(paths, 0, tmp, 0, paths.length); tmp[paths.length] = libraryPath; field.set(null, tmp); } catch (IllegalAccessException e) { throw new IOException( "Failedto get permissions to set library path"); } catch (NoSuchFieldException e) { throw new IOException( "Failedto get field handle to set library path"); } }
好了,到這邊算是初始化完成。圖像識別的代碼下一章貼一下,否則一章東西太多寫不下。