工作中很多時候經常需要網抓數據或者把數據填寫到網站上,使用Selenium將其自動化是一種不錯的選擇。Selenium其實是一個用於Web應用程序測試的工具,測試你的應用程序看是否能夠很好地工作在不同瀏覽器和操作系統之上。它可直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
1、在NuGet中下載Selenium.Chrome.WebDriver(v2.45.0)和Selenium.WebDriver(v3.141.0),然后引用using OpenQA.Selenium;和using OpenQA.Selenium.Chrome;
2、聲明和實例一個ChromeDriver對象
IWebDriver driver = new ChromeDriver(System.AppDomain.CurrentDomain.BaseDirectory.ToString());
ChromeDriver總共有8個構造方法,這里我使用的是第4個方法。
ChromeDriver()、ChromeDriver(ChromeDriverService service)指定初始化ChromeDriver的服務、ChromeDriver(ChromeOptions options)指定ChromeDriver的選項、ChromeDriver(string chromeDriverDirectory)指定ChromeDriver.exe的目錄路徑、ChromeDriver(ChromeDriverService service,ChromeOptions options)、ChromeDriver(string chromeDriverDirectory,ChromeOptions options)、ChromeDriver(ChromeDriverService service,ChromeOptions options,TimeSpan commandTimeOut)指定了命令的等待執行時間、ChromeDriver(string chromeDriverDirectory,ChromeOptions options,TimeSpan commandTimeOut)
ChromeOptions參數設置可參考https://peter.sh/experiments/chromium-command-line-switches/和https://sites.google.com/a/chromium.org/chromedriver/capabilities,常用的有下面幾個:
--user-agent=“” 設置請求頭的User-Agent
--window-size=1366,768 設置瀏覽器窗口大小
--headless 無界面運行
--start-maximized 最大化運行
--incognito 隱身模式
--disable-javascript 禁用javascript
--disable-infobars 禁用瀏覽器正在被自動化程序控制的提示
var option = new ChromeOptions(); option.AddArgument("--incognito"); option.AddArgument("headless"); option.AddArgument("disable-infobars"); IWebDriver driver = new ChromeDriver(System.AppDomain.CurrentDomain.BaseDirectory.ToString(),option);
ChromeDriverService參數比較少用,可以參考https://ask.csdn.net/questions/758189,常用來設置命令行窗口不彈出:
var cdSvc = ChromeDriverService.CreateDefaultService(); cdSvc.HideCommandPromptWindow = true; IWebDriver driver = new ChromeDriver(cdSvc);
但是使用了ChromeDriverService參數就不能指定ChromeDriver的目錄路徑了,很憂傷。
3、打開網址和設置元素查找時間限制
driver.Navigate().GoToUrl("http://dcga。。。"); driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);
4、獲取html元素並進行操作
driver.FindElement(By.XPath("//button[@class=\"btn try-out__btn\"]")).Click(); IWebElement tryit; tryit = driver.FindElement(By.XPath("//textarea[@class=\"body-param__text\"]")); tryit.Clear(); tryit.SendKeys("{\"docId\":\"111111111\"}");
如果返回的元素有多個,就得使用collection了,引用using System.Collections.ObjectModel;
ReadOnlyCollection<IWebElement> coll = driver.FindElements(By.XPath("//*[@id=\"operations-default-post_automation_api_va\"]/div/span[2]/a"));
5、其他一些可能使用的語句
driver.Manage().Window.Maximize();//窗口最大化 System.Threading.Thread.Sleep(1000);//等待1秒 ReadOnlyCollection<string> windows = driver.WindowHandles; driver.SwitchTo().Window(windows[1]);//有新窗口彈出時切換