代码之家  ›  专栏  ›  技术社区  ›  Mohammad

gecko浏览器按钮点击不起作用c#

  •  1
  • Mohammad  · 技术社区  · 7 年前

    我厌倦了用gecko浏览器来模仿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;
    }
    

    但我必须手动点击按钮才能工作。真让人困惑。我不知道这是什么原因!!

    1. 如果要使代码正常工作,必须使用此用户代理: (Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko)

    2. 我不想使用 SendKeys.Send("{ENTER}") .

    3. 如果我按按钮的程序也不工作。

    1 回复  |  直到 7 年前
        1
  •  2
  •   wp78de    7 年前

    我在一个WPF应用程序中重新创建了你的场景。

    DocumentCompleted 事件

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

    然后,我调用 form 提交搜索。

    (_browser.Document.GetElementsByTagName("form").First() as GeckoFormElement).submit();
    

    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和其他动态内容)。

    附言:尽管如此,你的努力可能会失败,也可能会失败 not be legal .
    你可以考虑使用 Google's custom search API 或者像这样的替代品 SerpApi

    推荐文章