使用javascript从浏览器获取文本框值

使用javascript从浏览器获取文本框值,javascript,c#,winforms,chromium-embedded,cefsharp,Javascript,C#,Winforms,Chromium Embedded,Cefsharp,我有一个winforms应用程序,它有一个ChromiumWebBrowser控件和一些基本的windows控件。我希望能够单击按钮,调用javascript在浏览器中获取文本框的值,并将返回的值复制到winforms应用程序中的文本框。这是我的密码: string script = "(function() {return document.getElementById('Email');})();"; string returnValue = ""; var task = browser

我有一个winforms应用程序,它有一个ChromiumWebBrowser控件和一些基本的windows控件。我希望能够单击按钮,调用javascript在浏览器中获取文本框的值,并将返回的值复制到winforms应用程序中的文本框。这是我的密码:

string script = "(function() {return document.getElementById('Email');})();";

string returnValue = "";

var task = browser.EvaluateScriptAsync(script, new { });

await task.ContinueWith(t =>
    {
        if (!t.IsFaulted)
        {
            var response = t.Result;
            if (response.Success && response.Result != null)
            {
                returnValue = (string)response.Result;
            }
        }
    });

txtTarget.Text = returnValue;
然而,返回的结果只是“{}”。我在Chrome中加载了相同的网页,并在开发工具中执行了相同的javascript,得到了预期的textbox值

我看到的演示有示例代码,只是“return1+1;”,当我尝试返回值“2”而不是“{}”时。有趣的是,当我尝试

string script = "(function() {return 'hello';})()";
我仍然得到“{}”,几乎就好像这不适用于字符串


我对这件事挠头已经有一段时间了,还没能想出解决办法。我是犯了一个非常基本的语法错误,还是发生了更复杂的事情?

所以我想我已经解决了:

string script = "(function() {return document.getElementById('Email').value;})();";
string returnValue = "";

var task = browser.EvaluateScriptAsync(script);

await task.ContinueWith(t =>
{
    if (!t.IsFaulted)
    {
        var response = t.Result;

        if (response.Success && response.Result != null)
        {
            returnValue = response.Result.ToString();
        }
    }
});  

txtTarget.Text = returnValue;
从EvaluateScript异步中删除args对象似乎可以解决此问题。不确定问题出在哪里-可能是它试图使用空args对象运行javascript函数,而不应该使用任何参数


不管怎样,现在问题已经解决了。

所以我想我已经解决了:

string script = "(function() {return document.getElementById('Email').value;})();";
string returnValue = "";

var task = browser.EvaluateScriptAsync(script);

await task.ContinueWith(t =>
{
    if (!t.IsFaulted)
    {
        var response = t.Result;

        if (response.Success && response.Result != null)
        {
            returnValue = response.Result.ToString();
        }
    }
});  

txtTarget.Text = returnValue;
   public void SetElementValueById(ChromiumWebBrowser myCwb, string eltId, string setValue)
    {         
        string script = string.Format("(function() {{document.getElementById('{0}').value='{1}';}})()", eltId, setValue);
        myCwb.ExecuteScriptAsync(script);            
    }

    public string GetElementValueById(ChromiumWebBrowser myCwb, string eltId)
    {        
        string script = string.Format("(function() {{return document.getElementById('{0}').value;}})();",
             eltId);
        JavascriptResponse jr = myCwb.EvaluateScriptAsync(script).Result;
        return jr.Result.ToString();
    }
从EvaluateScript异步中删除args对象似乎可以解决此问题。不确定问题出在哪里-可能是它试图使用空args对象运行javascript函数,而不应该使用任何参数


不管是哪种方式,现在都解决了。

您可能太早执行脚本,有关详细信息,请参阅《通用使用指南》。脚本是在单击按钮时执行的,因此,如果我可以等待很长时间,就无法加载页面是没有意义的。您可能太早执行脚本,有关详细信息,请参阅《常规使用指南》。该脚本是在单击按钮时执行的,因此,如果我可以等待
evaluateScript async
返回
任务,则无法加载页面是毫无意义的,您必须
等待
或使用
ContinueWith
才能可靠地获得结果。此代码将完全不可靠。请添加一些explanation@amaitland--它不是“任务异步”--它返回void,而不是
task
。它是“异步”的,就像“开始…”、“结束…”TPL模式一样。“他拥有它的方式就是它应该具备的方式。@Andy EvaluateScript Async返回一个任务,其中as ExecuteScriptAsync是一个void方法。它们的名字相似,行为非常不同。EvaluateScript Async应异步使用,不支持对结果进行阻塞。Chromium线程模型的复杂性使得在调用错误的线程时很容易死锁。@amaitland--我没有看到第二种方法。我只看了第一眼。我已更正。
evaluateScript async
返回一个
任务
,您必须
等待
或使用
继续
才能可靠地获得结果。此代码将完全不可靠。请添加一些explanation@amaitland--它不是“任务异步”--它返回void,而不是
task
。它是“异步”的,就像“开始…”、“结束…”TPL模式一样。“他拥有它的方式就是它应该具备的方式。@Andy EvaluateScript Async返回一个任务,其中as ExecuteScriptAsync是一个void方法。它们的名字相似,行为非常不同。EvaluateScript Async应异步使用,不支持对结果进行阻塞。Chromium线程模型的复杂性使得在调用错误的线程时很容易死锁。@amaitland--我没有看到第二种方法。我只看了第一眼。我被纠正了。
   public void SetElementValueById(ChromiumWebBrowser myCwb, string eltId, string setValue)
    {         
        string script = string.Format("(function() {{document.getElementById('{0}').value='{1}';}})()", eltId, setValue);
        myCwb.ExecuteScriptAsync(script);            
    }

    public string GetElementValueById(ChromiumWebBrowser myCwb, string eltId)
    {        
        string script = string.Format("(function() {{return document.getElementById('{0}').value;}})();",
             eltId);
        JavascriptResponse jr = myCwb.EvaluateScriptAsync(script).Result;
        return jr.Result.ToString();
    }