在自动化测试领域,WebDriver是一个强大的工具,它允许测试人员编写脚本来模拟用户与网页的交互。本文将分享一些高级的WebDriver使用技巧,帮助测试人员提高测试效率和质量。
使用WebDriver的Actions类可以执行复杂的UI交互,例如拖放。通过设置期望的X和Y偏移量,可以使用DragAndDropToOffset方法来实现拖放。
        [Test]
        public void DragAndDrop()
        {
            this.driver.Navigate().GoToUrl(
                "http://loopj.com/jquery-simple-slider/"
            );
            IWebElement element = driver.FindElement(By.XPath(
                "//*[@id='project']/p[1]/div/div[2]"
            ));
            Actions move = new Actions(driver);
            move.DragAndDropToOffset(element, 30, 0).Perform();
        }
    
使用WebDriver上传文件是一个简单的任务。需要定位文件元素,并使用IWebElement的SendKeys方法来设置文件路径。
        [Test]
        public void FileUpload()
        {
            this.driver.Navigate().GoToUrl(
                "https://demos.telerik.com/aspnet-ajax/ajaxpanel/application-scenarios/file-upload/defaultcs.aspx"
            );
            IWebElement element = driver.FindElement(By.Id(
                "ctl00_ContentPlaceholder1_RadUpload1file0"
            ));
            string filePath = @"D:\Projects\PatternsInAutomation.Tests\WebDriver.Series.Tests\bin\Debug\WebDriver.xml";
            element.SendKeys(filePath);
        }
    
通过IWebDriver的ITargetLocator接口,可以定位JavaScript弹窗。然后可以使用IAlert接口的Accept和Dismiss方法。
        [Test]
        public void JavaScripPopUps()
        {
            this.driver.Navigate().GoToUrl(
                "http://www.w3schools.com/js/tryit.asp?filename=tryjs_confirm"
            );
            this.driver.SwitchTo().Frame("iframeResult");
            IWebElement button = driver.FindElement(By.XPath("/html/body/button"));
            button.Click();
            IAlert a = driver.SwitchTo().Alert();
            if (a.Text.Equals("Press a button!"))
            {
                a.Accept();
            }
            else
            {
                a.Dismiss();
            }
        }
    
WebDriver在单个浏览器窗口的范围内驱动浏览器。但是,可以使用其SwitchTo方法来改变目标窗口或标签页。
        [Test]
        public void MovingBetweenTabs()
        {
            this.driver.Navigate().GoToUrl(
                "http://automatetheplanet.com/compelling-sunday-14022016/"
            );
            driver.FindElement(By.LinkText("10 Advanced WebDriver Tips and Tricks Part 1")).Click();
            driver.FindElement(By.LinkText("The Ultimate Guide To Unit Testing in ASP.NET MVC")).Click();
            ReadOnlyCollection windowHandles = driver.WindowHandles;
            string firstTab = windowHandles.First();
            string lastTab = windowHandles.Last();
            driver.SwitchTo().Window(lastTab);
            Assert.AreEqual(
                "The Ultimate Guide To Unit Testing in ASP.NET MVC", driver.Title);
            driver.SwitchTo().Window(firstTab);
            Assert.AreEqual(
                "Compelling Sunday – 19 Posts on Programming and Quality Assurance", driver.Title);
        }
       
WebDriver的INavigation接口包含有用的方法,用于前进和后退。此外,还可以刷新当前页面。
        [Test]
        public void NavigationHistory()
        {
            this.driver.Navigate().GoToUrl(
                "http://www.codeproject.com/Articles/1078541/Advanced-WebDriver-Tips-and-Tricks-Part"
            );
            this.driver.Navigate().GoToUrl(
                "http://www.codeproject.com/Articles/1017816/Speed-up-Selenium-Tests-through-RAM-Facts-and-Myth"
            );
            driver.Navigate().Back();
            Assert.AreEqual(
                "10 Advanced WebDriver Tips and Tricks - Part 1 - CodeProject", 
                driver.Title);
            driver.Navigate().Refresh();
            Assert.AreEqual(
                "10 Advanced WebDriver Tips and Tricks - Part 1 - CodeProject", 
                driver.Title);
            driver.Navigate().Forward();
            Assert.AreEqual(
                "Speed up Selenium Tests through RAM Facts and Myths - CodeProject", 
                driver.Title);
        }
       
