[robot]利用Selenium將網頁瀏覽器自動化

  • 6794
  • 0
  • 2018-02-13

[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/