java模擬登陸優酷
阿新 • • 發佈:2018-11-12
好久沒有寫文章分(裝)享(逼)了,趁著國慶節有充足的時間分享一下最近所學。
需求背景
最近被分到一個活,給你一個視訊地址,需要播放這個視訊並錄屏儲存
步驟
- 開啟網頁
- 登陸
- 播放
- 錄屏
疑難問題
- 有些視訊需要登陸以後才能播放
- 有些網站播放需要安裝flash
前期調研
因為要模擬開啟網頁的操作,需要使用瀏覽器,所以想使用無頭瀏覽器去實現。無頭瀏覽器有很多種,因為自己學習的語言是java,所以重點調查了支援java語言的無頭瀏覽器。比較常用的是PhantomJS、Selenium、jBrowserDriver。最終確定使用Selenium,因為另外兩種方式不支援flash播放,那麼有些視訊網站的地址就不能正確播放。
對於登陸的問題,本來決定使用cookie登陸,後來在寫Selenium簡單使用例子的時候覺得可以通過獲取網頁的XPath,模擬填入內容和點選的效果。
前期準備
因為selenium需要依賴驅動,所以首先得安裝drive。以google瀏覽器為例,需要安裝chromedriver。需要注意:
- 安裝的chromedriver需要和google版本一致
- 安裝位置必須和google同一路徑,否則將會報錯:
Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://chromedriver.storage.googleapis.com/index.html at com.google.common.base.Preconditions.checkState(Preconditions.java:847) at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:124) at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32) at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137) at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:339) at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:116) at com.shuwen.test.Selenium2Test.main(Selenium2Test.java:15)
- 新增selenium依賴
編碼實現
- 開啟瀏覽器
//指定chromedriver安裝位置,注意:必須和chrome在同個目錄下 System.setProperty("webdriver.chrome.driver", "/Applications/Google Chrome.app/Contents/MacOS/chromedriver"); //設定google瀏覽器選項 ChromeOptions chromeOptions = new ChromeOptions(); //指定瀏覽器全屏 chromeOptions.addArguments("--start-fullscreen"); //建立chrome WebDriver driver = new ChromeDriver(chromeOptions);
通過 ChromeOptions設定了一些瀏覽器引數,比如希望瀏覽器全屏開啟
執行此段程式碼以後會發現彈出了一個瀏覽器,並且打開了指定的頁面,但是:
需要點選登陸一下才能登陸
- 模擬點選登陸
檢查該頁面
可以很快的獲得xpath為//*[@id="ykPlayer"]/div[2]/div[2]/div[5]/div[2]/a
模擬點選
driver.findElement(By.xpath("//*[@id=\"ykPlayer\"]/div[2]/div[2]/div[5]/div[2]/a")).click();
.click 模擬點選操作
- 輸入賬號密碼登陸
以同樣的方式獲得對應的xpath路徑
賬號xpath://*[@id=\"YT-ytaccount\"]
密碼xpath://*[@id=\"YT-ytpassword\"]
登陸xpath://*[@id=\"YT-nloginSubmit\"]
driver.findElement(By.xpath("//*[@id=\"YT-ytaccount\"]")).sendKeys("YourAccount");
driver.findElement(By.xpath("//*[@id=\"YT-ytpassword\"]")).sendKeys("YourPassword");
driver.findElement(By.xpath("//*[@id=\"YT-nloginSubmit\"]")).click();
.sendKey往輸入框填入指定資料
- 退出瀏覽器
driver.quit();
- 完整demo
package com.cqupt.login.youku;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 模擬登陸優酷
*
* @author hetiantian
* @date 2018/10/01
* */
public class YouKuLogin {
public static void main(String[] args) throws InterruptedException {
//指定chromedriver安裝位置,注意:必須和chrome在同個目錄下
System.setProperty("webdriver.chrome.driver", "/Applications/Google Chrome.app/Contents/MacOS/chromedriver");
//設定google瀏覽器選項
ChromeOptions chromeOptions = new ChromeOptions();
//指定瀏覽器全屏
chromeOptions.addArguments("--start-fullscreen");
//建立chrome
WebDriver driver = new ChromeDriver(chromeOptions);
// 使用它訪問 Google
driver.get("https://v.youku.com/v_show/id_XMzYxMDM4MzY3Ng==.html");
Thread.sleep(2*1000);
//模擬點選登陸
driver.findElement(By.xpath("//*[@id=\"ykPlayer\"]/div[2]/div[2]/div[5]/div[2]/a")).click();
Thread.sleep(2*1000);
//模擬點選登陸
driver.findElement(By.xpath("//*[@id=\"YT-ytaccount\"]")).sendKeys("YourAccount");
driver.findElement(By.xpath("//*[@id=\"YT-ytpassword\"]")).sendKeys("YourPassword");
driver.findElement(By.xpath("//*[@id=\"YT-nloginSubmit\"]")).click();
//讓視訊載入完成
Thread.sleep(2000);
// 檢查頁面標題
System.out.println("Page title is: " + driver.getTitle());
//退出瀏覽器
driver.quit();
}
}