在之前的系列文章中,展示了如何创建一个新的自定义Firefox配置文件。可以设置其参数'general.useragent.override'为所需的用户代理字符串。
        FirefoxProfileManager profileManager = new FirefoxProfileManager();
        FirefoxProfile profile = new FirefoxProfile();
        profile.SetPreference(
            "general.useragent.override",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+"
        );
        this.driver = new FirefoxDriver(profile);
    
与用户代理配置类似,要为Firefox设置代理,只需要设置Firefox配置文件的几个参数。
        FirefoxProfile firefoxProfile = new FirefoxProfile();
        firefoxProfile.SetPreference(
            "network.proxy.type",
            1
        );
        firefoxProfile.SetPreference(
            "network.proxy.http",
            "myproxy.com"
        );
        firefoxProfile.SetPreference(
            "network.proxy.http_port",
            3239
        );
        driver = new FirefoxDriver(firefoxProfile);
    
8.1. 处理SSL证书错误FirefoxDriver
        FirefoxProfile firefoxProfile = new FirefoxProfile();
        firefoxProfile.AcceptUntrustedCertificates = true;
        firefoxProfile.AssumeUntrustedCertificateIssuer = false;
        driver = new FirefoxDriver(firefoxProfile);
    
8.2. 处理SSL证书错误ChromeDriver
        DesiredCapabilities capability = DesiredCapabilities.Chrome(); 
        Environment.SetEnvironmentVariable(
            "webdriver.chrome.driver",
            "C:\\Path\\To\\ChromeDriver.exe"
        ); 
        capability.SetCapability(CapabilityType.AcceptSslCertificates, true); 
        driver = new RemoteWebDriver(capability);
    
8.3. 处理SSL证书错误InternetExplorerDriver
        DesiredCapabilities capability = DesiredCapabilities.InternetExplorer();
        Environment.SetEnvironmentVariable(
            "webdriver.ie.driver",
            "C:\\Path\\To\\IEDriver.exe"
        );
        capability.SetCapability(CapabilityType.AcceptSslCertificates, true);
        driver = new RemoteWebDriver(capability);
    
WebDriver没有内置机制来滚动焦点到控件。但是,可以使用JavaScript的window.scroll方法。只需要传递目标元素的Y位置。
        [Test]
        public void ScrollFocusToControl()
        {
            this.driver.Navigate().GoToUrl(
                "http://automatetheplanet.com/compelling-sunday-14022016/"
            );
            IWebElement link = driver.FindElement(By.PartialLinkText("Previous post"));
            string jsToBeExecuted = string.Format(
                "window.scroll(0, {0});", link.Location.Y);
            ((IJavaScriptExecutor)driver).ExecuteScript(jsToBeExecuted);
            link.Click();
            Assert.AreEqual(
                "10 Advanced WebDriver Tips and Tricks - Part 1", driver.Title);
        }
     
有两种方法可以实现。第一种是使用IWebElement的SendKeys方法与空字符串。第二种是使用一点JavaScript代码。
        [Test]
        public void FocusOnControl()
        {
            this.driver.Navigate().GoToUrl(
                "http://automatetheplanet.com/compelling-sunday-14022016/"
            );
            IWebElement link = driver.FindElement(By.PartialLinkText("Previous post"));
            // Option 1.
            link.SendKeys(string.Empty);
            // Option 2.
            ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].focus();", link);
        }
    
本文是“实用自动化与WebDriver”系列的一部分,以下是一些相关文章:
如果喜欢文章,请订阅,也可以分享到社交网络。