以上的答案已经可以正常运作。我只想补充一些我认为非常重要的信息...
模拟鼠标点击(和移动):
var wbHost = chromiumWebBrowser1.GetBrowser().GetHost();
int xPosition = 100;
int yPosition = 300;
wbHost.SendMouseMoveEvent(xPosition, yPosition, false, CefEventFlags.None);
Thread.Sleep(50);
wbHost.SendMouseClickEvent(xPosition, yPosition, MouseButtonType.Left, false, 1, CefEventFlags.None);
Thread.Sleep(50);
wbHost.SendMouseClickEvent(xPosition, yPosition, MouseButtonType.Left, true, 1, CefEventFlags.None);
1 - 有时候(尤其是在反爬虫环境下),还需要模拟鼠标移动。我使用SendMouseMoveEvent
方法来完成,如第一行所示。
2 - 点击发生在指定的x
和y
坐标,但非常重要的是,这些坐标是相对于浏览器组件窗口(视口)的。因此,如果您的Web浏览器组件只有100px
高,并且您将点击命令发送到y
坐标为150px
,则单击将发生但在Web浏览器之外,因此不在Web页面中。
3 - 查看是否真正执行了单击操作以及确切位置的一个技巧是将其从MouseButtonType.Left
更改为MouseButtonType.Right
。如果没有网页上的限制,则可以通过执行此操作查看“鼠标右键菜单”。如果您正在单击外部,则很可能会在操作系统(我在Windows上使用此技巧能够看到我在组件之外单击)上看到“鼠标右键菜单”。
4 - 在SendMouseClickEvent
中的true
和false
分别表示发送“鼠标按钮单击向下”事件和“鼠标按钮单击向上”事件。
5 - 要获取DOM中对象的位置,可以使用我在这里的回答方法:
CefSharp网页元素点击
6 - 因此,如果您在组件中加载了一个非常高的页面,并且需要单击位于组件边界之外的按钮,则需要滚动Web页面。您可以使用以下代码来完成:
模拟鼠标滚动(鼠标滚轮事件):
// send scroll command
// (mouse position X, mouse position Y, how much to scroll X, how much to scroll Y, events)
chromiumWebBrowser1.GetBrowser().GetHost().SendMouseWheelEvent(10, 10, 0, -100, CefEventFlags.None);
Thread.Sleep(300);
大部分参数都不需要解释,但这里最重要的是第三和第四个参数,分别是“向右滚动多少像素”和“向下滚动多少像素”。向下滚动请使用负值,向上滚动请使用正值。在上面的代码中,它水平(x
轴)没有滚动任何东西(零像素),垂直向下滚动了100像素(y
轴)。
您可以在loop
中使用此代码来滚动所需的距离。我将其与JavaScript代码配合使用,以检索按钮的位置,以便检测是否在视口内,或者是否需要再次发送滚动事件。
CefSharp.Wpf.Example
应用程序并在鼠标点击方法中设置断点以查看它的操作?我记得你需要发送两个事件,一个按下再加上一个抬起。键盘按键同理。 - amaitland