>

CEFSharp C #에서 처음으로 작업 중이며 브라우저에서 browser 이외의 작업을 수행하는 방법을 알아내는 데 어려움을 겪고 있습니다 .Load ( ""); 몇 시간 동안 많은 웹 사이트를 검색했지만 아무도 답을 얻지 못한 것 같습니다. 웹 사이트 요소가 마치 C # 양식 컨트롤 인 것처럼 간단하게 액세스하려고합니다. 나는 광범위한 질문을하지 말아야하는데 ... browser.Click("/*elementName*/") 와 같은 것을 어떻게 할 것인가 ? 또한 browser.TextBox1.Text = "blah"; 와 같은 것을 할 수있는 방법이 있습니까? ?

@ 짐 W

지금까지의 코드 : 2018 년 6 월 6 일 오후 4시 29 분에 업데이트

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
namespace WebAppWorkAround
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeChromium();
        }
        List<string> classList = new List<string>();
        public ChromiumWebBrowser chromeBrowser;
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
        }
        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            Cef.Initialize(settings);
            chromeBrowser = new ChromiumWebBrowser("https://en.wikipedia.org/wiki/Main_Page");
            this.panel1.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
        }
        public string extract;
        private void button1_Click(object sender, EventArgs e)
        {
            string EvaluateJavaScriptResult;
            var frame = chromeBrowser.GetMainFrame();
            var task = frame.EvaluateScriptAsync("(function() { return document.getElementById('aaa').value; })();", null);
            task.ContinueWith(t =>
            {
                if (!t.IsFaulted)
                {
                    var response = t.Result;
                    EvaluateJavaScriptResult = response.Success ? (response.Result ?? "null") : response.Message;
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());


        }
    }
}

오류 :

오류 CS1061 'Task'에 'Result'에 대한 정의가 포함되어 있지 않으며 'Task'유형의 첫 번째 인수를 승인하는 확장 메소드 'Result'가 없습니다 (사용 지시문 또는 어셈블리 참조가 누락 되었습니까?) ( 61 행)

오류 CS0266 'object'유형을 'string'으로 암시 적으로 변환 할 수 없습니다. 명시적인 전환이 존재합니다 (전송이 누락 되었습니까?) (62 행)

  • 답변 # 1

    전화하는 것만 큼 간단하지 않은 것 같습니다

    browser.TextBox1.Text = "blah";
    
    

    알고 있듯이 CEFSharp은 C # 래퍼에서 Javascript를 실행하는 방법입니다. DOM의 C # 버전이 아닙니다 (필요한 것임).

    Github 위키에서이 코드를 사용해야한다고 말할 것입니다

    string EvaluateJavaScriptResult;
    var frame = chromeBrowser.GetMainFrame();
    var task = frame.EvaluateScriptAsync("(function() { return document.getElementById('<textBoxElementID>').value; })();", null);
    task.ContinueWith(t =>
    {
        if (!t.IsFaulted)
        {
            var response = t.Result;
            EvaluateJavaScriptResult = response.Success ? (response.Result.ToString() ?? "null") : response.Message;
        }
    }, TaskScheduler.FromCurrentSynchronizationContext());
    
    

    그리고 EvaluateJavaScriptResult  텍스트 상자에 텍스트가 있어야합니다.

    완벽한 작업 예제입니다. 디자이너는 패널 (panel1)과 버튼 (button1) 만 있으면됩니다.

    실행하고 검색 상자 (위키 백과)에 무언가를 입력 한 다음 버튼을 누르면 검색 상자의 내용이 담긴 메시지 상자가 나타납니다

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using CefSharp;
    using CefSharp.WinForms;
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                InitializeChromium();
            }
            List<string> classList = new List<string>();
            public ChromiumWebBrowser chromeBrowser;
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
            }
            private void Form1_Load(object sender, EventArgs e)
            {
            }
            private void InitializeChromium()
            {
                CefSettings settings = new CefSettings();
                Cef.Initialize(settings);
                chromeBrowser = new ChromiumWebBrowser("https://en.wikipedia.org/wiki/Main_Page");
                this.panel1.Controls.Add(chromeBrowser);
                chromeBrowser.Dock = DockStyle.Fill;
            }
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                Cef.Shutdown();
            }
            public string extract;
            private void button1_Click(object sender, EventArgs e)
            {
                string EvaluateJavaScriptResult;
                var frame = chromeBrowser.GetMainFrame();
                var task = frame.EvaluateScriptAsync("(function() { return document.getElementById('searchInput').value; })();", null);
                task.ContinueWith(t =>
                {
                    if (!t.IsFaulted)
                    {
                        var response = t.Result;
                        EvaluateJavaScriptResult = response.Success ? (response.Result.ToString() ?? "null") : response.Message;
                        MessageBox.Show(EvaluateJavaScriptResult);
                    }
                }, TaskScheduler.FromCurrentSynchronizationContext());
    
    
            }
    
        }
    }
    
    

  • 이전 css - HTML은 공백을 생성합니다
  • 다음 python - NTP의 root_delay가 측정 된 왕복과 다른 이유는 무엇입니까?