使用CEFSharp设置下拉列表的值不会显示

问题描述 投票:1回答:1

我尝试使用C#和CefSharp在Winform上显示Intranet html页面。我可以使用ChromiumWebBrowser的实例打开html页面。我也成功地填写了一些文本字段,但是设置下拉列表的值似乎不起作用。下面的html片段显示了我想要修改的下拉列表sbo_company和文本字段sbo_user。

    <table class="sbo_layer">
    	<tr>
    		<td>Company</td>
    		<td>
    			<input value="Refresh" id="refresh_company" type="button" style="width:66px">
			<select id="sbo_company" style="width:63%"><option value="SBODEMOCL" selected="">SBODEMOCL</option><option value="SBODEMOAR">SBODEMOAR</option></select>									
			<input type="text" id="sbo_custom_company" style="display:none">
		</td>
	</tr>
	<tr>
		<td>User ID</td>
		<td><input type="text" id="sbo_user"></td>
	</tr>
</tbody></table>

设置sbo_user的I值有效,但是设置sbo_company不会影响页面。我尝试在C#中执行以下操作:

public void InitializeChromium()
{
    CefSettings settings = new CefSettings();
    // Initialize cef with the provided settings

    Cef.Initialize(settings);
    // Create a browser component
    chromeBrowser = new ChromiumWebBrowser("http://x.x.x.x/");
    // Add it to the form and fill it to the form window.
    this.Controls.Add(chromeBrowser);

    chromeBrowser.Dock = DockStyle.Fill;

    //Wait for the MainFrame to finish loading
    chromeBrowser.FrameLoadEnd += (sender, args) =>
    {
        //Wait for the MainFrame to finish loading
        if (args.Frame.IsMain)
        {
            args.Frame.ExecuteJavaScriptAsync("document.getElementById('sbo_user').value = 'manager';");
            args.Frame.ExecuteJavaScriptAsync("document.getElementById('sbo_company').value = 'SBODEMOAR';");
        }
    };            
}

[当我用chrome打开页面并输入document.getElementById('sbo_company')。value ='SBODEMOAR';在开发人员工具的控制台中可以正常工作。如何使用CefSharp进行设置?但是,如果我这样添加Thread.Sleep,它就可以工作:

if (args.Frame.IsMain)
                {
                    Thread.Sleep(2000);
                    args.Frame.ExecuteJavaScriptAsync("document.getElementById('sbo_user').value = 'manager';");
                    args.Frame.ExecuteJavaScriptAsync("document.getElementById('sbo_company').value = 'SBODEMOAR';");
                }

是否有更清洁的解决方案?这似乎是一些计时问题。

c# getelementbyid cefsharp
1个回答
0
投票

它对我有用,希望对您有帮助

string script = @"var tm = 'value select';
                  var select = document.getElementById('idOfSelect');
                  for (var i = 0; i < select.children.length; i++)
                  {
                      var v = select.children[i].text;
                      var cp = tm.localeCompare(v);
                      if (cp == 0)
                      {
                           select.children[i].selected = true;
                      }
                  }";
browser.EvaluateScriptAsync(script);
© www.soinside.com 2019 - 2024. All rights reserved.