以下整理了Cef操纵dom元素的常用方法,比如获取元素的位置、元素的点击、输入框的输入、模拟滑块移动等等操作。

internal class DomHelper
{
    /// <summary>
    /// 元素点击
    /// </summary>
    /// <param name="browser"></param>
    /// <param name="elementRect"></param>
    public static async Task ElementClick(IBrowser browser, JObject elementRect)
    {
        if (elementRect["x"] != null && elementRect["y"] != null)
        {
            IBrowserHost host = browser.GetHost();

            int x = Convert.ToInt32(elementRect["x"]) + 6;
            int y = Convert.ToInt32(elementRect["y"]) + 2;

            //模拟鼠标的移动
            host.SendMouseMoveEvent(x, y, false, CefEventFlags.None);
            await Task.Delay(500);

            //模拟鼠标左键按下
            MouseEvent mouseEvent = new MouseEvent(x, y, CefEventFlags.None);
            browser.GetHost().SendMouseClickEvent(mouseEvent, MouseButtonType.Left, false, 1);
            await Task.Delay(100);

            //模拟鼠标左键松开
            browser.GetHost().SendMouseClickEvent(mouseEvent, MouseButtonType.Left, true, 1);
        }
    }

    /// <summary>
    /// 元素滑动
    /// </summary>
    /// <param name="browser"></param>
    /// <param name="elementRect"></param>
    /// <param name="spanX">要滑动的区间x</param>
    /// <param name="spanY">要滑动的区间y</param>
    public static async Task ElementMove(IBrowser browser, JObject elementRect, int spanX, int spanY)
    {
        if (elementRect != null && elementRect["x"] != null && elementRect["y"] != null)
        {
            IBrowserHost host = browser.GetHost();

            int x = Convert.ToInt32(elementRect["x"]) + 6;
            int y = Convert.ToInt32(elementRect["y"]) + 2;
            Console.WriteLine("x:{0},y:{1}", x, y);

            //模拟鼠标的点击
            MouseEvent mouseEvent = new MouseEvent(x, y, CefEventFlags.LeftMouseButton);
            host.SendMouseClickEvent(mouseEvent, MouseButtonType.Left, false, 1);
            await Task.Delay(500);

            List<int> removeInt = new List<int>
            {
                10,
                50,
                30,
                20,
                30,
                40,
                30,
                40,
                60,
                30
            };
            foreach (int item in removeInt)
            {
                x += item;
                Thread.Sleep(100);
                host.SendMouseMoveEvent(x, y, false, CefEventFlags.LeftMouseButton);
            }

            //模拟鼠标松开
            host.SendMouseClickEvent(mouseEvent, MouseButtonType.Left, true, 1);
        }
    }

    public static async Task MouseWheelRoll(IBrowser browser, int x, int y, int deltaX, int deltaY)
    {
        IBrowserHost host = browser.GetHost();

        //模拟鼠标的移动
        host.SendMouseMoveEvent(x, y, false, CefEventFlags.None);
        await Task.Delay(630);

        MouseEvent mouseEvent = new MouseEvent(x, y, CefEventFlags.None);
        host.SendMouseWheelEvent(mouseEvent, deltaX, deltaY);
        await Task.Delay(370);
    }

    /// <summary>
    /// 在元素中输入内容
    /// </summary>
    /// <param name="browser"></param>
    /// <param name="elementRect"></param>
    /// <param name="text"></param>
    public static async Task<bool> ElementInput(IBrowser browser, string js_path, string text)
    {
        IBrowserHost host = browser.GetHost();
        string js = "(function(){var ele = " + js_path + "; if (ele != null){ ele.focus();}})();";
        JavascriptResponse response = await browser.EvaluateScriptAsync(js);
        char[] chars = text.ToArray();
        foreach(char c in chars)
        {
            KeyEvent keyEvent = new KeyEvent
            {
                Type = KeyEventType.Char,
                WindowsKeyCode = c
            };
            host.SendKeyEvent(keyEvent);
            await Task.Delay(256);
        }
        return response.Success;
    }

    /// <summary>
    /// 通过元素选择器来获取元素的位置
    /// </summary>
    /// <param name="browser"></param>
    /// <param name="js_path"></param>
    /// <returns></returns>
    public static async Task<JObject> GetBoundingClientRect(IBrowser browser, string js_path)
    {
        string js = "(function(){ var element = " + js_path + "; if (element != null) { let elementRect = element.getBoundingClientRect(); " +
            "let result = JSON.stringify({ x: elementRect.left, y: elementRect.top, r: elementRect.right, b: elementRect.bottom });" +
            "return result; }; return null; })()";
        JavascriptResponse response = await browser.EvaluateScriptAsync(js);
        if (response.Success && response.Result != null)
        {
            JObject elementRect = JsonConvert.DeserializeObject<JObject>(response.Result.ToString());
            if (elementRect != null)
            {
                return elementRect;
            }
        }
        return null;
    }
}
最后修改:2023 年 08 月 04 日
如果觉得我的文章对你有用,请随意赞赏