【发布时间】:2019-08-06 08:41:41
【问题描述】:
我的解决方案中有一个 chromiumBrowser(cefsharp),我想使用 Google 地图中的搜索栏执行常规的 Google Map 搜索。
我基本上没有Javascript/Lambda 的经验,但我已经尽我所能用谷歌搜索,只是想出阅读搜索框中的内容,填写它,然后click()ing 旁边的搜索按钮。
问题是,它有时只需要first click()。谷歌地图似乎需要在搜索栏上至少有一个真正的键盘输入更改事件。
我需要搜索而不是 load(URL),因为搜索会平滑滚动到新目的地,而 load(URL) 会出现白屏,然后跳转到目的地。
我尝试过使用模拟协调鼠标点击(我可以打开菜单面板,是吗?)但没有触发searchbox triggers。我已经在搜索框上尝试了 click(),但我无法使用我有限的 JS/HTML 知识获得 keydown 或 keypress。
private void button1_Click(object sender, EventArgs e)
{
cBrowser.ExecuteScriptAsync("document.getElementById('searchboxinput').value='" + textBox1.Text + "'");
}
private void button2_Click(object sender, EventArgs e)
{
cBrowser.ExecuteScriptAsync("document.getElementById('searchboxinput').focus({})");
cBrowser.ExecuteScriptAsync("document.getElementById('searchboxinput').places_changed()");
cBrowser.ExecuteScriptAsync("document.getElementById('searchboxinput').focus({})");
}
private void button3_Click(object sender, EventArgs e)
{
cBrowser.ExecuteScriptAsync("document.getElementById('searchbox-searchbutton').click()");
}
private void button4_Click(object sender, EventArgs e)
{
int x = 25; int y = 60;
cBrowser.GetBrowser().GetHost().SendMouseClickEvent(x, y, MouseButtonType.Left, false, 1, CefEventFlags.None);
Thread.Sleep(15);
cBrowser.GetBrowser().GetHost().SendMouseClickEvent(x, y, MouseButtonType.Left, true, 1, CefEventFlags.None);
}
所以它需要first click()。但是第二个和之后,按钮 click() 什么都不做。就好像搜索框中的新输入从未发生过,并且搜索框恢复了一样。
只有当我真正点击 searchBox 并让触发器飞起来时,才会使用按钮 click()。有人可以帮我找出触发搜索框基本要求的代码,以便我可以单击()搜索框搜索到下一个区域吗?
更新 使用How do I view events fired on an element in Chrome DevTools? 我想我有这些事件,但现在我如何将相同的事件发送到谷歌地图并让它级联并运行所有其他功能作为常规点击/类型触发器?
textInput > TextEvent {isTrusted: true, data: "a", view: Window, detail: 0, sourceCapabilities: null, …}
input > InputEvent {isTrusted: true, oM: "input", data: "a", isComposing: false, inputType: "insertText", …}
我假设我必须使用 textEvent/inputEvent 对象发送一个 textInput/input 事件。我不能在 C# 中创建两者,所以我想我必须以某种方式将它们全部集中到一个 js 脚本、元素、事件和事件对象中?
我想我必须做这样的事情。但是默认的InputEvent超大,我也找不到构造函数。
cBrowser.ExecuteScriptAsync("document.getElementById('searchboxinput').dispatchEvent(new InputEvent(isTrusted=true, data=\"f\", isComposing=false, inputType=\"insertText\", dataTransfer=null))");
"Uncaught TypeError: Failed to construct 'InputEvent': parameter 2 ('eventInitDict') is not an object.", source: about:blank (1)
我认为 data="f" 不正确并且我必须为其提供 eventInitDict 是否是错误的?我什至可以从哪里获得或找到它!
有没有人有可以触发这个的想法或示例代码?即使只是一个 JS 代码也可能会有所帮助(也许可以将其插入到 ExecuteScriptAsync 中?)。
【问题讨论】:
-
您可以使用
DevTools来帮助您进行调试,请参阅github.com/cefsharp/CefSharp/wiki/… -
使用stackoverflow.com/questions/10213703/… 我想我找到了事件,但现在我如何发送相同的事件? textInput TextEvent {isTrusted: true, data: "a", view: Window, detail: 0, sourceCapabilities: null, ...} 我正在寻找上述事件。所以我假设我必须发送一个带有 textEvent 对象的 textInput 事件。我不能在 C# 中创建,所以我想我必须以某种方式将它集中到一个 js 脚本、元素、事件和事件对象中?
标签: javascript c# winforms google-maps cefsharp