以下整理了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;
}
}
1 条评论
喜剧效果背后暗含深刻社会观察。