前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C/C++ 发送与接收HTTP/S请求

C/C++ 发送与接收HTTP/S请求

作者头像
微软技术分享
发布于 2023-11-29 01:57:06
发布于 2023-11-29 01:57:06
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议。它是一种无状态的、应用层的协议,用于在计算机之间传输超文本文档,通常在 Web 浏览器和 Web 服务器之间进行数据通信。HTTP 是由互联网工程任务组(IETF)定义的,它是基于客户端-服务器模型的协议,其中客户端向服务器发送请求,服务器以相应的数据作为响应。HTTP 协议是建立在 TCP/IP 协议之上的,通常使用默认的端口号80。

以下是 HTTP 的一些关键特点:

  1. 文本协议: HTTP 是一种文本协议,通过纯文本的方式传输数据。这使得它易于阅读和调试,但也带来了一些安全性方面的问题,因此在需要更安全的通信时,通常会使用 HTTPS(HTTP Secure)来加密通信内容。
  2. 无状态协议: HTTP 是一种无状态协议,意味着每个请求和响应之间都是相互独立的,服务器不会保存关于客户端的任何状态信息。这导致了一些问题,例如在进行用户身份验证时,需要额外的机制来保持状态。
  3. 请求方法: HTTP 定义了一组请求方法,其中最常见的包括 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。这些方法指示了客户端对服务器执行的操作。
  4. 状态码: 服务器在响应中返回一个状态码,用于表示请求的处理结果。常见的状态码包括200(OK,请求成功)、404(Not Found,未找到请求的资源)、500(Internal Server Error,服务器内部错误)等。
  5. URL(Uniform Resource Locator): HTTP 使用 URL 来标识和定位网络上的资源。URL 包括协议部分(如 "http://")、主机名(如 "www.example.com")、路径部分(如(-lm3g6611ahhripqxl6lpyi/) "/path/to/resource")等。
  6. Header(报头): HTTP 的请求和响应中都包含头部信息,用于传递关于消息的附加信息。头部可以包含各种信息,如身份验证信息、内容类型、缓存控制等。

HTTP 是万维网上数据通信的基础,它定义了客户端和服务器之间的通信规范。它支持超文本(Hypertext),使得用户能够通过点击链接访问和浏览相关的文档和资源,是构建 Web 应用程序的重要基础之一。

Web路径分割

如下提供的代码片段包含了两个用于分割URL的函数:HttpUrlSplitAHttpUrlSplitB。这些函数的目的是从给定的URL中提取主机名和路径。下面是对两个函数的概述:

  1. HttpUrlSplitA函数:
    • 使用Windows APIInternetCrackUrl函数,该函数专门用于解析URL。
    • 通过URL_COMPONENTS结构体来传递和接收URL的不同部分,包括主机名和路径。
    • 适用于对URL进行标准化处理的情境,直接调用系统提供的功能。
  2. HttpUrlSplitB函数:
    • 手动实现对URL的解析,通过检查URL的开头,然后手动提取主机名和路径。
    • 对URL进行了一些基本的检查,如是否以 "http://" 或 "https://" 开头。
    • 提供了一种更灵活的方式,但需要开发者自己处理解析逻辑。

总体而言,这两个函数都属于URL处理的一部分,但选择使用哪个函数可能取决于具体的项目需求和开发者的偏好。HttpUrlSplitA直接利用Windows API提供的功能,更为直观。而HttpUrlSplitB则通过手动解析,提供了更多的控制权。在实际项目中,选择取决于开发者对项目的要求和对代码控制的需求。

InternetCrackUrl 用于解析 URL。它将 URL 拆分为各个组成部分,例如协议、主机名、端口、路径等。这个函数的目的是方便开发者处理 URL,以便更容易地获取和使用其中的信息。

