WebDriver環境搭建使用

孫悟空空發表於2019-03-21

1. WebDriver簡介

利用瀏覽器原生的API,封裝成一套更加物件導向的Selenium WebDriver API。直接操作瀏覽器頁面裡的元素,甚至操作瀏覽器本身(截圖,視窗大小,啟動,關閉,安裝外掛,配置證照之類的)

2. 環境搭建

使用webdriver需要三個前提:瀏覽器(服務端安裝的真實的瀏覽器), webdriver驅動(可執行程式), webdriver api(程式呼叫包)。本文使用的是 google chrome瀏覽器, chromdriver, 和 selenium,這三者是有版本限制的,若不匹配則可能不能正常執行的情況。匹配的版本之一:

  1. Google chrome 69 chrome 會定時更新,所以要禁止chrome更新版本
  2. chromdriver 2.42 下載地址 http://chromedriver.storage.googleapis.com/index.html
  3. selenium 2.44.0 maven配置如下
	      <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.44.0</version>
          </dependency>

將chromdriver.exe放到chrome.exe所在的資料夾下。如下圖所示
在這裡插入圖片描述

3. 使用

  1. 啟動瀏覽器
      // 設定驅動位置
	  System.setProperty("webdriver.chrome.driver", "C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe");
	  WebDriver driver = new ChromeDriver();
	  // 請求url
	  driver.get(url);
	  // 獲得元素
	  WebElement element = driver.finElement(By.xpath("//div"));

使用XPath查詢元素是筆者推薦的一種方式,XPath語法簡單,功能強大。

  1. 截圖
    WebDriver是可以擷取頁面上任意一個元素的圖片的,程式碼如下:
public byte[] getImageFromDriver(WebDriver driver, String imageType) {
        try {
		    // 獲得要截圖的元素
		    WebElement captchaImageElement = driver.finElement(By.className("Img"));
            // 螢幕截圖物件
            TakesScreenshot takesScreenshot = (TakesScreenshot) driver;
            // 獲取截圖byte
            byte[] screen = takesScreenshot.getScreenshotAs(OutputType.BYTES);
            BufferedImage img = ImageIO.read(new ByteArrayInputStream(screen));
            // 獲得元素的高度和寬度
            int width = imageElement.getSize().getWidth();
            int height = imageElement.getSize().getHeight();
            // 獲得元素座標
            Point point = imageElement.getLocation();
            BufferedImage dest = img.getSubimage(point.getX(), point.getY(), width, height);
            // 存為png格式
            ByteArrayOutputStream byteout = new ByteArrayOutputStream();
            ImageIO.write(dest, imageType, byteout);
            return byteout.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

4. 注意事項

driver.close() 只是關閉瀏覽器視窗,其程式還存在(遇到的坑)
driver.quit() 關閉瀏覽器,並關閉程式

5. 總結

據說有了webdriver,讓爬蟲穿上了盔甲。筆者同意呀!!

相關文章