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

Selenium自动化测试高手必备:基于WebDriver的Web UI自动化

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

Selenium是当前最流行的Web UI自动化测试框架,熟悉Selenium的人也知道,Selenium是基于WebDriver。那么能不能不用Selenium,直接调用WebDriver来实现Web UI自动化呢?

答案当然是可以的,本文就带你来实现基于WebDriver的Web U自动化。本文通过调用Selenium、Curl命令、直接调用ChromeDriver三种方式,实现了同样的功能。编程语言为C#,已在Visual Studio 2019测试通过,其他主流编程语言也可以完成同样功能。对比三种实现方式,大家就可以容易的理解如何不用Selenium而直接调用WebDriver完成Web U自动化。阅读以下内容前,需要有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命令

1.打开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"

   }

   }

  }

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

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

  JsonFile2.json内容:

  {"url":"https://www.baidu.com/"}

3.搜索框输入“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"]}

4.点击“百度一下”

获取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内容:

  {}

5.关闭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高手所必备的知识和技能。

最后:

1)关注+私信回复:“测试”,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试等。

2)关注+私信回复:"入群" 就可以邀请你进入软件测试群学习交流~~

相关推荐

滨州维修服务部“一区一策”强服务

今年以来,胜利油田地面工程维修中心滨州维修服务部探索实施“一区一策”服务模式,持续拓展新技术应用场景,以优质的服务、先进的技术,助力解决管理区各类维修难题。服务部坚持问题导向,常态化对服务范围内的13...

谷歌A2A协议和MCP协议有什么区别?A2A和MCP的差异是什么?

在人工智能的快速发展中,如何实现AI模型与外部系统的高效协作成为关键问题。谷歌主导的A2A协议(Agent-to-AgentProtocol)和Anthropic公司提出的MCP协议(ModelC...

谷歌大脑用架构搜索发现更好的特征金字塔结构,超越Mask-RCNN等

【新智元导读】谷歌大脑的研究人员发表最新成果,他们采用神经结构搜索发现了一种新的特征金字塔结构NAS-FPN,可实现比MaskR-CNN、FPN、SSD更快更好的目标检测。目前用于目标检测的最先...

一文彻底搞懂谷歌的Agent2Agent(A2A)协议

前段时间,相信大家都被谷歌发布的Agent2Agent开源协议刷屏了,简称A2A。谷歌官方也表示,A2A是在MCP之后的补充,也就是MCP可以强化大模型/Agent的能力,但每个大模型/Agent互为...

谷歌提出创新神经记忆架构,突破Transformer长上下文限制

让AI模型拥有人类的记忆能力一直是学界关注的重要课题。传统的深度学习模型虽然在许多任务上取得了显著成效,但在处理需要长期记忆的任务时往往力不从心。就像人类可以轻松记住数天前看过的文章重点,但目前的...

不懂设计?AI助力,人人都能成为UI设计师!

最近公司UI资源十分紧张,急需要通过AI来解决UI人员不足问题,我在网上发现了几款AI应用非常适合用来进行UI设计。以下是一些目前非常流行且功能强大的工具,它们能够提高UI设计效率,并帮助设计师创造出...

速来!手把手教你用AI完成UI界面设计

晨星技术说晨星技术小课堂第二季谭同学-联想晨星用户体验设计师-【晨星小课堂】讲师通过简单、清晰的语言描述就能够用几十秒自动生成一组可编辑的UI界面,AIGC对于UI设计师而言已经逐步发展成了帮助我们...

「分享」一端录制,多端使用的便捷 UI 自动化测试工具,开源

一、项目介绍Recorder是一款UI录制和回归测试工具,用于录制浏览器页面UI的操作。通过UIRecorder的录制功能,可以在自测的同时,完成测试过程的录制,生成JavaScr...

APP自动化测试系列之Appium介绍及运行原理

在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。Appium介绍Appium概念Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序...

【推荐】一个基于 SpringBoot 框架开发的 OA 办公自动化系统

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍oasys是一个基于springboot框架开发的OA办公自动化系统,旨在提高组织的日常运作和管理...

自动化实践之:从UI到接口,Playwright给你全包了!

作者:京东保险宋阳1背景在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的...

销帮帮CRM移动端UI自动化测试实践:Playwright的落地与应用

实施背景销帮帮自2015年成立以来,移动端UI自动化测试的落地举步维艰,移动端的UI自动化测试一直以来都未取得良好的落地。然而移动互联网时代,怎样落地移动端的UI自动化测试以快速稳定进行移动端的端到端...

编写自动化框架不知道该如何记录日志吗?3个方法打包呈现给你。

目录结构1.loguru介绍1.1什么是日志?程序运行过程中,难免会遇到各种报错。如果这种报错是在本地发现的,你还可以进行debug。但是如果程序已经上线了,你就不能使用debug方式了...

聊聊Python自动化脚本部署服务器全流程(详细)

来源:AirPython作者:星安果1.前言大家好,我是安果!日常编写的Python自动化程序,如果在本地运行稳定后,就可以考虑将它部署到服务器,结合定时任务完全解放双手但是,由于自动化程序与平...

「干货分享」推荐5个可以让你事半功倍的Python自动化脚本

作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...

取消回复欢迎 发表评论: