執行Selenium腳本時,我們往往不需要盯着電腦看腳本的執行情況,再或者我們的腳本可能被執行在一個無GUI的Linux機器上,那么這時我們都可以使用瀏覽器的Headless模式來執行。
Headless Chrome
@Test public void OpenChromeTest() { String path = System.getProperty("user.dir"); System.setProperty("webdriver.chrome.driver", path + "\\drivers\\chromedriver.exe"); ChromeOptions chromeOptions = new ChromeOptions(); // 設置為 headless 模式 (必須) chromeOptions.addArguments("--headless"); // 設置瀏覽器窗口打開大小 (非必須) chromeOptions.addArguments("--window-size=1920,1080"); WebDriver driver = new ChromeDriver(chromeOptions); driver.get("http://www.baidu.com"); String title = driver.getTitle(); System.out.println(title); driver.quit(); }
headless Firefox
Firefox版本要求:
- windows/mac 56+
- linux 55+
geckodriver
- 建議都用最新版
import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxBinary; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import java.util.concurrent.TimeUnit; public class HeadlessFirefoxSeleniumExample { public static void main(String [] args) { FirefoxBinary firefoxBinary = new FirefoxBinary(); firefoxBinary.addCommandLineOptions("--headless"); System.setProperty("webdriver.gecko.driver", "/opt/geckodriver"); FirefoxOptions firefoxOptions = new FirefoxOptions(); firefoxOptions.setBinary(firefoxBinary); FirefoxDriver driver = new FirefoxDriver(firefoxOptions); try { driver.get("http://www.google.com"); driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS); WebElement queryBox = driver.findElement(By.name("q")); queryBox.sendKeys("headless firefox"); WebElement searchBtn = driver.findElement(By.name("btnK")); searchBtn.click(); WebElement iresDiv = driver.findElement(By.id("ires")); iresDiv.findElements(By.tagName("a")).get(0).click(); System.out.println(driver.getPageSource()); } finally { driver.quit(); } } }
Headless Chrome 和 Headless Firefox 的出現是為了取代PhantomJS。 為啥呢?因為PhantomJS並非真在的瀏覽器,跟真實瀏覽器還存在一定的差異。當然除了上面介紹的三種無頭模式外,Selenium 還自帶了一個HttpUnit的無頭模式(WebDriver driver = new HtmlUnitDriver())同樣並非真在瀏覽器,而且對JS支持不好,一般很少用到。
通過Grid 服務啟動的chrome,設置chrome
ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--headless"); DesiredCapabilities dc = DesiredCapabilities.chrome(); dc.setCapability(ChromeOptions.CAPABILITY, chromeOptions); WerbDriver driver = new RemoteWebDriver(new URL(hubURL), dc);
