百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

阿里疯传!Selenium高手必备:基于WebDriver的Web UI自动化

ccwgpt 2024-10-10 04:43 29 浏览 0 评论

Selenium是目前最流行的Web UI自动化测试框架。熟悉Selenium的人也知道Selenium是基于WebDriver的。

那么在没有Selenium的情况下,我们能直接调用WebDriver实现Web UI的自动化吗?答案当然是肯定的。本文将带您实现基于网络驱动的网络用户界面自动化。

本文通过直接调用Selenium、Curl命令和ChromeDriver来实现同样的功能。

编程语言为C#,已经通过了Visual Studio 2019中的测试,其他主流编程语言也可以完成同样的功能。

对比三种实现方法,我们很容易理解如何直接调用WebDriver来完成Web UI的自动化,而不需要Selenium。

在阅读以下内容之前,您需要具备Selenium和WebDriver的基本知识。


手动步骤


1.打开Chrome浏览器

2.进入https://www.baidu.com/主页

3.搜索框输入“Selenium”

4.点击“百度一下”

5.关闭Chrome浏览器


调用Selenium的C#代码


using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;


namespace HelloSelenium
{
    class Program
    {
        static void Main(string[] args)
        {
            IWebDriver driver = null;
            try
            {
                //1.  打开Chrome浏览器
                driver = new ChromeDriver();
                //2.  进入https://www.baidu.com/主页
                driver.Navigate().GoToUrl("https://www.baidu.com/");
                //3.    搜索框输入“Selenium”
                driver.FindElement(By.Id("kw")).SendKeys("Selenium");
                //4.  点击“百度一下”
                driver.FindElement(By.Id("su")).Click();
            }
            finally
            {
                //5.  关闭Chrome浏览器
                if (driver != null)
                {
                    driver.Dispose();
                }
            }
        }
}
}


Curl命令


打开Chrome浏览器


启动命令提示符,执行chromedriver.exe --port=9515 (注意选用与Chrome版本对应的chromedriver版本,端口只要未被占用即可)。


另起一个命令提示符,执行curl命令(注意端口号),记住返回的sessionId。

curl  -d @JsonFile1.json http://localhost:9515/session


JsonFile1.json内容:

{
  "desiredCapabilities": {
    "caps": {
      "nativeEvents": false,
      "browserName": "chrome",
      "version": "",
      "platform": "ANY"
    }
  }
}

(左右滑动查看完整代码)


进入

主页


curl -d @JsonFile2.json http://localhost:9515/session/36d903cbd2177c278b5d39bbe74a3318/url


JsonFile2.json内容:



搜索框输入“Selenium”


获取elementId:

curl -d @JsonFile3.json http://localhost:9515/session/36d903cbd2177c278b5d39bbe74a3318/element


JsonFile3.json内容:

{"using":"css selector","value":"#kw"}


输入“Selenium”:

curl -d @JsonFile4.json http://localhost:9515/session/36d903cbd2177c278b5d39bbe74a3318/element/0.7861531328870939-1/value


JsonFile4.json内容:

{"value":["Selenium"]}


点击“百度一下”


获取elementId:

curl -d @JsonFile5.json http://localhost:9515/session/36d903cbd2177c278b5d39bbe74a3318/element


JsonFile5.json内容:

{"using":"css selector","value":"#su"}


点击:

curl -d @JsonFile4.json curl -d @JsonFile6.json http://localhost:9515/session/36d903cbd2177c278b5d39bbe74a3318/element/0.7861531328870939-2/click


JsonFile6.json内容:

{}


关闭Chrome浏览器


关闭Chrome:

关闭Chrome
curl -X DELETE http://localhost:9515/session/36d903cbd2177c278b5d39bbe74a3318


关闭chromedriver.exe:

curl http://localhost:9515/shutdown


调用ChromeDriver的C#代码


using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;


namespace HelloSelenium
{
    class Program
    {
        static IList<HttpCmd> cmdArr;


        static readonly string baseUrl = "http://localhost:9515/";


        static readonly string extendUrlFormat1 = "session";
        static readonly string extendUrlFormat2 = "session/{sessionId}/url";
        static readonly string extendUrlFormat3 = "session/{sessionId}/element";
        static readonly string extendUrlFormat4 = "session/{sessionId}/element/{elementId}/value";
        static readonly string extendUrlFormat5 = "session/{sessionId}/element";
        static readonly string extendUrlFormat6 = "session/{sessionId}/element/{elementId}/click";
        static readonly string extendUrlFormat7 = "session/{sessionId}";
        static readonly string extendUrlFormat8 = "shutdown";


