2017-02-09 11 views
1

У меня есть приложение winforms, в котором есть элемент управления ChromiumWebBrowser и некоторые основные элементы управления Windows. Я хочу иметь возможность щелкнуть кнопку, вызвать javascript, чтобы получить значение текстового поля в браузере, и скопировать возвращаемое значение в текстовое поле в приложении winforms. Вот мой код:Получение значений текстового поля из браузера CefSharp с помощью javascript

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 в инструментах dev, и я получил значение текстового поля, как ожидалось.

В демоверсии, на которой я смотрел, был пример кода, просто «return 1 + 1;», и когда я попробовал, я получил значение «2» вместо «{}». Интересно, что когда я попытался

string script = "(function() {return 'hello';})()"; 

Я все еще получаю «{}», как будто это не работает со строками.

Я немного почесывал голову и не мог понять, как это решить. Я делаю очень основную синтаксическую ошибку или что-то более сложное происходит?

+0

Возможно, ваш сценарий слишком рано запускается, см. Общее руководство по использованию. – amaitland

+0

Сценарий выполняется при нажатии кнопки, поэтому не имеет смысла, что страница не может быть загружена, если я могу ждать, пока я хочу – jardantuan

ответ

3

Так что я думаю, что я понял это:

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; 

Удаление арг объекта из EvaluateScriptAsync, казалось, решить проблему. Не уверен, в чем проблема: возможно, он пытался запустить функцию javascript с пустым объектом args, когда он не должен принимать какие-либо параметры?

В любом случае, это разрешено сейчас.