Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
壁虎浏览器按钮点击不';t工作c#_C#_Webbrowser Control_Gecko_Geckofx - Fatal编程技术网

壁虎浏览器按钮点击不';t工作c#

壁虎浏览器按钮点击不';t工作c#,c#,webbrowser-control,gecko,geckofx,C#,Webbrowser Control,Gecko,Geckofx,我已经厌倦了用GeckoWeb浏览器模拟谷歌搜索。到目前为止,我已经能够进入谷歌页面,然后搜索如下内容: geckoWebBrowser1.Navigate("https://www.google.com/"); await Task.Run(() => CheckDocumentLoaded()); var page = geckoWebBrowser1.Document.GetElementById("lst-ib"); (page as GeckoH

我已经厌倦了用GeckoWeb浏览器模拟谷歌搜索。到目前为止,我已经能够进入谷歌页面,然后搜索如下内容:

    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;
}
但我必须手动点击按钮才能让它工作。真让人困惑。我不知道这是什么原因

注意:

  • 如果你想让代码像Gecko一样工作,你必须使用这个用户代理:
    (Mozilla/5.0(Windows NT 10.0;WOW64;Trident/7.0;rv:11.0)

  • 我不想使用
    SendKeys.Send(“{ENTER}”)

  • 如果我以编程方式按下按钮,它也不会工作


  • 我在WPF应用程序中玩过并重新创建了您的场景

    我用那个事件让它工作了

    在浏览器完成对新页面的分析并更新文档属性后发生

    我在导航之前订阅事件侦听器,并在调用处理程序后将其删除

    然后,我调用
    表单的第一个元素来提交搜索

    (_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:尽管如此,你的努力可能会,也可能会。

    您可能想考虑使用或替代类似的选项。

    如果“MKELF”是一个按钮,那么您应该能够将GETKEYBYNIDID返回值转换为GECKButton元素,而不是创建另一个。不过,我怀疑这是你问题的原因。不要关注lst ib元素。2.关注按钮。亲爱的@Tom。我试过了,但没有成功。我相信这是由谷歌首页的AJAX特性造成的。