以下是关于 InternetCrackUrl 函数的一些关键信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BOOL InternetCrackUrl(
  _In_  PCTSTR lpszUrl,
  _In_  DWORD   dwUrlLength,
  _In_  DWORD   dwFlags,
  _Out_ LPURL_COMPONENTS lpUrlComponents
);
  • lpszUrl: 指向包含 URL 字符串的空终止字符串的指针。
  • dwUrlLength: URL 字符串的长度,如果是 NULL 终止字符串,可以设置为 DWORD(-1)
  • dwFlags: 一组标志,用于指定解析行为。
  • lpUrlComponents: 指向一个 URL_COMPONENTS 结构体的指针,该结构体用于接收 URL 的各个组成部分。

URL_COMPONENTS 结构体包括以下字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct _URL_COMPONENTS {
  DWORD dwStructSize;
  LPTSTR lpszScheme;
  DWORD dwSchemeLength;
  INTERNET_SCHEME nScheme;
  LPTSTR lpszHostName;
  DWORD dwHostNameLength;
  INTERNET_PORT nPort;
  LPTSTR lpszUserName;
  DWORD dwUserNameLength;
  LPTSTR lpszPassword;
  DWORD dwPasswordLength;
  LPTSTR lpszUrlPath;
  DWORD dwUrlPathLength;
  LPTSTR lpszExtraInfo;
  DWORD dwExtraInfoLength;
} URL_COMPONENTS, *LPURL_COMPONENTS;
  • dwStructSize: 结构体大小。
  • lpszScheme: 指向字符串的指针,该字符串包含 URL 的方案部分(如 "http")。
  • nScheme: 表示 URL 方案的整数值。
  • lpszHostName: 指向字符串的指针,包含主机名部分。
  • nPort: 表示端口号。
  • lpszUserNamelpszPassword: 分别是用户名和密码的部分。
  • lpszUrlPath: URL 路径部分。
  • lpszExtraInfo: 额外信息。

InternetCrackUrl 的返回值为 BOOL 类型,如果函数成功,返回非零值,否则返回零。函数成功后,lpUrlComponents 结构体中的字段将被填充。

这个函数通常用于在网络编程中处理 URL,例如在创建网络请求时提取主机名、端口和路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <Windows.h>
#include <string>
#include <WinInet.h>

#pragma comment(lib, "WinInet.lib")
#pragma comment(lib,"ws2_32")

using namespace std;

// 通过InternetCrackUrl函数实现切割
BOOL HttpUrlSplitA(const char* URL, LPSTR pszHostName, LPSTR pszUrlPath)
{
	BOOL bRet = FALSE;
	URL_COMPONENTS url_info = { 0 };
	RtlZeroMemory(&url_info, sizeof(url_info));

	url_info.dwStructSize = sizeof(url_info);

	url_info.dwHostNameLength = MAX_PATH - 1;
	url_info.lpszHostName = pszHostName;

	url_info.dwUrlPathLength = MAX_PATH - 1;
	url_info.lpszUrlPath = pszUrlPath;

	bRet = InternetCrackUrl(URL, 0, 0, &url_info);
	if (FALSE == bRet)
	{
		return FALSE;
	}
	return TRUE;
}

int main(int argc, char* argv[])
{
	char szHostName[1024] = { 0 };
	char szUrlPath[1024] = { 0 };

	BOOL flag = HttpUrlSplitA("http://www.xxx.com/index.html", szHostName, szUrlPath);

	if (flag == TRUE)
	{
		printf("输出主路径:%s \n", szHostName);
		printf("输出子路径:%s \n", szUrlPath);
	}

	system("pause");
	return 0;
}

运行后则会对http://www.xxx.com/index.html字符串进行路径切割,并输出主目录与子路径,如下图所示;

相对于使用原生API切割,自己实现也并不难,如下所示,通过_strnicmp判断字符串长度并切割特定的位置,实现对字符串的切割;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <Windows.h>
#include <string>
#include <WinInet.h>

#pragma comment(lib, "WinInet.lib")
#pragma comment(lib,"ws2_32")

using namespace std;

// 自己实现对URL路径的拆分
bool HttpUrlSplitB(const char* pszUrl)
{
	char szHost[256] = { 0 };
	char* ptr = (char*)pszUrl;

	// 判断开头是否为http:// 或者 https:// 如果不是则返回-1
	if (_strnicmp(ptr, "http://", 7) == 0)
	{
		ptr = ptr + 7;
	}
	else if (_strnicmp(ptr, "https://", 8) == 0)
	{
		ptr = ptr + 8;
	}
	else
	{
		return false;
	}

	int index = 0;
	while (index < 255 && *ptr && *ptr != '/')
	{
		szHost[index++] = *ptr++;
	}
	szHost[index] = '\0';
	printf("主域名: %s \n 路径: %s \n", szHost, ptr);
	return true;
}

int main(int argc, char* argv[])
{
	BOOL flag = HttpUrlSplitB("http://www.xxx.com/index.html");

	system("pause");
	return 0;
}

实现HTTP访问

HTTP 通常基于TCP(Transmission Control Protocol)。HTTP的本质是建立在底层的Socket通信之上的一种应用层协议。

概述HTTP访问的过程:

  1. 建立TCP连接: HTTP通信首先需要建立TCP连接,通常默认使用TCP的80端口。在建立连接之前,客户端和服务器需要通过DNS解析获取对应的IP地址。
  2. 发送HTTP请求: 客户端通过Socket向服务器发送HTTP请求,请求包括请求方法(GET、POST等)、URL路径、HTTP协议版本等信息。同时,客户端可以附带一些请求头(Headers)和请求体(Body),具体内容根据请求的性质而定。
  3. 服务器处理请求: 服务器接收到客户端的HTTP请求后,根据请求的内容进行处理。处理的方式取决于请求的方法,例如GET请求用于获取资源,POST请求用于提交数据等。服务器根据请求返回相应的HTTP响应。
  4. 发送HTTP响应: 服务器通过Socket向客户端发送HTTP响应,响应包括响应状态码、响应头和响应体。响应状态码表示服务器对请求的处理结果,例如200表示成功,404表示未找到资源,500表示服务器内部错误等。
  5. 关闭TCP连接: 一旦HTTP响应发送完毕,服务器关闭与客户端的TCP连接。客户端接收完响应后也可以关闭连接,或者继续发送其他请求。

整个HTTP访问的本质就是通过TCP连接在客户端和服务器之间传递HTTP请求和响应。Socket是负责实际数据传输的底层机制,而HTTP协议则定义了在这个基础上进行通信的规范。这种分层的设计使得不同的应用能够使用同一个底层的网络传输机制,提高了网络通信的灵活性和可扩展性。

通常实现HTTP访问与主机访问相同,唯一的区别是主机应用的访问遵循的是服务端的封包规则,而对于Web来说则需要遵循HTTP特有的访问规则,在Socket正式接收数据之前需要实现一个请求规范,也就是HTTP头部。

HTTP头部(HTTP headers)是HTTP请求和响应中的重要组成部分,它们包含了与请求或响应相关的信息。HTTP头部的格式通常是一个名值对(key-value pair)的集合,每个头部字段由一个字段名和一个字段值组成,它们以冒号分隔,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HeaderName: HeaderValue

HTTP头部通常以回车符(Carriage Return,\r)和换行符(Line Feed,\n)的组合(\r\n)结束,每个头部字段之间以\r\n分隔。

以下是一些常见的HTTP头部字段及其示例:

  1. 通用头部(General Headers):
    • Cache-Control: no-cache
    • Date: Tue, 15 Nov 2022 08:12:31 GMT
    • Connection: keep-alive
  2. 请求头部(Request Headers):
    • Host: www.example.com
    • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
    • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  3. 响应头部(Response Headers):
    • Content-Type: text/html; charset=utf-8
    • Content-Length: 12345
    • Server: Apache/2.4.41 (Unix)
  4. 实体头部(Entity Headers):
    • Content-Encoding: gzip
    • Last-Modified: Wed, 20 Oct 2022 12:00:00 GMT
    • Etag: "5f0a3e51-20"