        static readonly string jsonData1 = @"{""desiredCapabilities"": { ""caps"": {""nativeEvents"": false, ""browserName"": ""chrome"", ""version"": """",""platform"": ""ANY""}}}";
        static readonly string jsonData2 = @"{""url"":""https://www.baidu.com/""}";
        static readonly string jsonData3 = @"{""using"":""css selector"",""value"":""#kw""}";
        static readonly string jsonData4 = @"{""value"":[""Selenium""]}";
        static readonly string jsonData5 = @"{""using"":""css selector"",""value"":""#su""}";
        static readonly string jsonData6 = @"{}";


        static Dictionary<string, string> dicSe = new Dictionary<string, string>()
            {{"{sessionId}", null}};
        static Dictionary<string, string> dicSeEl = new Dictionary<string, string>()
            {{"{sessionId}", null},{"{elementId}", null}};


        static Program()
        {
            cmdArr = new List<HttpCmd>()
            {
                new HttpCmd(null, null, null, null),
                new HttpCmd("POST", extendUrlFormat1, jsonData1, null),
                new HttpCmd("POST", extendUrlFormat2, jsonData2, dicSe),
                new HttpCmd("POST", extendUrlFormat3, jsonData3, dicSe),
                new HttpCmd("POST", extendUrlFormat4, jsonData4, dicSeEl),
                new HttpCmd("POST", extendUrlFormat5, jsonData5, dicSe),
                new HttpCmd("POST", extendUrlFormat6, jsonData6, dicSeEl),
                new HttpCmd("DELETE", extendUrlFormat7, null, dicSe),
                new HttpCmd("GET", extendUrlFormat8, null, null),
            };
        }
        


        static void Main(string[] args)
        {
            Process p = null;
            try
            {
                string response = null, sessionId = null, elementId = null, extendUrl;
                JObject jObj = null;


                //1.  打开Chrome浏览器
                //启动chromedriver.exe
                p = Process.Start(@"D:\Software\chromedriver.exe", "--port=9515");
                Thread.Sleep(1000);


                //启动chrome
                response = HttpOp(cmdArr[1]);
                jObj = JsonConvert.DeserializeObject(response) as JObject;
                sessionId = jObj["sessionId"].Value<string>();
                dicSe["{sessionId}"] = sessionId;
                dicSeEl["{sessionId}"] = sessionId;
                Thread.Sleep(1000);


                //2.  进入https://www.baidu.com/主页
                HttpOp(cmdArr[2]);
                Thread.Sleep(1000);


                //3.    搜索框输入“Selenium”
                //获取elementId
                response = HttpOp(cmdArr[3]);
                jObj = JsonConvert.DeserializeObject(response) as JObject;
                elementId = jObj["value"]["ELEMENT"].Value<string>();
                dicSeEl["{elementId}"] = elementId;
                //输入“Selenium”
                HttpOp(cmdArr[4]);
                Thread.Sleep(1000);


                //4.  点击“百度一下”
                //获取elementId
                response = HttpOp(cmdArr[5]);
                jObj = JsonConvert.DeserializeObject(response) as JObject;
                elementId = jObj["value"]["ELEMENT"].Value<string>();
                dicSeEl["{elementId}"] = elementId;
                //点击
                HttpOp(cmdArr[6]);
                Thread.Sleep(1000);


                //5.  关闭Chrome浏览器
                //关闭Chrome
                HttpOp(cmdArr[7]);
                //关闭chromedriver
                HttpOp(cmdArr[8]);
            }
            finally
            {
                if (p != null)
                {
                    p.WaitForExit(3000);
                    p.Dispose();
                }
            }
        }


        private static string HttpOp(HttpCmd cmd)
        {
            var fullUrl = baseUrl + cmd.ExtendUrl;
            HttpClient client = new HttpClient();
            Task<HttpResponseMessage> response = null;
            switch (cmd.Method)
            {
                case "GET":
                    response = client.GetAsync(fullUrl);
                    break;
                case "DELETE":
                    response = client.DeleteAsync(fullUrl);
                    break;
                case "POST":
                    HttpContent content = new StringContent(cmd.JsonData, Encoding.UTF8, "application/json");
                    response = client.PostAsync(fullUrl, content);
                    break;
            }
            return response.Result.Content.ReadAsStringAsync().Result;
        }


        internal class HttpCmd
        {
            public string Method { get; set; }
            public string ExtendUrlFormat { get; set; }
            public string JsonData { get; set; }
            public Dictionary<string, string> ParaDictionary { get; set; }


            public string ExtendUrl => BuildExtendUrl();


            public HttpCmd(string method, string extendUrlFormat, string jsonData, Dictionary<string, string> paraDictionary)
            {
                this.Method = method;
                this.ExtendUrlFormat = extendUrlFormat;
                this.JsonData = jsonData;
                this.ParaDictionary = paraDictionary;
            }


            private string BuildExtendUrl()
            {
                var extendUrl = ExtendUrlFormat;
                if (ParaDictionary != null && ParaDictionary.Count > 0)
                {
                    foreach (var pair in ParaDictionary)
                    {
                        extendUrl = extendUrl.Replace(pair.Key, pair.Value);
                    }
                }


                return extendUrl;
            }
        }
    }
}


总结


Curl命令就是Http调用WebDriver命令。


调用ChromeDriver的代码也是Http调用WebDriver命令,调用Selenium的代码实际上还是Http调用WebDriver命令。只不过不是直接调用,而是通过Selenium去执行WebDriver命令。Selenium封装了WebDriver。


至于Selenium具体是怎么封装WebDriver的,内容较多,本文不做这部分的分析。


使用直接Http调用WebDriver命令的方式来做Web UI自动化,写代码很麻烦,实用价值很低。本文并不鼓励大家在实际工作中使用这样的方式来做自动化。


但是,如果你在工作中经常用到Selenium,想具体了解Selenium的原理,成为高手,学习这种方式是必要的。


这种方式非常有助于深入学习和理解Selenium,是Selenium高手所必备的知识和技能。

相关推荐

React 开发翻车现场!这 6 个救命技巧,90% 工程师居然现在才知道

前端圈最近都在卷React18新特性,可咱开发时踩的坑却一个比一个离谱!组件卡死、状态乱套、路由错乱...别担心!今天分享6个超实用的React实战技巧,让你轻松拿捏开发难题,代码直接...

Web前端:React JS越来越受欢迎,它的主要优点为什么要使用它?

  ReactJS是一个开源JavaScript库,用于为单页应用程序构建用户界面,它还为不同的移动应用程序提供视图层,并创建可重用的UI组件。  我们可以在Web应用程序的数据中创建特定的更改,而...

性能焦虑!前端人必看!5 个 React 组件优化神技! 颠覆你的认知!

在前端开发的赛道上,性能优化就像一场永不停歇的马拉松。作为前端工程师,你是否常常为React组件的性能问题头疼不已?页面加载缓慢、组件频繁重渲染,这些痛点分分钟让开发进度受阻。别担心!今天就来分享...

React 实战必学!99% 工程师踩过的 5 大坑,3 招教你轻松破解

前端开发的小伙伴们,咱就是说,React现在可是前端界的“顶流明星”,热度一直居高不下!但用它开发项目的时候,是不是总有那么些瞬间,让你怀疑人生,对着屏幕疯狂抓头发?别慌!今天就给大家分享几个超实...

惬意!午间一道 React 题,轻松拿捏前端面试小技巧

忙碌了一上午,眼睛酸涩、脑子发懵?别急着刷短视频“放空”,不如花几分钟和我一起“品尝”一道React面试题小甜点!就像在阳光洒满窗台的午后,泡一杯热茶,惬意又能悄悄涨知识,何乐而不为?最近,...

一起深入盘点 2025 年 React 发展的 10个趋势?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.React服务器组件React服务...

前端掉坑血泪史!4 个 React 性能优化绝招让页面秒开

在前端圈子里摸爬滚打这么多年,我发现React开发时踩坑的经历大家都大同小异。页面加载慢、组件频繁重渲染、状态管理混乱……这些痛点,相信不少前端工程师都感同身受。别愁!今天就给大家分享4个超...

前端人崩溃瞬间!5 招 React 实战技巧让项目起死回生

有没有在写React项目时,遇到页面卡顿到怀疑人生、数据更新不及时、代码逻辑混乱到无从下手的情况?别慌!作为摸爬滚打多年的前端老炮,今天就把5个救命级的React实战技巧倾囊相授,帮你轻松...

8.3K star!React Bits,让你拥有全网几乎所有动画效果

前端开源项目101专栏:一个能让你更快接触到高质量开源项目的地方。我会探索分享精选101个高质量的开源项目。这是系列的第7篇文章,分享一套拥有计划全网所有动画效果,且创意最丰富的动画React组...

开始学习React - 概览和演示教程

#头条创作挑战赛#本文同步本人掘金平台的原创翻译:https://juejin.cn/post/6844903823085944846当我刚开始学习JavaScript的时候,我就听说了React,但...

阿里AI工具Web Dev上线!一句话生成React网页

5月11日,阿里巴巴推出全新AI工具“WebDev”,支持用户通过一句话指令生成网页应用。该工具集成HTML、CSS、JavaScript三大前端核心技术,并统一采用React框架实现,可在数秒内创...

JS流行框架/库排名Top100,看看你熟知的Js排第几

权威的JavaScript趋势榜stats.js.org每15分钟根据github上的stars和forks总数实时汇总出JavaScript开源项目的流行度排名,一起来看看你所熟知的项目排名第几...

新手如何搭建个人网站

ElementUl是饿了么前端团队推出的桌面端UI框架,具有是简洁、直观、强悍和低学习成本等优势,非常适合初学者使用。因此,本次项目使用ElementUI框架来完成个人博客的主体开发,欢迎大家讨论...

站在巨人肩膀上的 .NET 通用权限开发框架:Admin.NET

站在巨人肩膀上的.NET通用权限开发框架Admin.NET是一个面向.NET程序员的低代码平台,java平台类似的框架有ruoyi,芋道,JeelowCode等。这类框架普遍采用前后端分离的开发技...

Python+selenium自动化之判定元素是否存在

在测试过程中,我碰到过这类的问题,使用find_element却找不到某个元素而产生异常,这就需要在操作某个元素之前判定该元素是否存在,而selenium中没有判定元素是否存在的方法,或者判定相同的元...

取消回复欢迎 发表评论: