playwright 模拟登录

一、流程如下

C#代码:

cs 复制代码
using Microsoft.Playwright;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Xml.Linq;

namespace TestProject3
{
    [TestClass]
    public class UnitTest1 : PageTest
    {
        [TestMethod]
        public async Task HomepageHasPlaywrightInTitleAndGetStartedLinkLinkingtoTheIntroPage()
        {
            await using var browser = await Playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
            {
                Headless = false,
            });
            var context = await browser.NewContextAsync();
            var page = await context.NewPageAsync();
            await page.GotoAsync("https://boot3.jeecg.com/login?redirect=/dashboard/analysis");
            await page.GetByRole(AriaRole.Textbox, new() { NameString = "账号" }).ClickAsync();
            await page.GetByRole(AriaRole.Textbox, new() { NameString = "账号" }).FillAsync("jeecg");
            await page.GetByRole(AriaRole.Textbox, new() { NameString = "账号" }).PressAsync("Tab");
            await page.GetByRole(AriaRole.Textbox, new() { NameString = "密码" }).FillAsync("jeecg#123456");
            await page.GetByRole(AriaRole.Textbox, new() { NameString = "密码" }).PressAsync("Tab");

            var imageEle = page.Locator("#app > div > div:nth-child(4) > div > div > div > div.aui-formBox > div > div.aui-form-box > form > div > div:nth-child(3) > div.aui-code > img");
            var codePngName = DateTime.Now.ToFileTime().ToString() + ".png";
            var codePngPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ScreenshotImges", codePngName);
            await imageEle.ScreenshotAsync(new LocatorScreenshotOptions { Path = codePngPath });

            //验证码图片识别
            var address = "http://localhost:5252/api/hellos/upload";
            var httpClient = new HttpClient();
            var fileInfo = new FileInfo(codePngPath);
            using (var stream = fileInfo.OpenRead())
            {
                var content = new MultipartFormDataContent
                {
                    { new StreamContent(stream,(int)stream.Length), "file", fileInfo.Name }
                };
                var httpResponseMessage = await httpClient.PostAsync(address, content);
                if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    var jsonResult = await httpResponseMessage.Content.ReadAsStringAsync();
                }
            }

            //获取识别结果
            var code = "";
            address = "http://localhost:5252/api/hellos/page";
          
            var jsonContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                PageIndex = 1,
                PageSize = 1,
                Name=""
            }), Encoding.UTF8, "application/json");
            var responseMessage = await httpClient.PostAsync(address, jsonContent);
            if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var jsonResult = await responseMessage.Content.ReadAsStringAsync();
                var ocrResponse=Newtonsoft.Json.JsonConvert.DeserializeObject<OcrResponse>(jsonResult);
                code = ocrResponse.Data.Items.First().Name;
            }

            await page.GetByRole(AriaRole.Textbox, new() { NameString = "验证码" }).FillAsync(code);
            System.Threading.Thread.Sleep(3000);
            await page.GetByRole(AriaRole.Button, new() { NameString = "登 录" }).ClickAsync();
            await page.WaitForURLAsync("https://boot3.jeecg.com/dashboard/analysis");
            await page.WaitForURLAsync("https://boot3.jeecg.com/dashboard/analysis");

        }
    }


    public class OcrResponse
    {
        public bool Success { get; set; }
        public OcrData Data { get; set; }

        public string Message { get; set; }
    }

    public class OcrData
    {
        [JsonProperty("data")]
        public List<OcrItem> Items { get; set; }
    }

    public class OcrItem
    {
        public string Name { get; set; }
    }

}

运行效果:

相关推荐
caishenzhibiao3 分钟前
降雨带波段点差 同花顺期货通指标
java·c语言·c#
半夢半醒133 分钟前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加菱形、平行四边形、圆角矩形,文本居中显示
算法·c#·流程图
蓝斯4974 小时前
C# 调用邮箱应用发送带附件的邮件
网络·c#·github
BuHuaX4 小时前
U3D抖微小游戏开发流程 (一)
unity·c#·游戏引擎·游戏策划
脚踏实地皮皮晨5 小时前
003003002_WPF Grid 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio
凯丨15 小时前
AI 蠕虫来了:恶意文档如何通过 Copilot for Word 自我传播?
人工智能·c#·copilot
Aaron - Wistron16 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
骊城英雄17 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰17 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#