HTTP头部的具体字段和含义可根据HTTP规范进行扩展,不同的应用场景和需求可能需要添加自定义的头部字段。这些头部字段在HTTP通信中起到了传递元信息、控制缓存、指定内容类型等作用。在代码中我们构建了一个如下所示的头部。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int ret = sprintf(context,
	"GET %s HTTP/1.1 \r\n"
	"Host: %s \r\n"
	"User-Agent: Mozilla/5.0 (Windows NT 10.0) LyShark HttpGet 1.0 \r\n"
	"Accept-Type: */* \r\n"
	"Connection: Close \r\n\r\n",
	szSubPath, szURL);

在这个HTTP GET请求的基本格式,它包含了一些必要的头部信息。让我们逐行解释:

  1. "GET %s HTTP/1.1 \r\n": 这表示使用HTTP协议的GET请求方式,%s会被替换为实际的URL路径,HTTP版本为1.1。
  2. "Host: %s \r\n": 这里设置了HTTP请求的Host头部,指定了服务器的主机名,%s会被替换为实际的主机名。
  3. "User-Agent: Mozilla/5.0 (Windows NT 10.0) LyShark HttpGet 1.0 \r\n": 这是User-Agent头部,它标识了发送请求的用户代理(即浏览器或其他客户端)。这里的字符串表示使用Mozilla浏览器5.0版本,运行在Windows NT 10.0操作系统上,LyShark HttpGet 1.0表示这个请求的自定义用户代理。
  4. "Accept-Type: */* \r\n": 这是Accept-Type头部,表示客户端可以接受任意类型的响应内容。
  5. "Connection: Close \r\n\r\n": Connection头部表示在完成请求后关闭连接,避免保持连接。\r\n\r\n表示头部结束,之后是可选的请求体。

综合起来,这个HTTP GET请求的目的是获取指定URL路径的资源,请求头部包含了一些必要的信息,例如主机名、用户代理等。这是一个基本的HTTP请求格式,可以根据具体需求添加或修改头部信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <Windows.h>
#include <string>
#include <WinInet.h>

#pragma comment(lib, "WinInet.lib")
#pragma comment(lib,"ws2_32")

using namespace std;

// 通过InternetCrackUrl函数实现切割
BOOL HttpUrlSplitA(const char* URL, LPSTR pszHostName, LPSTR pszUrlPath)
{
	BOOL bRet = FALSE;
	URL_COMPONENTS url_info = { 0 };
	RtlZeroMemory(&url_info, sizeof(url_info));

	url_info.dwStructSize = sizeof(url_info);

	url_info.dwHostNameLength = MAX_PATH - 1;
	url_info.lpszHostName = pszHostName;

	url_info.dwUrlPathLength = MAX_PATH - 1;
	url_info.lpszUrlPath = pszUrlPath;

	bRet = InternetCrackUrl(URL, 0, 0, &url_info);
	if (FALSE == bRet)
	{
		return FALSE;
	}
	return TRUE;
}

// Get方式访问页面
char* Curl(const char* szURL, const char* szSubPath, const int port)
{
	WSADATA wsaData;
	WSAStartup(0x0202, &wsaData);

	char* context = new char[1024 * 8];
	int ret = sprintf(context,
		"GET %s HTTP/1.1 \r\n"
		"Host: %s \r\n"
		"User-Agent: Mozilla/5.0 (Windows NT 10.0) LyShark HttpGet 1.0 \r\n"
		"Accept-Type: */* \r\n"
		"Connection: Close \r\n\r\n",
		szSubPath, szURL);

	SOCKADDR_IN addr;
	SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
	addr.sin_addr.S_un.S_addr = 0;
	addr.sin_port = htons(0);
	addr.sin_family = AF_INET;

	ret = bind(sock, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
	hostent* local_addr = gethostbyname(szURL);

	if (local_addr)
	{
		ULONG ip = *(ULONG*)local_addr->h_addr_list[0];
		addr.sin_addr.S_un.S_addr = ip;
		addr.sin_port = htons(port);

		ret = connect(sock, (const sockaddr*)&addr, sizeof(SOCKADDR_IN));
		if (ret == NOERROR)
		{
			ret = send(sock, (const char*)context, (int)strlen(context), 0);
			do
			{
				ret = recv(sock, context, 8191, 0);
				if (ret <= 0)
				{
					break;
				}
				context[ret] = '\0';
				printf("\n%s\n\n", context);
			} while (TRUE);
		}
	}
	closesocket(sock);
	WSACleanup();
	return context;
}

// 访问指定页面
char* HttpGet(const char* szURL, const int port)
{
	char master_url[1024] = { 0 };
	char slave_url[1024] = { 0 };
	char* curl_context = nullptr;

	// 将完整路径切割为主路径与次路径
	BOOL ref = HttpUrlSplitA(szURL, master_url, slave_url);
	if (TRUE == ref)
	{
		// 获取所有网页内容
		curl_context = Curl(master_url, slave_url, port);
		return curl_context;
	}
	return 0;
}

int main(int argc, char* argv[])
{
	char *szBuffer = HttpGet("http://www.lyshark.com/index.html", 80);

	// printf("%s \n", szBuffer);
	
	system("pause");
	return 0;
}

运行上述代码则会自动请求http://www.lyshark.com/index.html路径的80端口,以获取返回参数信息,如下图所示;

实现HTTPS访问

HTTPS的访问与HTTP基本类似,同样是通过Socket访问端口,同样是发送特定的GET请求头,唯一的不同在于当链接被建立后,对于HTTPS来说多出一个TLS协商的过程,这是为了保护传输时的安全而增加的安全特定,为了能实现访问我们需要使用OpenSSL库对完成TLS的握手才行。

OpenSSL 是一个强大的开源软件库,提供了一系列的密码学工具和库函数,广泛用于网络安全应用的开发。它支持许多密码学协议和算法,包括 SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)协议,用于在计算机网络上实现安全通信。

HTTPS握手过程是建立在TLS(Transport Layer Security)协议之上的。TLS是SSL(Secure Sockets Layer)的继任者,用于在计算机网络上保障通信安全。以下是HTTPS握手的基本流程:

  1. 客户端Hello:
    • 客户端向服务器发送ClientHello消息,其中包含支持的TLS版本、支持的加密算法、支持的压缩算法等信息。
  2. 服务器Hello:
    • 服务器从客户端提供的信息中选择一个合适的TLS版本和加密套件,并向客户端发送ServerHello消息,同时发送服务器证书
  3. 认证:
    • 客户端验证服务器发送的证书是否有效,通常包括证书的颁发机构(CA)的签名验证。客户端还可以验证证书中包含的域名是否匹配正在连接的域名。
  4. 密钥交换:
    • 客户端生成一个随机值,使用服务器的公钥加密该随机值,然后将加密后的数据发送给服务器。服务器使用自己的私钥解密,得到客户端生成的随机值。这两个随机值将用于生成对话密钥。
  5. 对话密钥的生成:
    • 客户端和服务器使用客户端生成的随机值、服务器生成的随机值以及前面协商的算法,通过一系列协商步骤生成对话密钥。
  6. 加密通信:
    • 客户端和服务器使用生成的对话密钥对通信进行加密和解密,确保数据的隐私和完整性。

整个握手过程确保了通信双方的身份验证、密钥的安全协商以及通信内容的保密性和完整性。握手完成后,客户端和服务器使用协商得到的对话密钥进行加密通信,从而实现了安全的HTTPS连接。

如下所示代码以演示访问必应为例,需要获取必应的IP地址,以及在GET请求中更改访问域名为BING;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <WinSock2.h>
#include <openssl/ssl.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libssl.lib")
#pragma comment(lib,"libcrypto.lib")

using namespace std;

const wchar_t* GetWC(const char* c)
{
	const size_t cSize = strlen(c) + 1;
	wchar_t* wc = new wchar_t[cSize];
	mbstowcs(wc, c, cSize);
	return wc;
}

int main(int argc, char* argv[])
{
	WSADATA WSAData;
	SOCKET sock;
	struct sockaddr_in ClientAddr;

	if (WSAStartup(MAKEWORD(2, 0), &WSAData) != SOCKET_ERROR)
	{
		ClientAddr.sin_family = AF_INET;
		ClientAddr.sin_port = htons(443);
		ClientAddr.sin_addr.s_addr = inet_addr("202.89.233.101");

		sock = socket(AF_INET, SOCK_STREAM, 0);
		int Ret = connect(sock, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr));
		if (Ret == 0)
		{
		}
	}

	// 初始化OpenSSL库 创建SSL会话环境等
	SSL_CTX* pctxSSL = SSL_CTX_new(TLSv1_2_client_method());
	if (pctxSSL == NULL)
	{
		return -1;
	}
	SSL* psslSSL = SSL_new(pctxSSL);
	if (psslSSL == NULL)
	{
		return -1;
	}
	SSL_set_fd(psslSSL, sock);
	INT iErrorConnect = SSL_connect(psslSSL);
	if (iErrorConnect < 0)
	{
		return -1;
	}
	std::wcout << "SLL ID: " << SSL_get_cipher(psslSSL) << std::endl;

	// 发包
	std::string strWrite =
		"GET https://cn.bing.com/ HTTP/1.1\r\n"
		"Host: cn.bing.com\r\n"
		"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0 \r\n"
		"Accept-Type: */* \r\n"
		"Connection: close\r\n\r\n";

	INT iErrorWrite = SSL_write(psslSSL, strWrite.c_str(), strWrite.length()) < 0;
	if (iErrorWrite < 0)
	{
		return -1;
	}

	// 收包并输出
	LPSTR lpszRead = new CHAR[8192];
	INT iLength = 1;
	while (iLength >= 1)
	{
		iLength = SSL_read(psslSSL, lpszRead, 8192 - 1);
		if (iLength < 0)
		{
			std::wcout << "Error SSL_read" << std::endl;
			delete[] lpszRead;
			return -1;
		}
		lpszRead[iLength] = TEXT('\0');
		std::wcout << GetWC(lpszRead);
	}
	delete[] lpszRead;

	closesocket(sock);
	WSACleanup();

	system("pause");
	return 0;
}

