博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET项目web自动化测试实战——Selenium 2.0
阅读量:7014 次
发布时间:2019-06-28

本文共 13961 字,大约阅读时间需要 46 分钟。

PS:这次用公司的项目来练手,希望公司不会起诉我,因为我绝对是抱着学习的态度,没有任何恶意。仅供交流学习。

该项目是基于SharePoint平台所开发的门户网站,为了切身感受一下Selenium 2.0我决定自己动手写一个自动化测试用例,而不是通过录制的方式,以加深我对一些web操作的理解。

我设计的测试用例是:检查Staff Spotlight中所包含的item对应三级页面显示的信息是否正确。具体逻辑是,在英语浏览器下检查后台list中英语Column的value和三级page中对应Column的value是否一致,在日语浏览器下检查后台list中日语Column的value和三级page中对应Column的value是否一致,如果是英语浏览器下后台list中没有勾选“English Ready”项,则在三级page中显示日语Column的value。

三级page如下:

点击页面右上角的“Edit Item”按钮可以跳转到后台list中相应的item编辑页面;点击上方的“日本语”按钮可以进行英语和日语的语言切换,点击“日本语”将切换到日本语,再点击“English”将切换到英语。

我们本次要取的页面元素就是Department,Location,Title以及Join Date的页面value。然后点击“Edit Item”按钮跳转到后台item编辑页面,按“F12”,找到对应要获取的后台元素值:

获取到对应的Column的value所在页面的元素,然后获取页面上显示的值,将其与三级page上的value按我们之前说过的逻辑进行比对,如果一样,测试通过;如果不一样,测试失败。

