2 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
問題在于 JS 代碼的安全限制。
問題的解決方法是:
使用 JS 代碼獲取按鈕/鏈接的坐標(biāo)
使用 CEF 模擬點(diǎn)擊操作:
public void MouseClick(int x, int y)
{
Browser.GetBrowser().GetHost().SendMouseClickEvent(x, y, MouseButtonType.Left, false, 1, CefEventFlags.None);
Thread.Sleep(15);
Browser.GetBrowser().GetHost().SendMouseClickEvent(x, y, MouseButtonType.Left, true, 1, CefEventFlags.None);
}

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
上面的答案工作正常。我只是想補(bǔ)充一些我認(rèn)為非常重要的信息......
獲取 DOM 元素的位置,并模擬鼠標(biāo)點(diǎn)擊(和移動(dòng)):
// get button's position
string jsonString = null;
var jsReponse = await chromiumWebBrowser1.EvaluateScriptAsync(
@"(function () {
var bnt = document.getElementById('pnnext');
bnt.focus();
var bntRect = bnt.getBoundingClientRect();
return JSON.stringify({ x: bntRect.left, y: bntRect.top });
})();"
);
if (jsReponse.Success && jsReponse.Result != null)
jsonString = (string)jsReponse.Result;
// send mouse click event
if (jsonString != null)
{
var jsonObject = JObject.Parse(jsonString);
var xPosition = (int)jsonObject["x"] + 1; // add +1 pixel to the click position
var yPosition = (int)jsonObject["y"] + 1; // add +1 pixel to the click position
var host = chromiumWebBrowser1.GetBrowser().GetHost();
host.SendMouseMoveEvent(xPosition, yPosition, false, CefEventFlags.None);
Thread.Sleep(50);
host.SendMouseClickEvent(xPosition, yPosition, MouseButtonType.Left, false, 1, CefEventFlags.None);
Thread.Sleep(50);
host.SendMouseClickEvent(xPosition, yPosition, MouseButtonType.Left, true, 1, CefEventFlags.None);
}
1 -到目前為止,在 CefSharp 上獲取 DOM 元素位置的最佳方法是執(zhí)行自定義 JavaScript并解析結(jié)果。這就是上面代碼第一段的目的。它通過其 ID(在加載的網(wǎng)頁的 HTML 結(jié)構(gòu)中定義)獲取元素,然后獲取其相對(duì)于視口的位置,然后將其返回給 C# 代碼?;氐?C#,我們使用 Newtonsoft 的JObject.Parse方法解析它。
2 - 單擊發(fā)生在指定的x和y坐標(biāo)處,但要知道該坐標(biāo)是相對(duì)于瀏覽器組件窗口(視口)的,這一點(diǎn)非常重要。因此,如果您的 Web 瀏覽器組件只有100px高,并且您發(fā)送一個(gè)單擊命令進(jìn)行y協(xié)調(diào),因?yàn)?50px單擊將發(fā)生但在 Web 瀏覽器之外,因此不在網(wǎng)頁中。
3 - 查看點(diǎn)擊是否真的被執(zhí)行的一個(gè)技巧,以及確切的位置,是將其從 更改MouseButtonType.Left為MouseButtonType.Right。這樣做,如果網(wǎng)頁沒有限制,你就能看到“鼠標(biāo)右鍵菜單”。如果您在外部單擊,您可能會(huì)在操作系統(tǒng)上看到“鼠標(biāo)右鍵菜單” (此處為 Windows,我能夠看到我使用此技巧在組件外部單擊)。
4 - 有時(shí)(特別是在反爬蟲環(huán)境中)還需要模擬鼠標(biāo)移動(dòng)。我使用SendMouseMoveEvent第一行中所示的方法進(jìn)行操作。
5 - 如果您在組件中加載了一個(gè)非常高的頁面,并且您需要單擊真正超出組件邊界的按鈕,則需要滾動(dòng)網(wǎng)頁。您可以按照上面的示例代碼執(zhí)行一些 JavaScript,或者您可以使用以下代碼執(zhí)行此操作:
模擬鼠標(biāo)滾動(dòng)(鼠標(biāo)滾輪事件):
// 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);
參數(shù)的最大部分是不言自明的,但這里最重要的部分是第3和第4個(gè)參數(shù),分別是“滾動(dòng)X多少”和“Y滾動(dòng)多少”。要向下滾動(dòng),只需使用負(fù)值,向上滾動(dòng)則使用正值。在上面的代碼中,它水平(x軸)不滾動(dòng)(零像素),垂直(y軸)向下滾動(dòng) 100 像素。
您可以在 a 中使用此代碼loop來滾動(dòng)您需要的數(shù)量。我將它與 JavaScript 代碼結(jié)合使用來檢索按鈕的位置,檢測它是否在視口上,或者我是否需要再次發(fā)送滾動(dòng)事件
- 2 回答
- 0 關(guān)注
- 2337 瀏覽
添加回答
舉報(bào)