1. 程式人生 > >【轉】Selenium - 封裝WebDrivers (C#)

【轉】Selenium - 封裝WebDrivers (C#)

from BE ive str 支持 asf res file pty

本文轉載自:http://www.cnblogs.com/qixue/p/3977135.html

Web element仍然使用OpenQA.Selenium.IWebElement, 本類庫將Selenium原裝支持的各瀏覽器統一為OnDriver, 並將常用操作封裝。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QA = OpenQA.Selenium;
using UI = OpenQA.Selenium.Support.UI;

namespace XWebDriver
{
    public class OneDriver
    {
        private QA.IWebDriver wd = null;
        private Browsers browser = Browsers.IE;
        public OneDriver(Browsers theBrowser)
        {
            this.browser = theBrowser;
            wd = InitWebDriver();
        }

        private QA.IWebDriver InitWebDriver()
        {
            QA.IWebDriver theDriver = null;
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        QA.IE.InternetExplorerOptions _ieOptions = new QA.IE.InternetExplorerOptions();
                        _ieOptions.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
                        theDriver = new QA.IE.InternetExplorerDriver(_ieOptions);
                    }; break;
                case Browsers.Chrome:
                    {
                        theDriver = new QA.Chrome.ChromeDriver();
                    }; break;
                case Browsers.Firefox:
                    {
                        theDriver = new QA.Firefox.FirefoxDriver();
                    }; break;
                case Browsers.Safari:
                    {
                        theDriver = new QA.Safari.SafariDriver();
                    };break;
                case Browsers.PhantomJS:
                    {
                        theDriver = new QA.PhantomJS.PhantomJSDriver();
                    };break;
                default:
                    {
                        QA.IE.InternetExplorerOptions _ieOptions = new QA.IE.InternetExplorerOptions();
                        _ieOptions.IntroduceInstabilityByIgnoringProtectedModeSettings = true;
                        theDriver = new QA.IE.InternetExplorerDriver(_ieOptions);
                    }; break;
            }
            return theDriver;
        }

        #region public members
        /// <summary>
        /// Effects throughout the life of web driver
        /// Set once only if necessary
        /// </summary>
        /// <param name="seconds"></param>
        public void ImplicitlyWait(double seconds)
        {
            wd.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(seconds));
        }

        /// <summary>
        /// Wait for the expected condition is satisfied, return immediately
        /// </summary>
        /// <param name="expectedCondition"></param>
        public void WaitForPage(string title)
        {
            UI.WebDriverWait _wait = new UI.WebDriverWait(wd, TimeSpan.FromSeconds(10));
            _wait.Until((d) => { return d.Title.ToLower().StartsWith(title.ToLower()); });
            //to do
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="we"></param>
        public void WaitForElement(string id)
        {
            UI.WebDriverWait _wait = new UI.WebDriverWait(wd, TimeSpan.FromSeconds(10));
            _wait.Until((d) => { return OpenQA.Selenium.Support.UI.ExpectedConditions.ElementExists(QA.By.Id(id));});            
        }


        /// <summary>
        /// Load a new web page in current browser
        /// </summary>
        /// <param name="url"></param>
        public void GoToUrl(string url)
        {
            wd.Navigate().GoToUrl(url);
        }

        public void Refresh()
        {
            wd.Navigate().Refresh();
        }

        public void Back()
        {
            wd.Navigate().Back();
        }

        public void Forward()
        {
            wd.Navigate().Forward();
        }

        /// <summary>
        /// Get the url of current browser window
        /// </summary>
        /// <returns></returns>
        public string GetUrl()
        {
            return wd.Url;
        }

        /// <summary>
        /// Get page title of current browser window
        /// </summary>
        /// <returns></returns>
        public string GetPageTitle()
        {
            return wd.Title;
        }

        /// <summary>
        /// Get all cookies defined in the current page
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, string> GetAllCookies()
        {
            Dictionary<string, string> cookies = new Dictionary<string, string>();
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        var allCookies= ((QA.IE.InternetExplorerDriver)wd).Manage().Cookies.AllCookies;
                        foreach (QA.Cookie cookie in allCookies)
                        {
                            cookies[cookie.Name] = cookie.Value;
                        }
                    }; break;
                case Browsers.Chrome:
                    {
                        var allCookies = ((QA.Chrome.ChromeDriver)wd).Manage().Cookies.AllCookies;
                        foreach (QA.Cookie cookie in allCookies)
                        {
                            cookies[cookie.Name] = cookie.Value;
                        }
                    }; break;
                case Browsers.Firefox:
                    {
                        var allCookies = ((QA.Firefox.FirefoxDriver)wd).Manage().Cookies.AllCookies;
                        foreach (QA.Cookie cookie in allCookies)
                        {
                            cookies[cookie.Name] = cookie.Value;
                        }
                    }; break;
                case Browsers.Safari:
                    {
                        var allCookies = ((QA.Safari.SafariDriver)wd).Manage().Cookies.AllCookies;
                        foreach (QA.Cookie cookie in allCookies)
                        {
                            cookies[cookie.Name] = cookie.Value;
                        }
                    }; break;
                case Browsers.PhantomJS:
                    {
                        var allCookies = ((QA.PhantomJS.PhantomJSDriver)wd).Manage().Cookies.AllCookies;
                        foreach (QA.Cookie cookie in allCookies)
                        {
                            cookies[cookie.Name] = cookie.Value;
                        }
                    }; break;
                default:
                    {
                        var allCookies = ((QA.IE.InternetExplorerDriver)wd).Manage().Cookies.AllCookies;
                        foreach (QA.Cookie cookie in allCookies)
                        {
                            cookies[cookie.Name] = cookie.Value;
                        }
                    }; break;
            }

            return cookies;
        }

        /// <summary>
        /// Delete all cookies from the page
        /// </summary>
        public void DeleteAllCookies()
        {
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).Manage().Cookies.DeleteAllCookies();
                    }; break;
                case Browsers.Chrome:
                    {
                        ((QA.Chrome.ChromeDriver)wd).Manage().Cookies.DeleteAllCookies();
                    }; break;
                case Browsers.Firefox:
                    {
                        ((QA.Firefox.FirefoxDriver)wd).Manage().Cookies.DeleteAllCookies();
                    }; break;
                case Browsers.Safari:
                    {
                        ((QA.Safari.SafariDriver)wd).Manage().Cookies.DeleteAllCookies();
                    }; break;
                case Browsers.PhantomJS:
                    {
                        ((QA.PhantomJS.PhantomJSDriver)wd).Manage().Cookies.DeleteAllCookies();
                    }; break;
                default:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).Manage().Cookies.DeleteAllCookies();
                    }; break;
            }
        }

        /// <summary>
        /// Set focus to a browser window with a specified title
        /// </summary>
        /// <param name="title"></param>
        /// <param name="exactMatch"></param>
        public void GoToWindow(string title, bool exactMatch)
        {
            string theCurrent = wd.CurrentWindowHandle;
            IList<string> windows = wd.WindowHandles;
            if (exactMatch)
            {
                foreach (var window in windows)
                {
                    wd.SwitchTo().Window(window);
                    if (wd.Title.ToLower() == title.ToLower())
                    {
                        return;
                    }
                }
            }
            else
            {
                foreach (var window in windows)
                {
                    wd.SwitchTo().Window(window);
                    if (wd.Title.ToLower().Contains(title.ToLower()))
                    {
                        return;
                    }
                }
            }

            wd.SwitchTo().Window(theCurrent);
        }

        /// <summary>
        /// Set focus to a frame with a specified name
        /// </summary>
        /// <param name="name"></param>
        public void GoToFrame(string name)
        {
            QA.IWebElement theFrame = null;
            var frames = wd.FindElements(QA.By.TagName("iframe"));
            foreach (var frame in frames)
            {
                if (frame.GetAttribute("name").ToLower() == name.ToLower())
                {
                    theFrame = (QA.IWebElement)frame;
                    break;
                }
            }
            if (theFrame != null)
            {
                wd.SwitchTo().Frame(theFrame);
            }
        }

        public void GoToFrame(QA.IWebElement frame)
        {
            wd.SwitchTo().Frame(frame);
        }

        /// <summary>
        /// Switch to default after going to a frame
        /// </summary>
        public void GoToDefault()
        {
            wd.SwitchTo().DefaultContent();
        }

        /// <summary>
        /// Get the alert text
        /// </summary>
        /// <returns></returns>
        public string GetAlertString()
        {
            string theString = string.Empty;
            QA.IAlert alert = null;
            alert = wd.SwitchTo().Alert();
            if (alert != null)
            {
                theString = alert.Text;
            }
            return theString;
        }

        /// <summary>
        /// Accepts the alert
        /// </summary>
        public void AlertAccept()
        {
            QA.IAlert alert = null;
            alert = wd.SwitchTo().Alert();
            if (alert != null)
            {
                alert.Accept();
            }
        }

        /// <summary>
        /// Dismisses the alert
        /// </summary>
        public void AlertDismiss()
        {
            QA.IAlert alert = null;
            alert = wd.SwitchTo().Alert();
            if (alert != null)
            {
                alert.Dismiss();
            }            
        }

        /// <summary>
        /// Move vertical scroll bar to bottom for the page
        /// </summary>
        public void PageScrollToBottom()
        {
            var js = "document.documentElement.scrollTop=10000";
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Chrome:
                    {
                        ((QA.Chrome.ChromeDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Firefox:
                    {
                        ((QA.Firefox.FirefoxDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Safari:
                    {
                        ((QA.Safari.SafariDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.PhantomJS:
                    {
                        ((QA.PhantomJS.PhantomJSDriver)wd).ExecuteScript(js, null);
                    }; break;
                default:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
            }
        }

        /// <summary>
        /// Move horizontal scroll bar to right for the page
        /// </summary>
        public void PageScrollToRight()
        {
            var js = "document.documentElement.scrollLeft=10000";
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Chrome:
                    {
                        ((QA.Chrome.ChromeDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Firefox:
                    {
                        ((QA.Firefox.FirefoxDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Safari:
                    {
                        ((QA.Safari.SafariDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.PhantomJS:
                    {
                        ((QA.PhantomJS.PhantomJSDriver)wd).ExecuteScript(js, null);
                    }; break;
                default:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
            }
        }

        /// <summary>
        /// Move vertical scroll bar to bottom for an element
        /// </summary>
        /// <param name="element"></param>
        public void ElementScrollToBottom(QA.IWebElement element)
        {
            string id = element.GetAttribute("id");
            string name = element.GetAttribute("name");
            var js = "";
            if (!string.IsNullOrWhiteSpace(id))
            {
                js = "document.getElementById(‘" + id + "‘).scrollTop=10000";
            }
            else if (!string.IsNullOrWhiteSpace(name))
            {
                js = "document.getElementsByName(‘" + name + "‘)[0].scrollTop=10000";
            }
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Chrome:
                    {
                        ((QA.Chrome.ChromeDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Firefox:
                    {
                        ((QA.Firefox.FirefoxDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Safari:
                    {
                        ((QA.Safari.SafariDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.PhantomJS:
                    {
                        ((QA.PhantomJS.PhantomJSDriver)wd).ExecuteScript(js, null);
                    }; break;
                default:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
            }
        }

        /// <summary>
        /// Get a screen shot of the current window
        /// </summary>
        /// <param name="savePath"></param>
        public void TakeScreenshot(string savePath)
        {
            QA.Screenshot theScreenshot = null;
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        theScreenshot = ((QA.IE.InternetExplorerDriver)wd).GetScreenshot();
                    }; break;
                case Browsers.Chrome:
                    {
                        theScreenshot = ((QA.Chrome.ChromeDriver)wd).GetScreenshot();
                    }; break;
                case Browsers.Firefox:
                    {
                        theScreenshot = ((QA.Firefox.FirefoxDriver)wd).GetScreenshot();
                    }; break;
                case Browsers.Safari:
                    {
                        theScreenshot = ((QA.Safari.SafariDriver)wd).GetScreenshot();
                    }; break;
                case Browsers.PhantomJS:
                    {
                        theScreenshot = ((QA.PhantomJS.PhantomJSDriver)wd).GetScreenshot();
                    }; break;   
                default:
                    {
                        theScreenshot = ((QA.IE.InternetExplorerDriver)wd).GetScreenshot();
                    }; break;
            }
            if (theScreenshot != null)
            {
                theScreenshot.SaveAsFile(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
        }

        /// <summary>
        /// Find the element of a specified id
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public QA.IWebElement FindElementById(string id)
        {
            QA.IWebElement theElement = null;
            theElement = (QA.IWebElement)wd.FindElement(QA.By.Id(id));
            return theElement;
        }

        /// <summary>
        /// Find the element of a specified name
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public QA.IWebElement FindElementByName(string name)
        {
            QA.IWebElement theElement = null;
            theElement = (QA.IWebElement)wd.FindElement(QA.By.Name(name));
            return theElement;
        }
        
        /// <summary>
        /// Find the element by xpath
        /// </summary>
        /// <param name="xpath"></param>
        /// <returns></returns>
        public QA.IWebElement FindElementByXPath(string xpath)
        {
            QA.IWebElement theElement = null;
            theElement = (QA.IWebElement)wd.FindElement(QA.By.XPath(xpath));
            return theElement;
        }

        public QA.IWebElement FindElementByLinkText(string text)
        {
            QA.IWebElement theElement = null;
            try
            {
                theElement = wd.FindElement(QA.By.LinkText(text));
            }
            catch { }
            return theElement;
        }

        public IList<QA.IWebElement> FindElementsByLinkText(string text)
        {
            IList<QA.IWebElement> theElement = null;
            theElement = (IList<QA.IWebElement>)wd.FindElements(QA.By.LinkText(text));
            return theElement;
        }

        public IList<QA.IWebElement> FindElementsByPartialLinkText(string text)
        {
            IList<QA.IWebElement> theElement = null;
            theElement = (IList<QA.IWebElement>)wd.FindElements(QA.By.PartialLinkText(text));
            return theElement;
        }

        public IList<QA.IWebElement> FindElementsByClassName(string clsName)
        {
            IList<QA.IWebElement> theElement = null;
            theElement = (IList<QA.IWebElement>)wd.FindElements(QA.By.ClassName(clsName));
            return theElement;
        }

        public IList<QA.IWebElement> FindElementsByTagName(string tagName)
        {
            IList<QA.IWebElement> theElement = null;
            theElement = (IList<QA.IWebElement>)wd.FindElements(QA.By.TagName(tagName));
            return theElement;
        }

        public IList<QA.IWebElement> FindElementsByCssSelector(string css)
        {
            IList<QA.IWebElement> theElement = null;
            theElement = (IList<QA.IWebElement>)wd.FindElements(QA.By.CssSelector(css));
            return theElement;
        }

        public IList<QA.IWebElement> FindElementsByXPathName(string xpath)
        {
            IList<QA.IWebElement> theElement = null;
            theElement = (IList<QA.IWebElement>)wd.FindElements(QA.By.XPath(xpath));
            return theElement;
        }

        /// <summary>
        /// Executes javascript
        /// </summary>
        /// <param name="js"></param>
        public void ExecuteJS(string js)
        {
            switch (this.browser)
            {
                case Browsers.IE:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Chrome:
                    {
                        ((QA.Chrome.ChromeDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Firefox:
                    {
                        ((QA.Firefox.FirefoxDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.Safari:
                    {
                        ((QA.Safari.SafariDriver)wd).ExecuteScript(js, null);
                    }; break;
                case Browsers.PhantomJS:
                    {
                        ((QA.PhantomJS.PhantomJSDriver)wd).ExecuteScript(js, null);
                    }; break;
                default:
                    {
                        ((QA.IE.InternetExplorerDriver)wd).ExecuteScript(js, null);
                    }; break;
            }
        }

        public void ClickElement(QA.IWebElement element)
        {
            (new QA.Interactions.Actions(wd)).Click(element).Perform();
        }

        public void DoubleClickElement(QA.IWebElement element)
        {
            (new QA.Interactions.Actions(wd)).DoubleClick(element).Perform();
        }

        public void ClickAndHoldOnElement(QA.IWebElement element)
        {
            (new QA.Interactions.Actions(wd)).ClickAndHold(element).Perform();
        }

        public void ContextClickOnElement(QA.IWebElement element)
        {
            (new QA.Interactions.Actions(wd)).ContextClick(element).Perform();
        }

        public void DragAndDropElement(QA.IWebElement source, QA.IWebElement target)
        {
            (new QA.Interactions.Actions(wd)).DragAndDrop(source, target).Perform();
        }

        public void SendKeysToElement(QA.IWebElement element, string text)
        {
            (new QA.Interactions.Actions(wd)).SendKeys(element, text).Perform();
        }

        /// <summary>
        /// Quit this server, close all windows associated to it
        /// </summary>
        public void Cleanup()
        {
            wd.Quit();
        }
        #endregion
    }

    public enum Browsers
    {
        IE,
        Firefox,
        Chrome,
        Safari,
        PhantomJS
    }
}

【轉】Selenium - 封裝WebDrivers (C#)