代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using OpenQA.Selenium;using OpenQA.Selenium.IE;using OpenQA.Selenium.Support;using OpenQA.Selenium.Support.UI;using Selenium;using mySelenium;using System.Runtime.InteropServices;using System.Threading;using System.Diagnostics;using System.Net;using System.IO;using System.Globalization;namespace mySelenium{    class LoginSPSite    {        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]        public static extern IntPtr GetForegroundWindow();        static void Main(string[] args)        {            IWebDriver driver = new InternetExplorerDriver();            IWebDriver iw = login(driver,"https://insite.ccqa11apps.com/Pages/default.aspx");            INavigation navi = iw.Navigate();            string language = checkLanguage(iw);            if (language == "English")            {                //Check the English page.(检查英语页面信息。)                Console.ForegroundColor = ConsoleColor.Yellow;                Console.WriteLine("--English page check--");                checkPageInfo(iw,"En");                //Turn to the Japanese page.(转换到日语页面。)                navi.GoToUrl("https://insite.ccqa11apps.com/Pages/default.aspx");                waitUntilPageLoaded(iw, "ctl00_ctl21_ToggleLanguage");                iw.FindElement(By.Id("ctl00_ctl21_ToggleLanguage")).Click();                //Check the Japanese page.(检查日语页面信息。)                Console.ForegroundColor = ConsoleColor.Yellow;                Console.WriteLine("--Japanese page check--");                checkPageInfo(iw,"Ja");            }            //Language is "Japanese".            else             {                //Check the Japanese page.(检查日语页面信息。)                Console.ForegroundColor = ConsoleColor.Yellow;                Console.WriteLine("--Japanese page check--");                checkPageInfo(iw,"Ja");                //Turn to the English page.(转换到英语页面。)                navi.GoToUrl("https://insite.ccqa11apps.com/Pages/default.aspx");                waitUntilPageLoaded(iw, "ctl00_ctl21_ToggleLanguage");                iw.FindElement(By.Id("ctl00_ctl21_ToggleLanguage")).Click();                //Check the English page.(检查英语页面信息。)                Console.ForegroundColor = ConsoleColor.Yellow;                Console.WriteLine("--English page check--");                checkPageInfo(iw, "En");            }        }//Get the 3rd page info.(从三级page中获取指定的Column的value,需要传入IWebDriver对象以及当前页面的语言种类。)        private static void checkPageInfo(IWebDriver iw,string LanType)        {            //Check 3rd page with the format: "https://insite.ccqa11apps.com/_layouts/15/InSite/pages/StaffDetails.aspx?id=" under the English environment.            INavigation navi = iw.Navigate();            for (int i = 1; i <= 5; i++)            {                Console.ForegroundColor = ConsoleColor.White;                Console.WriteLine("This is the " + i + " staff item check info:");                navi.GoToUrl("https://insite.ccqa11apps.com/_layouts/15/InSite/pages/StaffDetails.aspx?id=" + i.ToString());                var eles = iw.FindElements(By.ClassName("apps-staffdetail-content-splitline"));                //Get the info from the 3rd page.(获取三级page上Column的value信息。)                StaffSpotlight staffSpotlight = new StaffSpotlight();                staffSpotlight.Department = eles[0].FindElement(By.ClassName("apps-staffdetail-content-splitline-bottom")).Text;                staffSpotlight.Location = eles[1].FindElement(By.ClassName("apps-staffdetail-content-splitline-bottom")).Text;                staffSpotlight.Title = eles[2].FindElement(By.ClassName("apps-staffdetail-content-splitline-bottom")).Text;                staffSpotlight.JoinDate = eles[3].FindElement(By.ClassName("apps-staffdetail-content-splitline-bottom")).Text;                //Find the "Edit Item" button.(找到“Edit Item”按钮并点击。)                iw.FindElement(By.ClassName("apps-staffdetail-edit")).Click();                //Wait until the element on page loaded.(等待页面元素加载完成。)                waitUntilPageLoaded(iw, "Inpex_Department_$containereditableRegion");                //Get the info from the backend list.(获取后台list中Column的value信息。)                StaffSpotlight staffInfoFromBackend = new StaffSpotlight();                staffInfoFromBackend.Department = iw.FindElement(By.Id("Inpex_Department_$containereditableRegion")).FindElement(By.ClassName("valid-text")).Text;                staffInfoFromBackend.Location = iw.FindElement(By.Id("Inpex_Office_$containereditableRegion")).FindElement(By.ClassName("valid-text")).Text;                //Job title is the title under English IE.(Title是日语浏览器中显示的Title,EnTitle是英语浏览器中显示的Title。)                staffInfoFromBackend.Title = iw.FindElement(By.Id("Inpex_Job_Title_30756774-5931-4844-bac1-a2f463d04ca0_$TextField")).GetAttribute("value").ToString();                staffInfoFromBackend.EnTitle = iw.FindElement(By.Id("Inpex_Job_Title_E_ef6d11a7-f73e-4885-bef1-527a1c03c924_$TextField")).GetAttribute("value").ToString();                staffInfoFromBackend.JoinDate = iw.FindElement(By.Id("Inpex_Join_Date_b133dcfe-4e0c-4f0f-8b82-92a549516e6d_$DateTimeFieldDate")).GetAttribute("value").ToString();                //Compare the actual 3rd info with the expected backend info.(将三级page中的Column value和预期value比较。)                Compare("Department", staffSpotlight.Department, staffInfoFromBackend.Department);                Compare("Location", staffSpotlight.Location, staffInfoFromBackend.Location);           //英语页面的Title信息比对检查逻辑。                if (LanType == "En")                {                    try                    {                         //If can get the element underneath, it means "English Ready" has been checked.(如果可以在页面上获取到该元素,说明“English Ready”这一项是勾选的。)                        string ifChecked = iw.FindElement(By.Id("Inpex_E_Text_a355a229-a1bb-48f5-81dd-e428a0d4fbd2_$BooleanField")).GetAttribute("checked").ToString();                        Console.WriteLine("The Englisht ready has been checked: " + ifChecked);                        //Compare the title with the backend "En" one.(比对EnTitle和三级page中的Column value是否一致。)                        Compare("Title", staffSpotlight.Title, staffInfoFromBackend.EnTitle);                    }                    //If can not get the element by the ID above, it means "English Ready" has not been checked.(如果获取不到“English Ready”元素下的“checked” Attribute,说明没勾选。)                    catch(Exception ex)                    {                        WriteLog(ex);                        //Compare the title with the backend "Jp" one.(比对Title和三级page中的Column value是否一致。)                        Console.WriteLine("The Englisht ready has been checked: false");                        Compare("Title", staffSpotlight.Title, staffInfoFromBackend.Title);                    }                          }           //日语页面的Title信息比对检查逻辑。                else                 {                    staffInfoFromBackend.Title = iw.FindElement(By.Id("Inpex_Job_Title_30756774-5931-4844-bac1-a2f463d04ca0_$TextField")).GetAttribute("value").ToString();                    Compare("JapTitle", staffSpotlight.Title, staffInfoFromBackend.Title);                }                //Change the time format into the same.(统一转换三级page上的join date时间格式以及后台list item的join date时间格式,并进行比较。)                string joinDateOnPage;                string joinDateFromBackend;                if (staffSpotlight.JoinDate != "")                {                    DateTime dt = Convert.ToDateTime(staffSpotlight.JoinDate);                    joinDateOnPage = dt.ToString("yyyy-MM-dd");                }                else                 {                    joinDateOnPage = "";                }                if (staffInfoFromBackend.JoinDate != "")                {                    DateTime dt2 = Convert.ToDateTime(staffInfoFromBackend.JoinDate);                    joinDateFromBackend = dt2.ToString("yyyy-MM-dd");                }                else                 {                    joinDateFromBackend = "";                }                Compare("JoinDate", joinDateOnPage, joinDateFromBackend);            }        }     //Compare value method.(传入:对应要检查的Column的标题,三级page中Column的value,后台list中item对应Column的value。)        private static void Compare(string title, string p1, string p2)        {            if (p1 == p2)            {                Console.ForegroundColor = ConsoleColor.Green;                Console.WriteLine(title + " info on the 3rd page has passed the check.");            }            else             {                Console.ForegroundColor = ConsoleColor.Red;                Console.WriteLine(title + "info on the 3rd page has not passed the check.");                Console.WriteLine("The info on the 3rd page: " + p1);                Console.WriteLine("The info from the backend page: " + p2);            }        }        //Check language method.(检查当前页面所处于的语言环境,判断是英语还是日语,并返回当前语言种类。)        private static string checkLanguage(IWebDriver iw)        {            string currentLanguage;            //Wait until the element on page loaded.            waitUntilPageLoaded(iw, "ctl00_ctl21_ToggleLanguage");            string language = iw.FindElement(By.Id("ctl00_ctl21_ToggleLanguage")).Text;            if (language.Length == 3)            {                currentLanguage = "English";                return currentLanguage;            }            else             {                currentLanguage = "Japanese";                return currentLanguage;            }        }        //Wait until loaded method.(等待网页加载完毕指定元素,如果没有加载完,获取不到,捕获异常,继续等待,直到指定元素加载完毕。)        private static void waitUntilPageLoaded(IWebDriver iw, string element)        {            try            {                iw.FindElement(By.Id(element));            }            catch (Exception ex)            {                WriteLog(ex);                Thread.Sleep(2000);                waitUntilPageLoaded(iw, element);            }        }        //Login method.(登陆网站的方法,需要传入IWebDriver对象以及网站的url。)        public static IWebDriver login(IWebDriver driver, string url)         {            INavigation navigation = driver.Navigate();            navigation.GoToUrl(url);            driver.FindElement(By.Id("overridelink")).Click();            IntPtr myPtr = GetForegroundWindow();            //IntPtr hWnd = FindWindow(null, "abc");            if (myPtr != IntPtr.Zero)            {                //Send message to the window.                System.Windows.Forms.SendKeys.SendWait("dswu");                System.Windows.Forms.SendKeys.SendWait("{TAB}");                System.Windows.Forms.SendKeys.SendWait("1qaz2wsxE");                System.Windows.Forms.SendKeys.SendWait("{ENTER}");            }            return driver;        }        //Write log method.(将捕获到的异常打印到本地log文件中。)        private static void WriteLog(Exception ex)        {            string logUrl = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\SeleniumAutoTest.txt";            if (File.Exists(@logUrl))            {                using (FileStream fs = new FileStream(logUrl, FileMode.Append))                {                    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))                    {                        try                        {                            sw.Write(ex);                        }                        catch (Exception ex1)                        {                            WriteLog(ex1);                        }                        finally                        {                            sw.Close();                            fs.Close();                        }                    }                }            }            else            {                using (FileStream fs = new FileStream(logUrl, FileMode.CreateNew))                {                    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))                    {                        try                        {                            sw.Write(ex);                        }                        catch (Exception ex1)                        {                            WriteLog(ex1);                        }                        finally                        {                            sw.Close();                            fs.Close();                        }                    }                }            }        }    }}

这里我创建一个类,用来存储三级page以及后台list中获取到的Staff item的信息:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace mySelenium{    class StaffSpotlight    {        public string Department { get; set; }        public string Location { get; set; }        public string Title { get; set; }        public string EnTitle { get; set; }        public string JoinDate { get; set; }    }}

按F5进行测试,结果如下:

测试通过。

覆盖多浏览器在Selenium也是很容易实现的,只需要把IE打开方法改用为指定浏览器所对应的打开方法:

 IWebDriver driver = new InternetExplorerDriver(); 

把这句换了,之后的步骤对应做些修改即可。

自动化测试从某些方面讲确实是一劳永逸的,但是有很多时候自动化测试是完全没有必要的,尤其是项目周期很短的情况下,自动化的封装应该更偏向于具有普遍性的可复用过程,而不是业务逻辑。

有时候,产出决定付出。我们没必要为了一个两三月交付的项目写一堆自动化测试用例,否则得不偿失。自动化测试应该更偏向于长期上线、持续迭代的项目展开!否则最后失落感是一定有的。

 

请大家关注我的博客园,给我的文章点个赞!关注一个测试开发工程师的成长之路。

转载地址:http://dphtl.baihongyu.com/

你可能感兴趣的文章
OpenCV中的神器Image Watch
查看>>
Java 多线程学习笔记
查看>>
CDMA.ANYDATA 短信接收注意事项(针对乱码问题)
查看>>
c语言 函数可变参数列表
查看>>
UML概述
查看>>
ListView优化-getView优化
查看>>
Firefox 按一下Alt键 出现菜单!
查看>>
zepto中的属性设置
查看>>
oracle复习
查看>>
浅谈软件系统的标准化和产品化
查看>>
C++中sizeof操作符与strlen函数
查看>>
中文名文件上传到linux服务器上以后文件名会乱码(openoffice)
查看>>
C#语言学习--基础部分(二) 方法重载
查看>>
阅读笔记《构建之法》一
查看>>
Android 虚拟机 程序安装目录
查看>>
深入学习Hive应用场景及架构原理
查看>>
07-01 Java 封装
查看>>
HDU_1143_tri tiling
查看>>
codeforces_1075_C. The Tower is Going Home
查看>>
使用BBED模拟Oracle数据库坏块
查看>>