成勋运行后将会对必应发起https访问,并获取返回值信息,如下图所示;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QT4C-Windows自动化测试框架正式开源
QT4C是什么 QTA作为腾讯内部元老级的自动化测试项目,之前已经先后对QTAF、QT4A、QT4i、QT4W进行了开源。在QTA正式对外开源提供了Android端、iOS端以及Web端的自动化测试能力后,外界对于Windows端自动化测试框架的呼声越来越高。   QT4C(Quick Test for Client)作为基于QTA提供的面向Win32应用的UI测试自动化测试框架,此次开源弥补了QTA自动化测试项目在Windows端能力的不足。QT4C使用Python开发,实现了Windows端的U
腾讯开源
2020/03/09
3.2K0
【开源公告】多平台Web自动化测试框架QT4W开源
QT4W (Quick Test for Web)是使用Python开发的Web自动化框架,是QTA(QTA是一套集成面向多端多平台的自动化测试解决方案,包括QT4A,QT4A,QT4C等,其中QT4A及QT4I已经开源)自动化体系内实现支持Web自动化测试能力的支持库。QT4W和QT4A一起使用时,可以实现Android端的Web自动化,和QT4I一起使用时,可以进行IOS端Web自动化。 本框架采用分层设计,将整个Web自动化过程抽象出了三个层次:WebControl层,WebDriver层以及原生
腾讯开源
2019/06/21
1.4K0
【开源公告】多平台Web自动化测试框架QT4W开源
自动化测试框架
为了适应快速发展的行业生态系统的步伐,必须加快应用程序交付时间,而且必须不能以质量为代价。在更短的时间内达到质量的目的至关重要,因此质量保障倍受关注。为了满足对卓越质量和更快迭代的要求,越来越多的企业引入自动化,并将优先进行自动化测试。敏捷开发模型使其测试过程自动化变得越来越必要,但是最关键的方面是选择正确的测试自动化框架。
FunTester
2020/09/27
2.2K0
腾讯最热门30款开源项目
开源是个好东西,马化腾除了王者荣耀还是干了些好事情的。腾讯最近开源的一些比较热门的项目,可以学习了解下哈
Anymarvel
2018/10/22
4.5K0
腾讯最热门30款开源项目
浅谈自动化测试的价值和常见误区
如下图是大部分质量工程师都知道的分层测试体系,其中UI自动化所占的比例虽然看起来很小,但是其能发挥的价值还是很大的。
岛哥的质量效能笔记
2021/09/14
6040
浅谈自动化测试的价值和常见误区
狠狠地聊一下UI自动化测试
我发现了,大家极度关心自动化测试,尤其是UI自动化测试,虽然现在作为专项测试,离开这些越来越远了,但总能遥想以前,我总能想起自己做nokia的WindowsLive的ui自动化,做web的自动化测试,后面加入腾讯,写过pc的自动化,作为早期的终端测试,做android的自动化,然后mac的,然后ios。 先不说有多少成功经验,但是确实有一些感悟,现在分享给大家,希望能帮助大家思考,少走弯路。
顾翔
2019/12/11
8910
狠狠地聊一下UI自动化测试
APP的UI自动化测试框架及平台化探索,看完这篇就够了
顾铮,10年+测试及测试开发相关经验,2014年加入京东,曾主导设计开发UI测试框架,参与CI测试平台建设,现负责iOS侧的工具,框架建设。在UI自动化,性能测试,单元测试方面有较深入研究,在App,web端等有较丰富的测试开发和设计经验。
京东技术
2018/07/30
6.7K1
APP的UI自动化测试框架及平台化探索,看完这篇就够了
【腾讯 TMQ 】移动 APP 自动化测试框架对比
作者:赵丽娜 简介 移动 APP 的 UI 自动化测试长久以来一直是一个难点,难点在于UI的”变”, 变化导致自动化用例的大量维护。 从分层测试的角度,自动化测试应该逐层进行。 最大量实现自动化测试的
腾讯移动品质中心TMQ
2017/03/06
6.6K0
从理论到工具:带你全面了解自动化测试框架
软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐,必须加快应用程序的交付时间,但不能以牺牲质量为代价。快速实现质量是必要的,因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求,自动化测试将被优先考虑。对于微型、小型和中型企业(SMEs)来说,自动化自身的测试过程是非常必要的,而最关键的方面是选择正确的自动化测试框架。
陈哥聊测试
2020/10/19
1.6K0
从理论到工具:带你全面了解自动化测试框架
腾讯开源的使用秘籍,你值得拥有
腾讯开源经历了5年的发展,越来越多的优秀项目成为开源项目,供广大开发者学习与使用。我们看到,腾讯的工程师们已经被开源的力量唤醒。微信团队开源了绝大部分微信的代码,包括UI界面,终端数据库,热更新、终端跨平台组件等。而QQ、腾讯互娱等团队也逐渐把代码开源共享。 下面,就让小编带你走进腾讯开源,一起来向腾讯的技术大神“取经”。 1找到Tencent组织 在IT圈有一个很有趣的名词叫“造轮子”,指的是同一个组织的人一起来开发一项技术。“造轮子”成为开源精神的一个重要体现。组织的构建,一方面是一批程序员共同
腾讯开源
2018/03/02
1.3K0
腾讯开源的使用秘籍,你值得拥有
解放程序猿(媛)的双手---iOS UI自动化测试
前言 随着移动互联网时代的蓬勃发展,移动终端的自动化测试也在业界日益活跃,总体来看在Android平台上的自动化工具和实践比较多,但是说到iOS平台无论从自动化工具的数量还是质量上就陡降了。究其原因,无外乎是iOS系统的封闭性,加上相对Android用户的数量少,导致对这个平台系统的自动化进展缓慢,据笔者了解到的情况,很多iOS平台的测试人员还处于纯手工测试模式,自动化程度和Android平台无法相论,更别提和PC端相比了。 然而越是困难的事,越是研究的少,就越发有挑战性。有挑战性的事大多又会带来不菲的收益
腾讯移动品质中心TMQ
2018/02/06
4.4K0
解放程序猿(媛)的双手---iOS UI自动化测试
Appium自动化测试框架探索与实践
在目前效率为王的互联网时代,移动应用自动化测试逐渐替代原始的手工功能测试,越来越成为测试界的时尚宠儿,小编在这里也为大家介绍下现有的客户端自动化测试框架:Appium、Airtest,并简单比较下两者的区别,同时重点介绍Appium自动化测试框架,大家跟随小编的脚步一起来探索客户端自动化测试框架吧~
用户5521279
2020/08/21
3K0
Appium自动化测试框架探索与实践
Android自动化测试框架QT4A搭建
PC电脑下载应用宝,将android手机与电脑连接,打开“开发者选项”,打开“USB调试”,确认可以识别到设备连接成功。
小白will
2019/06/17
2.5K0
Android自动化测试框架QT4A搭建
FAutoTest:一个免费的H5、小程序自动化测试框架
FAutoTest是腾讯开源UI自动化测试框架。目前已公开使用,业务涉及腾讯视频、QQ空间、腾讯彩票业务、充值业务、腾讯百科、医疗云等;
Altumn
2019/10/21
3.1K0
FAutoTest:一个免费的H5、小程序自动化测试框架
UI自动化测试|认识Appium
自动化包括一切通过工具的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试工具或自己所写的一段程序。
测试邦
2019/07/24
8940
UI自动化测试|认识Appium
9款开源自动化测试框架!
自动化测试框架由一组最佳实践,通用工具和库组成,可帮助测试人员评估多个Web和移动应用的功能,安全性,可用性和可访问性。而在,软件开发世界中有很多的自动化测试框架,该如何选择?
测试开发技术
2021/12/13
3.5K0
9款开源自动化测试框架!
自动化测试框架如何选型?
在技术交流群看到这样一个问题:应用开发语言是go和C++,做自动化测试用什么语言比较合适?有必要也用go来实现自动化测试吗?又是一个在技术领域被讨论了很久的话题,即框架选型和哪个语言更好。
老_张
2024/05/24
720
自动化测试框架如何选型?
自动化测试框架的完整指南【译】
任何成功的自动化测试过程的关键组成部分都是测试自动化框架。降低维护成本,测试工作效率提升和提高质量保证团队的投资回报率ROI是优化敏捷流程时所提供的主要优势之一。
FunTester
2021/06/23
9390
2022 年全球十大最佳自动化测试工具
自动化测试是指运行软件程序后,自动执行测试用例并在没有任何人为干预的情况下产生测试结果。它比手动测试更优越的地方在于,很大程度上节省了人力和时间,并且在测试中没有或者少有错误。此外,还可以多次测试相同的应用程序,从而最大限度地减少冗余的手动工作。
wencheng
2022/04/18
2.3K0
2022 年全球十大最佳自动化测试工具
收藏!!BAT 程序员们常用的开发工具
Arthas 是阿里巴巴 2018 年 9 月开源的一款 Java 线上诊断工具。
昱良
2019/07/31
1.2K0
推荐阅读
相关推荐
QT4C-Windows自动化测试框架正式开源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验