第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

CefSharp網(wǎng)頁元素點(diǎn)擊

CefSharp網(wǎng)頁元素點(diǎn)擊

C#
躍然一笑 2021-11-14 17:06:49
我正在嘗試對(duì)某些頁面元素(如 btn 或鏈接)進(jìn)行簡單的點(diǎn)擊。我編寫了 2 個(gè)通過 xpath 和 CSS 選擇器單擊的函數(shù)。這兩個(gè)功能在瀏覽器的開發(fā)者控制臺(tái)中都可以完美運(yùn)行,但在 CEF 中部分不起作用。代碼完美地點(diǎn)擊來自開發(fā)者控制臺(tái)和 Cef 的簡單鏈接代碼完美地點(diǎn)擊了來自開發(fā)者控制臺(tái)的確切按鈕,但不會(huì)從 CEF 中點(diǎn)擊。出于某種原因,它只是忽略它......怎么會(huì)這樣?js代碼完全一樣!...    public void Click(string xpath)    {        var js = "document.evaluate(\"" + xpath + "\", document, null, XPathResult.ANY_TYPE, null).iterateNext().click();";        EvaluateJavascript(js);    }    public void ClickCss(string css)    {        var js = "document.querySelector('"+ css + "').click()";        EvaluateJavascript(js);    }    public async Task EvaluateJavascript(string script)    {        JavascriptResponse javascriptResponse = await Browser.GetMainFrame().EvaluateScriptAsync(script);        if (!javascriptResponse.Success)        {            throw new JavascriptException(javascriptResponse.Message);        }    }細(xì)節(jié): 使用的點(diǎn)擊代碼:_browser.ClickCss("#upload-container a");再一次:相同的 js 代碼在瀏覽器開發(fā)控制臺(tái)中完美運(yùn)行,但由于某種原因在 CEF 中不起作用。順便說一下,我已經(jīng)在 Chrome 中測試了 JS 代碼。所以 WebEngine 在這兩種情況下都是一樣的。PS:也適用于我模擬將某些特定文件拖放到某些特定 Web 元素的過程。但是我沒有找到任何關(guān)于此的信息,不適用于 Cef,不適用于 Js,不適用于 JQuery ... =(
查看完整描述

2 回答

?
慕娘9325324

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);

}


查看完整回答
反對(duì) 回復(fù) 2021-11-14
?
狐的傳說

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)事件


查看完整回答
反對(duì) 回復(fù) 2021-11-14
  • 2 回答
  • 0 關(guān)注
  • 2337 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)