[robot]利用Selenium將網頁瀏覽器自動化
@將chrome查詢自動化
1.下載Selenium
此時c#版本是3.2.0
2.同樣的網頁有Third Party Drivers可下載, 請下載ChromeDriver, 此時版本是2.27
3.將在1.下載的WebDriver.Support.dll+WebDriver.dll在專案加入參考
4.將在2.下載的chromedriver.exe放在專案.exe的執行路徑下(本例是在專案exe的路徑新建一個資料夾ChromeDriver,並把chromedriver.exe放在此資料夾中)
5.利用以下程式碼即可自動化chrome的查詢
private void btnTestChrome_Click(object sender, EventArgs e)
{
IWebDriver _driver;
ChromeOptions chromeBrowserOptions = new ChromeOptions();
//需要阻擋跳出視窗時,可將下面註解移除
//chromeBrowserOptions.AddArgument("--disable-popup-blocking");
//要節省流量,不載入圖片的時候,可將下面註解移除
//chromeBrowserOptions.AddExtension(@"ChromeDriver\Block-image_v1.1.crx"); // 載入阻擋圖片外掛程式
_driver = new ChromeDriver(@"ChromeDriver", chromeBrowserOptions);
//可避免網頁被cache住,一直查到舊資料(需不斷重複查詢同一網頁時就會用到)
_driver.Manage().Cookies.DeleteAllCookies();
_driver.Navigate().GoToUrl("https://www.google.com.tw/");
//可避免RWD網頁隱藏了訊息,因此網頁最大化
_driver.Manage().Window.Maximize();
//Console.WriteLine(result);
Console.WriteLine("press any key to continue");
Thread.Sleep(10000);
_driver.Close();
_driver.Dispose();
}
執行結果:
@將PhantomJS的查詢自動化
1.下載Selenium
此時c#版本是3.2.0
2.PhantomJS需要到他們官網去下載, 此時版本是2.1.1
3.將在1.下載的WebDriver.Support.dll+WebDriver.dll在專案加入參考
4.將在2.下載的phantomjs.exe放在專案.exe同樣的路徑下
5.利用以下程式碼即可自動化phantomjs的查詢
private void btnTestPhantomJS_Click(object sender, EventArgs e)
{
IWebDriver _driver;
PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService();
//取得隨機的 port,避免 driver lock port 造成 init 失敗
//長時間執行的話建議加上隨機的 port
int port = getRandomPort();
service.Port = port;
service.HideCommandPromptWindow = true; // 隱藏 prompt windows
service.IgnoreSslErrors = true;
//PhantomJS 2.x memory leak when --load-images=false
//https://github.com/ariya/phantomjs/issues/13027
service.LoadImages = true;
service.ProxyType = "none";
service.AddArgument("--webdriver-loglevel=NONE");
_driver = new PhantomJSDriver(service);
//可避免網頁被cache住,一直查到舊資料(需不斷重複查詢同一網頁時就會用到)
_driver.Manage().Cookies.DeleteAllCookies();
_driver.Navigate().GoToUrl("https://www.google.com.tw/");
_driver.Manage().Window.Maximize();
ITakesScreenshot screenshotDriver = _driver as ITakesScreenshot;
Screenshot screenshot = screenshotDriver.GetScreenshot();
string path = "D:\\temp\\";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
screenshot.SaveAsFile(path + "123.png", System.Drawing.Imaging.ImageFormat.Png);
Thread.Sleep(10000);
_driver.Close();
_driver.Dispose();
}
private int getRandomPort()
{
Random genPort = new Random();
return genPort.Next(49152, 65535);
}
執行結果:
@將Firefox查詢自動化
1.下載Selenium
此時c#版本是3.2.0
2.同樣的網頁有Third Party Drivers可下載, 請下載Mozilla GeckoDriver, 此時版本是v0.14.0
2.1.到Firefox官網下載Firefox並安裝
3.將在1.下載的WebDriver.Support.dll+WebDriver.dll在專案加入參考
4.將在2.下載的geckodriver.exe放在專案.exe的執行路徑下
5.利用以下程式碼即可自動化chrome的查詢
private void btnTestFirefox_Click(object sender, EventArgs e)
{
IWebDriver _driver;
FirefoxProfile firefoxBrowserOptions = new FirefoxProfile();
_driver = new FirefoxDriver(firefoxBrowserOptions);
//可避免網頁被cache住,一直查到舊資料(需不斷重複查詢同一網頁時就會用到)
_driver.Manage().Cookies.DeleteAllCookies();
_driver.Navigate().GoToUrl("https://www.google.com.tw/");
_driver.Manage().Window.Maximize();
Thread.Sleep(10000);
_driver.Close();
_driver.Dispose();
}
執行結果:
以上做個筆記,方便以後參考
ps.補充:20171023:當Selenium重複執行(一般來講是用迴圈+sleep)一陣子(也許幾天也許幾個禮拜)之後,有可能會一直抓不到網頁資料
這時候不用懷疑是程式碼寫錯了,要懷疑是Selenium+ phantomjs/chrome/firefox 不能夠長時間的穩定執行(也許是Selenium的記憶體控制有問題)
,總之這時候把Selenium物件關閉再重開就對了,可在迴圈執行一陣子之後(自行判斷一陣子是幾天或是幾個禮拜),執行關閉Selenium的語法如下:
(關閉成功之後,再開啟Selenium的語法都在文章的上面提到的三種瀏覽器phantomjs/chrome/firefox了,開啟的這部分的程式碼就不重複敘述了)
//暫停個十秒之後,關閉Selenium瀏覽器,然後之後就可以重新new Selenium物件
SpinWait.SpinUntil(() => false, 10000);
try
{
if (_driver!=null)
{
_driver.Quit();
}
}
catch (Exception ex)
{
//_driver.Quit();這行程式碼一定會引發exception
//因此一定會進入catch, 但是selenium + phantomjs/chrome/firefox的確會關掉
//因此等等重新new Selenium的時候,就可確實的將selenium重開
}
Application.DoEvents();
ps.快速提供C#的dll以及ChromeDriver.exe以及phantomjs.exe的載點:最新版本請至上面提到的網址下載喔
https://www.dropbox.com/s/2t6bwya7gmap5bi/chromedriver.exe_2.33%E8%88%87WebDriver.dll_3.2.zip?dl=0
參考資料:
https://stackoverflow.com/questions/42607084/selenium-chromedriver-does-not-recognize-newly-compiled-headless-chromium-pytho
https://stackoverflow.com/questions/16180428/can-selenium-webdriver-open-browser-windows-silently-in-background
https://objectpartners.com/2017/04/13/how-to-install-and-use-headless-chrome-on-osx/