gecko 浏览器按钮单击不起作用 c#
gecko browser button click doesn't work c#
我厌倦了使用 gecko 网络浏览器模拟 google 搜索。到目前为止,我已经能够转到 google 页面,然后搜索类似这样的内容:
geckoWebBrowser1.Navigate("https://www.google.com/");
await Task.Run(() => CheckDocumentLoaded());
var page = geckoWebBrowser1.Document.GetElementById("lst-ib");
(page as GeckoHtmlElement).Focus();
(page as GeckoInputElement).Value = "something";
现在我只想单击搜索按钮。所以我将其添加到第一部分:
var button = new GeckoButtonElement(geckoWebBrowser1.Document.GetElementById("mKlEF").DomObject);
button.Click();
但有趣的事情发生了。如果我 运行 这段代码在第一部分之后什么都不会发生。但是,如果我创建了一个按钮并将代码放在上面,它就可以正常工作。
private void Button1_Click(object sender, EventArgs e)
{
var button = new GeckoButtonElement(geckoWebBrowser1.Document.GetElementById("mKlEF").DomObject);
button.Click();
return;
}
但我必须手动单击按钮才能使其正常工作。它真的很混乱。我不知道是什么原因造成的!!
注意:
如果你想让代码工作,你必须使用这个用户代理:(Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko)
我不想使用 SendKeys.Send("{ENTER}")
。
如果我以编程方式按下按钮,它也不起作用。
我尝试并在 WPF 应用程序中重新创建了您的场景。
我使用
的 DocumentCompleted 事件让它工作
occurs after the browser has finished parsing a new page and updated the Document property.
我在导航之前订阅了事件侦听器,并在调用处理程序后将其删除。
然后,我调用form
的第一个元素提交搜索。
(_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();
完整代码示例:WPF 应用程序
using Gecko;
using Gecko.DOM;
using System.Windows;
using System.Windows.Forms.Integration;
using System.Linq;
namespace GeckoWpf {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
Gecko.Xpcom.Initialize("Firefox");
}
void browser_DocumentCompleted(object sender, System.EventArgs e) {
//unsubscribe
_browser.DocumentCompleted -= browser_DocumentCompleted;
XPathResult xpathResult = _browser.Document.EvaluateXPath("//div/input");
var foundNodes = xpathResult.GetNodes();
foreach (var node in foundNodes) {
GeckoInputElement txtbox = new GeckoInputElement(node.DomObject);
txtbox.Value = "Mona Lisa"; //add the search term
}
(_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();
}
WindowsFormsHost _host = new WindowsFormsHost();
GeckoWebBrowser _browser = new GeckoWebBrowser();
private void Window_Loaded(object sender, RoutedEventArgs e) {
_browser.DocumentCompleted += browser_DocumentCompleted;
_host.Child = _browser; GridWeb.Children.Add(_host);
_browser.Navigate("https://www.google.com/");
}
}
}
注意:此方法可能不适用于所有页面,因为 DocumentComplete
可能会因各种原因(例如 i/frames、AJAX 和其他动态内容)被触发多次。
PS:尽管如此,您的努力可能会或可能会not be legal。
您可能需要考虑改用 Google's custom search API or alternatives like SerpApi。
我厌倦了使用 gecko 网络浏览器模拟 google 搜索。到目前为止,我已经能够转到 google 页面,然后搜索类似这样的内容:
geckoWebBrowser1.Navigate("https://www.google.com/");
await Task.Run(() => CheckDocumentLoaded());
var page = geckoWebBrowser1.Document.GetElementById("lst-ib");
(page as GeckoHtmlElement).Focus();
(page as GeckoInputElement).Value = "something";
现在我只想单击搜索按钮。所以我将其添加到第一部分:
var button = new GeckoButtonElement(geckoWebBrowser1.Document.GetElementById("mKlEF").DomObject);
button.Click();
但有趣的事情发生了。如果我 运行 这段代码在第一部分之后什么都不会发生。但是,如果我创建了一个按钮并将代码放在上面,它就可以正常工作。
private void Button1_Click(object sender, EventArgs e)
{
var button = new GeckoButtonElement(geckoWebBrowser1.Document.GetElementById("mKlEF").DomObject);
button.Click();
return;
}
但我必须手动单击按钮才能使其正常工作。它真的很混乱。我不知道是什么原因造成的!!
注意:
如果你想让代码工作,你必须使用这个用户代理:
(Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko)
我不想使用
SendKeys.Send("{ENTER}")
。如果我以编程方式按下按钮,它也不起作用。
我尝试并在 WPF 应用程序中重新创建了您的场景。
我使用
的 DocumentCompleted 事件让它工作occurs after the browser has finished parsing a new page and updated the Document property.
我在导航之前订阅了事件侦听器,并在调用处理程序后将其删除。
然后,我调用form
的第一个元素提交搜索。
(_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();
完整代码示例:WPF 应用程序
using Gecko;
using Gecko.DOM;
using System.Windows;
using System.Windows.Forms.Integration;
using System.Linq;
namespace GeckoWpf {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
Gecko.Xpcom.Initialize("Firefox");
}
void browser_DocumentCompleted(object sender, System.EventArgs e) {
//unsubscribe
_browser.DocumentCompleted -= browser_DocumentCompleted;
XPathResult xpathResult = _browser.Document.EvaluateXPath("//div/input");
var foundNodes = xpathResult.GetNodes();
foreach (var node in foundNodes) {
GeckoInputElement txtbox = new GeckoInputElement(node.DomObject);
txtbox.Value = "Mona Lisa"; //add the search term
}
(_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();
}
WindowsFormsHost _host = new WindowsFormsHost();
GeckoWebBrowser _browser = new GeckoWebBrowser();
private void Window_Loaded(object sender, RoutedEventArgs e) {
_browser.DocumentCompleted += browser_DocumentCompleted;
_host.Child = _browser; GridWeb.Children.Add(_host);
_browser.Navigate("https://www.google.com/");
}
}
}
注意:此方法可能不适用于所有页面,因为 DocumentComplete
可能会因各种原因(例如 i/frames、AJAX 和其他动态内容)被触发多次。
PS:尽管如此,您的努力可能会或可能会not be legal。
您可能需要考虑改用 Google's custom search API or alternatives like SerpApi。